Jenkins pipeline 部署docker通用模板

Jenkinsfile: 

 Docker的NETWORK_NAME不要使用bridge默认网络,要使用自定义的网络如test

  • 默认 bridge 网络:容器间不能用名字互相访问,只能用 IP。
  • 自定义网络:容器间可以用名字互相访问,Docker 自动做了 DNS 解析。
pipeline {
    agent any
    environment {
        // 定义镜像名称和标签作为环境变量
        IMAGE_NAME = 'my-application' 
        IMAGE_TAG = 'latest'
        CONTAINER_NAME = 'my-app-container'
        VOLUME_NAME = 'app-data-volume'
        NETWORK_NAME = 'test'  // 使用自定义网络名称
        HOST_PORT = '8080'
        CONTAINER_PORT = '8080'
    }
    
    stages {
        stage('检查运行中的容器') {
            steps {
                script {
                    // 检查容器是否存在并移除
                    try {
                        sh "docker container inspect ${CONTAINER_NAME}"
                        echo "容器 ${CONTAINER_NAME} 已存在。正在停止并移除..."
                        sh "docker container stop ${CONTAINER_NAME}"
                        sh "docker container rm ${CONTAINER_NAME}"
                    } catch (Exception e) {
                        echo "未找到名为 ${CONTAINER_NAME} 的容器。"
                    }
                    
                    // 检查镜像是否存在并移除
                    try {
                        sh "docker image inspect ${IMAGE_NAME}:${IMAGE_TAG}"
                        echo "镜像 ${IMAGE_NAME}:${IMAGE_TAG} 已存在。正在移除..."
                        sh "docker rmi ${IMAGE_NAME}:${IMAGE_TAG} -f"
                    } catch (Exception e) {
                        echo "未找到镜像 ${IMAGE_NAME}:${IMAGE_TAG}。"
                    }
                }
            }
        }
        
        stage('创建 Docker 卷') {
            steps {
                script {
                    // 检查卷是否存在,不存在则创建
                    try {
                        sh "docker volume inspect ${VOLUME_NAME}"
                        echo "卷 ${VOLUME_NAME} 已存在。"
                    } catch (Exception e) {
                        echo "正在创建卷 ${VOLUME_NAME}..."
                        sh "docker volume create ${VOLUME_NAME}"
                    }
                }
            }
        }
        
        stage('构建 Docker 镜像') {
            steps {
                script {
                    // 构建 Docker 镜像
                    echo "正在构建 Docker 镜像 ${IMAGE_NAME}:${IMAGE_TAG}..."
                    sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ."
                }
            }
        }
        
        stage('运行 Docker 容器') {
            steps {
                script {
                    // 运行 Docker 容器,挂载卷并映射端口
                    echo "正在启动容器 ${CONTAINER_NAME}..."
                    sh """
                        docker run -d \
                        --name ${CONTAINER_NAME} \
                        -p ${HOST_PORT}:${CONTAINER_PORT} \
                        -v ${VOLUME_NAME}:/app/data \
                        --network ${NETWORK_NAME} \
                        ${IMAGE_NAME}:${IMAGE_TAG}
                    """
                }
            }
        }
        
        stage('清理') {
            steps {
                script {
                    // 移除未使用的镜像
                    echo "正在清理未使用的 Docker 镜像..."
                    sh "docker image prune -f"
                }
            }
        }
    }
    
    post {
        success {
            echo "部署成功!"
            echo "应用程序可通过 http://<服务器IP>:${HOST_PORT} 访问"
        }
        failure {
            echo "部署失败!"
        }
        always {
            echo "流水线执行完成。"
        }
    }
}

Dockerfile: 

# 使用官方 Python 基础镜像(轻量级版本)
FROM python:3.10-slim

# 设置工作目录
WORKDIR /app

# 先复制依赖文件,以便利用 Docker 缓存层
COPY requirements.txt .

# 设置 pip 使用国内镜像源加速下载(可根据需要修改或删除)
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 安装依赖(使用 --no-cache-dir 减少镜像大小)
RUN pip install --no-cache-dir -r requirements.txt

# 复制项目所有文件(放在依赖安装之后,以便代码变更不影响依赖层缓存)
COPY . .

# 暴露应用端口(根据实际应用修改)
EXPOSE 8080

# 设置容器启动命令(根据实际应用修改)
CMD ["python", "app.py"]

### 使用 Jenkins Pipeline 实现 Containerd、Kubernetes 和 Docker 的集成 #### 背景介绍 Jenkins 是一种流行的 CI/CD 工具,支持通过其 Pipeline 功能实现复杂的自动化流程。Containerd 是一个轻量级的容器运行时,通常用于替代传统的 Docker 容器运行时。Kubernetes 提供了一个强大的编排平台来管理和调度容器化的应用程序。而 Docker 则是一个广泛使用的容器技术栈的一部分。 为了在 Jenkins Pipeline 中利用这些技术,可以通过以下方法完成它们之间的集成: --- #### 1. **准备环境** - 确保 Kubernetes 集群已正确配置并能够访问。 - 在集群中启用 `containerd` 并将其作为默认容器运行时[^3]。 - 安装必要的插件,例如 Kubernetes Plugin 和 Docker Plugin[^4]。 --- #### 2. **创建 Kubernetes Pod Template** 使用 Kubernetes Plugin,在 Jenkins 中定义一个 Pod 模板,该模板指定所需的容器镜像和其他资源配置。以下是 YAML 文件的一个例子: ```yaml apiVersion: v1 kind: Pod metadata: name: jenkins-agent-containerd spec: containers: - name: maven-builder image: maven:3-jdk-8 command: - cat tty: true - name: kubectl image: bitnami/kubectl:latest command: - cat tty: true ``` 此模板包含两个容器:一个是 Maven 构建工具,另一个是带有 `kubectl` 的容器,以便于与 Kubernetes API 进行交互[^1]。 --- #### 3. **编写 Declarative Pipeline** 下面展示了一种声明式的 Jenkins Pipeline 示例,它集成了 Containerd、Kubernetes 和 Docker: ```groovy pipeline { agent { kubernetes { label 'mypod' yaml """ apiVersion: v1 kind: Pod metadata: name: jenkins-agent-containerd spec: containers: - name: maven-builder image: maven:3-jdk-8 command: - cat tty: true - name: kubectl image: bitnami/kubectl:latest command: - cat tty: true """ } } environment { KUBECONFIG = '/home/jenkins/.kube/config' } stages { stage('Checkout Code') { steps { git url: 'https://github.com/example/repo.git', branch: 'main' } } stage('Build Application') { steps { container('maven-builder') { sh 'mvn clean package' } } } stage('Deploy to Kubernetes') { steps { container('kubectl') { script { echo "Using kubeconfig file at ${env.KUBECONFIG}" sh 'kubectl version' sh 'kubectl apply -f deployment.yaml' } } } } } post { always { deleteDir() } } } ``` 在此脚本中: - 使用了 `kubernetes` 代理类型指定了自定义的 Pod 模板。 - 将不同的阶段分配给特定的容器(如 Maven 或 kubectl)。 - 设置了 `KUBECONFIG` 环境变量以允许访问 Kubernetes 集群[^2]。 --- #### 4. **配置 Containerd 支持** 如果目标是在 Kubernetes 上使用 `containerd` 替代 Docker,则需调整节点上的 CRI(容器运行时接口)。这涉及修改 `/etc/containerd/config.toml` 文件并将 `plugins.cri.containerd.runtimes.untrusted` 字段更新为适合的目标运行时[^3]。 随后重启 `containerd` 服务以使更改生效,并验证新设置是否正常工作。 --- #### 5. **测试和调试** 最后一步是对整个流水线进行全面测试,确保各组件之间无缝协作。可以尝试模拟失败场景以评估恢复机制的有效性[^4]。 --- ### 总结 上述过程展示了如何借助 Jenkins Pipeline 来连接 Containerd、Kubernetes 和 Docker 技术栈,从而构建高效的 CI/CD 流程。这种方法不仅提高了灵活性还增强了系统的稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值