如何让容器化Jenkins构建的Docker应用容器运行在Ubuntu 20.04宿主机而非Jenkins容器内部
其实你遇到的问题本质是:Jenkins容器里的Docker命令默认调用的是容器内部的Docker daemon,所以应用容器会被限制在Jenkins容器里运行。要让它直接用宿主机的Docker环境,只需要按下面几步操作就行:
1. 修改Jenkins的docker-compose配置,挂载宿主机Docker资源
编辑你部署Jenkins的docker-compose.yml,给Jenkins服务添加两个关键挂载项:
- 挂载宿主机的Docker socket:
/var/run/docker.sock:/var/run/docker.sock,这会让Jenkins容器里的docker命令直接和宿主机的Docker daemon通信 - 挂载宿主机的Docker客户端(可选但推荐):
/usr/bin/docker:/usr/bin/docker,确保Jenkins容器里的docker版本和宿主机一致,避免兼容性问题
修改后的Jenkins服务配置示例:
services: jenkins: image: jenkins/jenkins:lts ports: - "8080:8080" - "50000:50000" volumes: - jenkins_home:/var/jenkins_home # 新增以下两行挂载 - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker user: root # 先临时用root权限,后续再调整更安全的权限配置
修改完成后重启Jenkins容器:
docker-compose down && docker-compose up -d
2. 处理Docker socket的权限问题(关键)
默认情况下,宿主机的/var/run/docker.sock属于docker用户组,而Jenkins容器里的jenkins用户不在这个组里,会导致执行docker命令时提示权限不足。
你可以选两种方式解决:
方式一(推荐):在Jenkins容器内把
jenkins用户加入docker组
先进入Jenkins容器:docker exec -it <你的Jenkins容器名称> bash然后执行添加组命令:
usermod -aG docker jenkins最后重启Jenkins容器让权限生效。
方式二(临时测试用,不推荐生产环境):直接放宽宿主机Docker socket的权限
chmod 666 /var/run/docker.sock这种方式虽然简单,但存在安全风险,生产环境尽量不用。
3. 处理docker-compose的文件路径同步问题
Jenkins执行docker-compose up时用的是容器内的路径,所以你需要把应用代码所在的目录挂载到Jenkins容器里,确保Jenkins工作区的代码路径和宿主机路径同步。
比如在Jenkins的docker-compose配置里再加一个挂载项:
volumes: # 其他挂载项... - /opt/your-app-code:/var/jenkins_home/workspace/your-app-workspace
这样Jenkins工作区里的代码就和宿主机的/opt/your-app-code目录同步了,执行docker-compose up时,宿主机的Docker daemon会直接用本地路径启动应用容器。
4. 验证效果
重新触发Jenkins任务,等构建和启动命令执行完成后,在宿主机上执行docker ps,就能看到应用容器已经跑在宿主机上了,外部也能正常访问(记得确认应用容器的端口映射配置是否正确)。
内容的提问来源于stack exchange,提问作者Tristate

