Jenkins+Docker 实现一键自动化部署项目

以下是使用 Jenkins + Docker 实现一键自动化部署项目的详细步骤,采用模块化拆解方案:


一、环境准备

  1. 安装 Jenkins

    bash 复制代码
    # Ubuntu/Debian 示例
    sudo apt update
    sudo apt install openjdk-11-jdk -y
    wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
    sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
    sudo apt update
    sudo apt install jenkins -y
    sudo systemctl start jenkins
  2. 安装 Docker

    bash 复制代码
    # Ubuntu/Debian 示例
    sudo apt install docker.io -y
    sudo systemctl enable docker
    sudo usermod -aG docker jenkins  # 授权 Jenkins 用户操作 Docker
    sudo systemctl restart jenkins

二、Jenkins 配置

  1. 安装插件

    • 登录 Jenkins 控制台(http://<服务器IP>:8080
    • 进入 Manage Jenkins > Manage Plugins,安装以下插件:
      • Docker Pipeline
      • Pipeline
      • SSH Pipeline Steps(如需远程部署)
  2. 配置全局工具

    • 进入 Manage Jenkins > Global Tool Configuration
    • 配置 JDK、Git、Maven/NodeJS 等项目所需工具路径。
  3. 添加凭证

    • 进入 Manage Jenkins > Manage Credentials
    • 添加以下凭证:
      • Docker Hub 账号(用于推送镜像)
      • 目标服务器的 SSH 密钥(如需远程部署)

三、项目配置

  1. 创建 Jenkins Pipeline 任务

    • 新建任务 → 选择 Pipeline → 输入任务名称 → 点击 OK
    • Pipeline 配置中选择 Pipeline script from SCM
    • 配置代码仓库(Git/GitHub/GitLab)和凭据
  2. 编写 Jenkinsfile

    groovy 复制代码
    pipeline {
        agent any
        environment {
            DOCKER_IMAGE = "your-dockerhub-username/your-app-name:${BUILD_NUMBER}"
            REMOTE_SERVER = "user@your-server-ip"
            REMOTE_DIR = "/path/to/deploy"
        }
        stages {
            // 阶段1:拉取代码
            stage('Checkout') {
                steps {
                    git branch: 'main', url: 'https://github.com/your/repo.git'
                }
            }
    
            // 阶段2:构建 Docker 镜像
            stage('Build Image') {
                steps {
                    script {
                        dockerImage = docker.build(env.DOCKER_IMAGE)
                    }
                }
            }
    
            // 阶段3:推送镜像到 Docker Hub
            stage('Push Image') {
                steps {
                    script {
                        docker.withRegistry('https://registry.hub.docker.com', 'dockerhub-credential-id') {
                            dockerImage.push()
                        }
                    }
                }
            }
    
            // 阶段4:远程部署(可选)
            stage('Deploy') {
                steps {
                    sshagent(['ssh-credential-id']) {
                        sh """
                            ssh ${REMOTE_SERVER} "docker pull ${DOCKER_IMAGE}"
                            ssh ${REMOTE_SERVER} "docker stop your-container-name || true"
                            ssh ${REMOTE_SERVER} "docker run -d --name your-container-name -p 8080:8080 ${DOCKER_IMAGE}"
                        """
                    }
                }
            }
        }
    }

四、Dockerfile 示例

dockerfile 复制代码
# 基础镜像(根据项目类型选择)
FROM node:14-alpine  # 示例:Node.js 项目
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["npm", "start"]

五、触发自动化部署

  1. 手动触发 :在 Jenkins 任务页面点击 Build Now
  2. 自动触发 (Webhook 配置):
    • 在代码仓库(如 GitHub)中配置 Webhook:
      • URL: http://<jenkins-server-ip>/github-webhook/
    • 在 Jenkins 任务中勾选 GitHub hook trigger for GITScm polling

六、验证部署

  1. 检查 Jenkins 构建日志是否成功
  2. 登录目标服务器执行 docker ps 查看容器状态
  3. 访问 http://your-server-ip:8080 验证应用

常见问题排查

  1. 权限问题 :确保 Jenkins 用户有 Docker 操作权限(sudo usermod -aG docker jenkins
  2. 网络问题:检查服务器与 Docker Hub/代码仓库的网络连通性
  3. 端口冲突 :确保目标服务器的 8080 端口未被占用

如果需要更复杂的部署策略(如蓝绿部署、滚动更新),可以结合 docker-compose 或 Kubernetes 实现。

相关推荐
电气铺二表姐137744166153 小时前
【WIFI电表】物联网无线通讯光伏储能三相单相智能电表
运维·人工智能·能源
007php0073 小时前
Go 面试题: new 和 make 是什么,差异在哪?
后端·算法·docker·容器·面试·职场和发展·golang
鼠鼠我捏,要死了捏3 小时前
Docker Swarm vs Kubernetes vs Nomad:容器编排方案对比与选型建议
docker·kubernetes·nomad
Insist7534 小时前
k8s--etcd
容器·kubernetes·etcd
lovebugs4 小时前
Docker Java 开发者必须掌握的 Docker 命令大全
后端·docker·容器
lin张4 小时前
函数、数组与 grep + 正则表达式的 Linux Shell 编程进阶指南
linux·运维
COTAS4 小时前
K8S 知识框架和命令操作
java·容器·kubernetes
苏三福5 小时前
交叉编译linux-arm32位程序
linux·运维·服务器
逾非时5 小时前
docker 网络配置
docker·云原生·eureka
待磨的钝刨5 小时前
本地构建的 Docker 镜像迁移到另一台电脑上运行
docker·容器·eureka