温馨提示×

Linux Jenkins与Docker的集成应用

小樊
101
2026-01-12 08:40:04
栏目: 智能运维

Linux 上 Jenkins 与 Docker 的集成应用

一 架构与方案选型

  • 典型做法是在 Linux 主机上同时运行 JenkinsDocker,通过 Docker 插件Shell 脚本在流水线中完成构建、测试、镜像打包与推送,再在目标环境部署。常见连接方式包括本地 Unix 套接字TCP 套接字,也可在 Jenkins 中配置多个 Docker Cloud 以区分开发、测试、生产环境。对于多容器应用,可结合 Docker Compose 或后续接入 Kubernetes 插件实现编排与发布。

二 快速落地步骤

  • 安装与启动
    • 安装 JDK 11JenkinsDocker(确保 Docker 服务运行)。
    • jenkins 用户加入 docker 组并重启服务,使 Jenkins 免 sudo 调用 Docker(示例:sudo usermod -aG docker jenkins && sudo systemctl restart jenkins)。
  • 插件与全局配置
    • 在 Jenkins 安装插件:Docker PipelineDocker CommonsGitSSH Pipeline Steps(如需远程部署)。
    • 在 “Manage Jenkins → Configure System” 配置 Docker Host URI(如:unix:///var/run/docker.sock),可添加多个 Docker Cloud 连接用于不同环境。
  • 凭据与工具
    • 在 “Manage Credentials” 添加 Git 凭据、Docker Registry 凭据、目标主机 SSH 私钥
    • 在 “Global Tool Configuration” 配置 JDK、Git、Maven/NodeJS 等工具路径。
  • 流水线落地
    • 方式 A:在节点上直接使用 docker 命令(agent any),适合简单场景。
    • 方式 B:使用 Docker Pipelineagent { docker { image ‘maven:3-alpine’ } },在容器内构建,并通过 volume 挂载本地 Maven 仓库缓存依赖,提升构建效率。

三 示例 Jenkinsfile

  • 功能涵盖:拉取代码 → 构建 → 构建镜像 → 登录并推送镜像 → 远程主机拉取并滚动更新(支持失败忽略与快速回滚)。
  • 将凭据 ID、镜像名、主机等替换为实际值后可直接使用。
pipeline {
  agent any
  environment {
    DOCKER_REGISTRY = 'your-registry.com'         // 私有仓库或 Docker Hub
    IMAGE_NAME      = 'microservice-app'
    IMAGE_TAG       = "${env.BUILD_ID}"
    REMOTE_USER     = 'deploy'
    REMOTE_HOST     = '192.168.10.20'
    CONTAINER_NAME  = 'microservice-app'
    APP_PORT       = '8080'
  }
  stages {
    stage('Checkout') {
      steps {
        git branch: 'main',
            url: 'https://gitee.com/your-org/your-repo.git',
            credentialsId: 'git-credentials'
      }
    }
    stage('Build') {
      steps {
        sh 'mvn clean package -DskipTests'
      }
    }
    stage('Build Image') {
      steps {
        script {
          docker.build("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}", '-f Dockerfile .')
        }
      }
    }
    stage('Push Image') {
      steps {
        script {
          docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-registry-credentials') {
            docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}").push()
          }
        }
      }
    }
    stage('Deploy') {
      steps {
        sshagent(['ssh-credentials']) {
          sh """
            ssh ${REMOTE_USER}@${REMOTE_HOST} '
              docker pull ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} && \
              docker stop ${CONTAINER_NAME} || true && \
              docker rm ${CONTAINER_NAME} || true && \
              docker run -d --name ${CONTAINER_NAME} \
                -p ${APP_PORT}:${APP_PORT} \
                ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
            '
          """
        }
      }
    }
  }
  post {
    success {
      echo "Deployed ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} to ${REMOTE_HOST}:${APP_PORT}"
    }
    failure {
      echo "Deployment failed. To rollback, run on ${REMOTE_HOST}: docker run ... ${DOCKER_REGISTRY}/${IMAGE_NAME}:<PREV_TAG>"
    }
  }
}
  • 多服务或复杂编排可将部署阶段替换为:ssh ${REMOTE_USER}@${REMOTE_HOST} “docker-compose -f docker-compose.prod.yml up -d”。

四 安全与连通性要点

  • 权限与套接字
    • 推荐将 jenkins 加入 docker 组,使用 unix:///var/run/docker.sock 连接,避免以 root 运行 Jenkins;变更后需重启 Jenkins 服务。
    • 若报 “Permission denied”(如 java.io.IOException: [13]),检查套接字权限与用户组是否正确。
  • TCP 暴露与保护
    • 如需 TCP 方式,可在 /etc/docker/daemon.json 配置 hosts(如 [“tcp://0.0.0.0:2375”])并重启 Docker;Jenkins 中配置 tcp://:2375。不建议对公网开放,必要时启用 TLS 认证与防火墙限制来源 IP。
  • 凭据与最小权限
    • 使用 Jenkins 凭据管理 Docker RegistrySSH 密钥,避免明文;远程部署遵循最小权限原则,仅授予部署所需命令与目录访问。
  • 构建环境隔离
    • 使用 Docker Pipeline agent 在隔离环境构建与测试,并通过 volume 挂载本地缓存(如 Maven 仓库)提升性能与一致性。

五 常见问题与排查

  • 无法连接 Docker
    • 检查 Docker 服务是否运行(systemctl status docker)、Jenkins 是否有权限访问 Docker(/var/run/docker.sock 权限、jenkins 是否在 docker 组)、以及 Docker Host URI 是否正确(unix:///var/run/docker.sock 或 tcp://…)。
  • 权限被拒绝
    • 出现 “[13] Permission denied” 时,确认已执行 usermod -aG docker jenkins 并重启 Jenkins;必要时检查 AppArmor/SELinux 策略是否限制访问。
  • 镜像拉取或运行失败
    • 核对 镜像名/标签私有仓库登录凭据、目标主机 磁盘空间端口占用;远程执行可先手动 ssh 验证命令有效性。
  • 构建慢或依赖反复下载
    • 在 Docker Pipeline 的 agent 中使用 volume 挂载本地依赖缓存目录(如 -v /root/.m2:/root/.m2),并在流水线中复用工作空间以减少重复下载。

0