赞
踩
配置的目的是使得Jenkins容器可以直接使用宿主机的Docker,从而可以直接使用Docker命令进行本地打包操作,然后推送到Harbor镜像仓库。
如何在docker中执行宿主机的docker操作,我们管它叫docker in docker。
至于为什么要在docker中操作宿主机的docker,优点不言而喻,我们既可以将你的具体需求容器化部署,又不用直接在宿主机上安装(假设我们没有办法在docker中操作宿主机的docker,那么我们只能将这样的软件程序直接安装到宿主机上,这样显然是不利于管理和维护的)。
实现这种需求,其实非常简单,只需要将docker宿主机的docker文件和docker.sock文件挂载到容器中即可,具体为:
cd /usr/local/docker/jenkins_docker/
vi docker-compose.yml
数据卷追加以下配置:
- - /var/run/docker.sock:/var/run/docker.sock
- - /usr/bin/docker:/usr/bin/docker
- - /etc/docker/daemon.json:/etc/docker/daemon.json
完整的配置如下:
- version: "3.1"
- services:
- jenkins:
- image: jenkins/jenkins:2.401.2-lts
- container_name: jenkins
- restart: always
- ports:
- - 8080:8080
- - 50000:50000
- #数据卷,后面的操作会在这个目录下进行操作
- volumes:
- - ./data/:/var/jenkins_home/
- - /var/run/docker.sock:/var/run/docker.sock
- - /usr/bin/docker:/usr/bin/docker
- - /etc/docker/daemon.json:/etc/docker/daemon.json
配置完后重新启动下Jenkins容器
docker-compose up -d
虽然前个步骤我们已经挂载了对应的数据卷,但是会存在一个问题,docker.sock是属于docker用户组的。
ls -l /var/run/docker.sock
只有docker用户组下的用户才有权限操作docker.sock这个文件。
而jenkins容器内的默认用户是jenkins用户,单宿主机是没有叫jenkins这个用户的,所以我们没法直接在宿主机把jenkins用户添加到docker用户组。
幸运的是,容器在内外访问的uid和gid是相同的,也就是容器在访问外部挂载文件的用户和组的唯一标识是完全一样的。
我们先进入宿主机查看docker用户组的ID,如下图,发现ID为981
cat /etc/group | grep docker
接着,我们可以进入jenkins容器中,将jenkins用户添加到docker用户组里。
docker exec -it jenkins bash
ls -l /var/run/docker.sock
从上图中可知,docker.sock的属组是981,由于容器内部没有组id为981的组,所以显示981,而jenkins容器内的默认用户是jenkins用户,所以我们需要创建组id为981的组,把jenkins用户添加到id为981的组,就能满足jenkins容器访问容器外的docker。
创建组id为981的docker用户组:
groupadd -g 981 docker
然后把jenkins用户加入到docker组中:
gpasswd -a jenkins docker
退出容器:exit,并重启jenkins容器
docker restart jenkins
进入Jenkins容器内部使用Docker命令
docker exec -it jenkins bash
进入容器后,执行查看Docker版本的命令
docker version
出现以下信息,证明已经成功配置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。