温馨提示×

Ubuntu Jenkins如何与Docker集成

小樊
37
2025-10-22 20:58:35
栏目: 智能运维

Ubuntu Jenkins与Docker集成的完整流程

1. 环境准备:安装Docker与Jenkins

在Ubuntu系统上,首先需要安装Docker和Jenkins,确保两者能正常运行。

1.1 安装Docker

更新软件包列表并安装依赖:

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

添加Docker官方GPG密钥和软件源:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装Docker CE及组件:

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

启动Docker并设置开机自启:

sudo systemctl start docker
sudo systemctl enable docker

关键操作:将Jenkins用户加入Docker组(避免后续使用Docker命令需要sudo):

sudo usermod -aG docker jenkins
sudo systemctl restart jenkins  # 重启Jenkins使组权限生效

验证Docker安装:

docker --version  # 应输出Docker版本信息

1.2 安装Jenkins

添加Jenkins官方源并安装:

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list
sudo apt update
sudo apt install -y jenkins

启动Jenkins并设置开机自启:

sudo systemctl start jenkins
sudo systemctl enable jenkins

访问http://<服务器IP>:8080,通过命令sudo cat /var/lib/jenkins/secrets/initialAdminPassword获取初始密码,完成初始配置(如安装推荐插件、创建管理员账号)。

2. Jenkins配置:安装插件与授权

要让Jenkins能控制Docker,需安装必要插件并配置Docker访问权限。

2.1 安装Docker相关插件

登录Jenkins管理界面,进入Manage Jenkins > Manage Plugins

  • 在“Available”标签页搜索以下插件,勾选后点击“Install without restart”:
    • Docker Pipeline:支持在Pipeline脚本中直接使用Docker命令(如docker.builddocker.image)。
    • Docker Plugin(可选):提供Docker主机管理和容器操作的UI界面。

2.2 配置Docker访问权限

为了让Jenkins能远程控制Docker守护进程,需修改Docker的通信配置:
编辑Docker守护进程配置文件:

sudo vim /etc/docker/daemon.json

添加以下内容(允许TCP连接,端口2375):

{
  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}

重启Docker使配置生效:

sudo systemctl restart docker

安全提示:开放2375端口存在安全风险,建议仅在测试环境使用;生产环境建议使用TLS加密或Docker Swarm模式。

3. 创建Jenkins Pipeline:集成Docker步骤

通过Pipeline脚本定义构建、测试、部署流程,结合Docker实现容器化CI/CD。

3.1 编写Jenkinsfile

在项目代码根目录创建Jenkinsfile,示例如下(以Node.js应用为例):

pipeline {
    agent any
    environment {
        DOCKER_IMAGE = "your-dockerhub-username/your-app-name:${env.BUILD_NUMBER}"  // 镜像名称(含构建编号)
        DOCKER_HUB_CREDENTIALS = credentials('dockerhub-account')  // Jenkins中配置的Docker Hub凭证ID
    }
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/your/repo.git'  // 拉取代码
            }
        }
        stage('Build Image') {
            steps {
                script {
                    // 使用Docker Pipeline插件构建镜像
                    docker.build(DOCKER_IMAGE)
                }
            }
        }
        stage('Test') {
            steps {
                script {
                    // 在构建的镜像中运行测试
                    docker.image(DOCKER_IMAGE).inside {
                        sh 'npm install'  // 安装依赖
                        sh 'npm test'     // 执行测试
                    }
                }
            }
        }
        stage('Push Image') {
            when {
                branch 'main'  // 仅main分支推送镜像
            }
            steps {
                script {
                    // 登录Docker Hub并推送镜像
                    docker.withRegistry('https://registry.hub.docker.com', DOCKER_HUB_CREDENTIALS) {
                        docker.image(DOCKER_IMAGE).push()
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    // 示例:通过SSH推送镜像到目标服务器(需提前配置SSH凭证)
                    def remoteServer = 'user@your-server-ip'
                    def remoteDir = '/path/to/deploy'
                    sshagent(['ssh-account']) {  // Jenkins中配置的SSH凭证ID
                        sh "scp -r ${remoteDir}/* ${remoteServer}:${remoteDir}"
                        sh "ssh ${remoteServer} 'cd ${remoteDir} && docker-compose pull && docker-compose up -d'"
                    }
                }
            }
        }
    }
}

3.2 创建Pipeline任务

  • 登录Jenkins,点击New Item,输入任务名称(如docker-app-ci),选择Pipeline类型,点击“OK”。
  • Pipeline配置页:
    • 选择“Pipeline script from SCM”(从代码仓库读取脚本)。
    • 配置代码仓库(如GitHub)的URL和凭证。
    • 设置“Script Path”为Jenkinsfile(即代码根目录下的Pipeline脚本文件名)。
  • 点击“Save”,即可触发构建(或手动点击“Build Now”)。

4. 关键注意事项

  • Docker in Docker(DinD):若需要在Jenkins容器内运行Docker(如复杂CI场景),可将Docker守护进程挂载到Jenkins容器中:
    docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
    
    但需注意,DinD可能带来安全风险(容器逃逸),生产环境建议使用Docker outside of Docker(DooD,即Jenkins主机直接运行Docker)。
  • 权限管理:确保Jenkins用户有足够的权限操作Docker(如docker builddocker push),避免因权限不足导致构建失败。
  • 镜像优化:使用多阶段构建减少镜像大小,添加.dockerignore文件排除不必要的文件(如node_modules.git),提升构建效率。

通过以上步骤,即可实现Ubuntu系统上Jenkins与Docker的集成,支持容器化的持续集成与交付流程。

0