1. 基础环境 本文基于64位的CentOS 7.2系统,内核版本如下: 图1 宿主机的操作系统内核版本 Docker版本如下: 图2 Docker版本 如需安装Docker,请点击:安装Docker 如需安装Docker加速器,请点击:配置Docker加速器 2.在容器中调用docker命令有以下几种方式 2.1 DooD(Docker-outside-of-Docker) 其实就是运行一个Jenkins镜像的docker容器,这种方式使用socket套接字(一般默认是/var/run/docker.sock文件)和宿主机进行交互,只限于本地通信。不会去监听任何端口。在创建Jenkins镜像时,可以给jenkins用户赋予sudo权限来调用docker命令;或者将jenkins用户加入到docker组,就可以直接在容器中调用docker命令,下文会分别讲到两种情况的Dockerfile的写法。不过相比较于不同的宿主机docker组的不同,使用sudo更具有普适性和可移植性。 2.2 DinD(Docker in Docker) 顾名思义,就是在Docker容器中重新安装一个Docker应用。容器中安装Docker和宿主机安装的Docker是完全没有关联的两个程序。一般情况下,我们想要的只是一个运行于docker的CI/CD环境,我们需要容器内外只有一个docker engine。 DinD显然比我们想要的要复杂的多,而且可能还有一些意想不到的问题会出现。 更详细的了解,请参考下面两篇文章: https://zhuanlan.zhihu.com/p/27208085 https://github.com/jpetazzo/dind 2.3 使用HTTP/HTTPS与Docker Engine通讯 Docker还可以对外暴露Remote API,通过http/https就可以与docker engine进行通信,因为打开Remote API相应的要对外暴露端口,所以相对来说是不安全的。 在Jenkins容器中可以通过配置相应的Docker plugin,并在“系统管理”——>“系统设置”——>“云”中增添响应的Remote API信息。 详细信息请参考: https://docs.docker.com/engine/security/https/ 进过对比,我使用的是第一种方式:DooD。 注意点:请确保宿主机的doeker server已经开启本地套接字访问和远程通信 3.在宿主机上开启本地套接字访问和远程通信 默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进行本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker API进行操作。 如果想在其他主机上操作Docker主机,就需要让Docker守护进程监听一个端口,这样才能实现远程通信。 目前开启本地套接字访问和远程通信有以下两种方式: 3.1 修改/etc/docker/daemon.json 把以下内容添加进json文件中,注意添加前请确认23