将 Docker 套接字挂载到 Jenkins 容器
为什么推荐挂载 Docker 套接字?
挂载 Docker 套接字是将 Jenkins 容器直接与宿主机的 Docker 守护进程通信的一种常见且推荐的方法。这种方法具有以下优点:
- 简单:配置相对简单,无需额外安装 Docker 守护进程。
- 安全:避免使用 Docker-in-Docker(DinD)模式时必须启用的
--privileged
标志,从而减少了安全风险。 - 高效:直接与宿主机的 Docker 守护进程通信,避免了额外的资源开销。
配置步骤
-
修改
docker-compose.yml
文件在 Jenkins 服务的
volumes
部分添加以下行,将 Docker 套接字和(可选的)Docker 客户端二进制文件挂载到 Jenkins 容器:volumes: - /var/run/docker.sock:/var/run/docker.sock # 将 Docker 套接字挂载到容器 - /usr/bin/docker:/usr/bin/docker # 将 Docker 客户端二进制文件挂载到容器(如果没有 Docker 客户端) - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro # ...其他 volumes...
/var/run/docker.sock
:这是 Docker 守护进程监听客户端请求的 Unix 套接字。将其挂载到 Jenkins 容器,Jenkins 容器内的 Docker 客户端将能够与宿主机的 Docker 守护进程通信。/usr/bin/docker
:这是 Docker 客户端二进制文件的位置。如果 Jenkins 镜像中没有 Docker 客户端,则需要挂载这个文件,确保 Jenkins 容器能够使用docker
命令。
-
将
jenkins
用户添加到 Docker 组(在宿主机上)为了让 Jenkins 用户能够访问 Docker 守护进程,需要将
jenkins
用户添加到 Docker 组:sudo usermod -aG docker jenkins
这步操作授予 Jenkins 用户访问 Docker 守护进程的权限。
-
安装 Docker 客户端(如果 Jenkins 镜像未预装)
如果你的 Jenkins 镜像中没有 Docker 客户端,可以在 Jenkins 容器的 shell 中执行以下命令来安装 Docker 客户端:
apt-get update && apt-get install -y docker.io
如果Alpine Linux
apk add --no-cache docker
另外,你也可以通过自定义 Dockerfile 预装 Docker 客户端,确保容器内能够使用docker
命令。 -
重启 Jenkins 服务和 Docker 服务(在宿主机上)
重启 Jenkins 和 Docker 服务以应用配置更改:
sudo systemctl restart jenkins sudo systemctl restart docker
或者,你可以重启主机来完成配置。
-
验证配置
-
进入 Jenkins 容器:
docker exec -it jenkins bash
-
在容器内,运行以下命令检查是否可以访问宿主机上的容器:
docker ps
如果配置正确,你应该能够看到宿主机上正在运行的容器列表。
-
总结
挂载 Docker 套接字是让 Jenkins 容器能够与宿主机的 Docker 守护进程通信的首选方法。通过这种方式,不仅能够避免 DinD 带来的安全风险,还能提升配置的简单性和性能。确保将 Jenkins 用户添加到 Docker 组,并根据需要安装或挂载 Docker 客户端二进制文件。
本文作者: 永生
本文链接: https://yys.zone/detail/?id=389
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
发表评论
评论列表 (0 条评论)
暂无评论,快来抢沙发吧!