咨询基于Docker部署Jenkins并实现Jenkins嵌套Docker的最佳实践
适配你的场景的Jenkins-in-Docker + Docker-in-Jenkins最佳实践
我之前在类似的技术栈上折腾过,给你一套能直接落地的方案——先明确:不推荐真的在Jenkins容器里跑Docker Daemon(即纯Docker-in-Docker),因为会有存储驱动冲突、性能损耗、数据持久化麻烦等问题。更优的方案是让Jenkins容器共享宿主机(你的Ubuntu 16.04虚拟机)的Docker环境,既实现Jenkins的容器化部署,又能在Jenkins里直接调用宿主机的Docker服务。
第一步:搞定Ubuntu 16.04虚拟机的Docker基础环境
- 安装适配Ubuntu 16.04的Docker CE:
# 卸载旧版本(如果存在) sudo apt-get remove docker docker-engine docker.io containerd runc # 配置Docker官方源 sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 安装Docker CE核心组件 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io - 配置免sudo使用Docker(避免后续Jenkins容器操作Docker时权限报错):
sudo usermod -aG docker $USER # 重启虚拟机或重新登录会话生效
第二步:启动Jenkins容器(共享宿主机Docker)
用官方Jenkins LTS镜像,通过挂载宿主机的Docker socket和二进制文件,实现容器内直接调用宿主机Docker服务:
# 创建Jenkins数据持久化目录(防止容器删除后配置、构建数据丢失) mkdir -p ~/jenkins_home # 给目录设置正确权限(容器内Jenkins用户UID固定为1000) sudo chown -R 1000:1000 ~/jenkins_home # 启动Jenkins容器 docker run -d \ --name jenkins \ -p 8080:8080 \ -p 50000:50000 \ -v ~/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/usr/bin/docker \ jenkins/jenkins:lts
关键挂载解释:
-v ~/jenkins_home:/var/jenkins_home:持久化Jenkins的配置、插件、构建历史-v /var/run/docker.sock:/var/run/docker.sock:让容器内Docker客户端连接到宿主机的Docker Daemon-v $(which docker):/usr/bin/docker:直接复用宿主机的Docker二进制文件,无需在容器内重复安装
第三步:解决容器内Docker权限问题
默认情况下,容器内的jenkins用户可能没有权限访问/var/run/docker.sock,需要让它匹配宿主机的docker组权限:
- 先查询宿主机docker组的GID:
getent group docker | cut -d: -f3 # Ubuntu 16.04默认输出一般是999 - 修改Jenkins容器内的用户组ID,匹配宿主机的docker组GID:
# 进入Jenkins容器 docker exec -it jenkins bash # 替换999为你查到的真实GID groupmod -g 999 docker usermod -aG docker jenkins # 退出容器后重启Jenkins生效 exit docker restart jenkins
第四步:Jenkins内部配置与Docker使用
- 初始化Jenkins:在本地OS X浏览器输入
http://<Ubuntu虚拟机IP>:8080,从~/jenkins_home/secrets/initialAdminPassword获取初始密码,完成插件安装(选择推荐插件即可)。 - 安装核心插件:额外安装
Git Plugin(拉取你的代码)、Docker Pipeline Plugin(简化Pipeline中的Docker操作),以及你应用栈需要的构建插件(比如Maven、Node.js等)。 - 示例Pipeline(以Java项目为例):
pipeline { agent any stages { stage('拉取代码') { steps { git url: '你的远程代码仓库地址', branch: 'main' } } stage('构建应用镜像') { steps { script { // 直接调用docker命令,复用宿主机的Docker环境 docker.build('your-app-image:${BUILD_NUMBER}') } } } stage('运行测试') { steps { script { docker.image('your-app-image:${BUILD_NUMBER}').run('-p 8000:8000') { // 这里可添加测试逻辑,比如接口校验、单元测试执行 sh 'curl http://localhost:8000/health' } } } } } }
关键注意事项
- 数据备份:定期备份
~/jenkins_home目录,避免虚拟机故障导致Jenkins配置丢失 - 安全风险:挂载
/var/run/docker.sock相当于给容器宿主机的root权限,生产环境需严格控制Jenkins的代码提交权限,避免恶意代码执行 - 版本兼容:Ubuntu 16.04的Docker CE版本较旧,若需要新特性,可考虑升级Docker,但需注意与Jenkins插件的兼容性
内容的提问来源于stack exchange,提问作者casparjespersen
相关产品推荐
相关产品推荐

