You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询基于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基础环境

  1. 安装适配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
    
  2. 配置免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组权限:

  1. 先查询宿主机docker组的GID:
    getent group docker | cut -d: -f3
    # Ubuntu 16.04默认输出一般是999
    
  2. 修改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使用

  1. 初始化Jenkins:在本地OS X浏览器输入http://<Ubuntu虚拟机IP>:8080,从~/jenkins_home/secrets/initialAdminPassword获取初始密码,完成插件安装(选择推荐插件即可)。
  2. 安装核心插件:额外安装Git Plugin(拉取你的代码)、Docker Pipeline Plugin(简化Pipeline中的Docker操作),以及你应用栈需要的构建插件(比如Maven、Node.js等)。
  3. 示例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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:40:44