1. 首页 > Docker教程 > 正文

Docker教程FG024-Docker容器CI/CD集成实战

本教程风哥教程参考Docker官方文档,详细介绍Docker容器与CI/CD(持续集成/持续部署)的集成方法,包括GitLab CI、Jenkins、GitHub Actions等工具的配置与使用。内容包括基础概念、CI/CD流程设计、配置方法、最佳实践以及常见问题解决方案,帮助读者掌握Docker容器CI/CD集成的核心技术。

本文档适合DevOps工程师、开发人员以及容器运维工程师阅读,通过学习本教程,您将能够实现Docker容器的自动化构建、测试和部署,提高开发效率和部署质量。

目录大纲

Part01-基础概念与理论知识

1.1 CI/CD概述

CI/CD是持续集成(Continuous Integration)和持续部署(Continuous Deployment)的缩写,是一种软件开发实践,通过自动化构建、测试和部署流程,提高软件开发效率和质量。

  • 持续集成(CI):开发人员将代码提交到版本控制系统后,自动构建和测试代码,确保代码质量。
  • 持续部署(CD):代码通过测试后,自动部署到生产环境,减少手动操作,提高部署效率。

1.2 Docker与CI/CD集成优势

Docker与CI/CD集成的优势包括:

  • 环境一致性:使用Docker容器确保开发、测试和生产环境的一致性,减少环境差异导致的问题。
  • 快速构建:使用Docker镜像缓存,加速构建过程。
  • 隔离性:容器的隔离性确保构建和测试过程不会相互干扰。
  • 可移植性:Docker容器可以在任何支持Docker的环境中运行,提高部署的灵活性。
  • 版本控制:Docker镜像可以版本化管理,便于回滚和管理。

Part02-生产环境规划与建议

2.1 CI/CD流程设计

在生产环境中,建议以下CI/CD流程设计:

  1. 代码提交:开发人员将代码提交到版本控制系统(如Git)。
  2. 自动构建:CI/CD工具检测到代码提交后,自动构建Docker镜像。
  3. 自动测试:运行单元测试、集成测试等,确保代码质量。
  4. 镜像推送:将构建好的Docker镜像推送到镜像仓库(如Docker Hub、Harbor等)。
  5. 自动部署:将镜像部署到测试环境或生产环境。
  6. 监控与反馈:监控部署后的应用状态,及时反馈问题。

更多视频教程www.fgedu.net.cn

2.2 CI/CD工具选择

CI/CD工具选择建议:

  • GitLab CI:与GitLab集成,配置简单,适合GitLab用户。
  • Jenkins:功能强大,插件丰富,适合复杂的CI/CD流程。
  • GitHub Actions:与GitHub集成,配置简单,适合GitHub用户。
  • Travis CI:易用性高,适合开源项目。
  • CircleCI:性能优异,适合大型项目。

2.3 环境配置建议

环境配置建议:

  • 使用专用的CI/CD服务器,确保构建和部署的稳定性。
  • 配置Docker镜像仓库,用于存储和管理Docker镜像。
  • 设置合理的网络配置,确保CI/CD工具与其他系统的通信。
  • 配置适当的资源限制,确保CI/CD过程不会影响其他系统。
  • 实施安全措施,保护CI/CD系统的安全。

学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 GitLab CI配置

GitLab CI配置的基本步骤:

# 创建.gitlab-ci.yml文件
$ cat > .gitlab-ci.yml << 'EOF'
stages:
  - build
  - test
  - deploy

build:
  stage: build
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - docker build -t fgedu/app:latest .
    - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
    - docker push fgedu/app:latest

test:
  stage: test
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - docker run --rm fgedu/app:latest npm test

deploy:
  stage: deploy
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - docker-compose down
    - docker-compose up -d
  only:
    - main
EOF

# 配置环境变量
# 在GitLab项目设置中配置DOCKER_USERNAME和DOCKER_PASSWORD

3.2 Jenkins配置

Jenkins配置的基本步骤:

# 安装Jenkins
$ docker run --name jenkins \
    -p 8080:8080 \
    -p 50000:50000 \
    -v jenkins_home:/var/jenkins_home \
    -d \
    jenkins/jenkins:lts

# 安装Docker插件
# 在Jenkins管理界面中安装Docker插件

# 创建Jenkins Pipeline
$ cat > Jenkinsfile << 'EOF'
pipeline {
    agent {
        docker {
            image 'docker:20.10.16'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'docker build -t fgedu/app:latest .'
                sh 'docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD'
                sh 'docker push fgedu/app:latest'
            }
        }
        stage('Test') {
            steps {
                sh 'docker run --rm fgedu/app:latest npm test'
            }
        }
        stage('Deploy') {
            steps {
                sh 'docker-compose down'
                sh 'docker-compose up -d'
            }
        }
    }
}
EOF

# 配置环境变量
# 在Jenkins凭证管理中配置DOCKER_USERNAME和DOCKER_PASSWORD

3.3 GitHub Actions配置

GitHub Actions配置的基本步骤:

# 创建GitHub Actions配置文件
$ mkdir -p .github/workflows
$ cat > .github/workflows/ci-cd.yml << 'EOF'
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Build and push Docker image
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: fgedu/app:latest
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

  test:
    runs-on: ubuntu-latest
    needs: build
    steps:
    - uses: actions/checkout@v3
    - name: Run tests
      run: |
        docker run --rm fgedu/app:latest npm test

  deploy:
    runs-on: ubuntu-latest
    needs: test
    steps:
    - uses: actions/checkout@v3
    - name: Deploy to production
      run: |
        docker-compose down
        docker-compose up -d
EOF

# 配置环境变量
# 在GitHub仓库设置中配置DOCKER_USERNAME和DOCKER_PASSWORD

Part04-生产案例与实战讲解

4.1 GitLab CI实战

案例:使用GitLab CI构建和部署Docker容器

# 创建项目结构
$ mkdir -p fgedu-app
$ cd fgedu-app
$ echo 'FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]' > Dockerfile
$ echo '{"name": "fgedu-app", "version": "1.0.0", "scripts": {"start": "node index.js", "test": "echo \"Test passed\""}, "dependencies": {"express": "^4.18.2"}}' > package.json
$ echo 'const express = require("express"); const app = express(); app.get("/", (req, res) => { res.send("Hello from fgedu-app!"); }); app.listen(3000, () => { console.log("App listening on port 3000!"); });' > index.js
$ echo 'stages:
  - build
  - test
  - deploy

build:
  stage: build
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - docker build -t fgedu/app:latest .
    - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
    - docker push fgedu/app:latest

test:
  stage: test
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - docker run --rm fgedu/app:latest npm test

deploy:
  stage: deploy
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - docker-compose down
    - docker-compose up -d
  only:
    - main' > .gitlab-ci.yml
$ echo 'version: "3.8"
services:
  app:
    image: fgedu/app:latest
    ports:
      - "3000:3000"
    restart: always' > docker-compose.yml

# 提交代码到GitLab
$ git init
$ git add .
$ git commit -m "Initial commit"
$ git remote add origin https://gitlab.com/fgedu/fgedu-app.git
$ git push -u origin main

Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 1.23 KiB | 1.23 MiB/s, done.
Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
To https://gitlab.com/fgedu/fgedu-app.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

风哥提示:GitLab CI与GitLab集成紧密,配置简单,适合GitLab用户使用。

4.2 Jenkins实战

案例:使用Jenkins构建和部署Docker容器

# 启动Jenkins
$ docker run --name jenkins \
    -p 8080:8080 \
    -p 50000:50000 \
    -v jenkins_home:/var/jenkins_home \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -d \
    jenkins/jenkins:lts

# 配置Jenkins
# 访问 http://localhost:8080 完成Jenkins初始化
# 安装Docker插件
# 创建Pipeline项目,配置Jenkinsfile路径

# 创建Jenkinsfile
$ cat > Jenkinsfile << 'EOF'
pipeline {
    agent {
        docker {
            image 'docker:20.10.16'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'docker build -t fgedu/app:latest .'
                sh 'docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD'
                sh 'docker push fgedu/app:latest'
            }
        }
        stage('Test') {
            steps {
                sh 'docker run --rm fgedu/app:latest npm test'
            }
        }
        stage('Deploy') {
            steps {
                sh 'docker-compose down'
                sh 'docker-compose up -d'
            }
        }
    }
}
EOF

# 提交代码到Git
$ git add Jenkinsfile
$ git commit -m "Add Jenkinsfile"
$ git push

学习交流加群风哥QQ113257174

4.3 GitHub Actions实战

案例:使用GitHub Actions构建和部署Docker容器

# 创建GitHub Actions配置文件
$ mkdir -p .github/workflows
$ cat > .github/workflows/ci-cd.yml << 'EOF'
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Build and push Docker image
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: fgedu/app:latest
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

  test:
    runs-on: ubuntu-latest
    needs: build
    steps:
    - uses: actions/checkout@v3
    - name: Run tests
      run: |
        docker run --rm fgedu/app:latest npm test

  deploy:
    runs-on: ubuntu-latest
    needs: test
    steps:
    - uses: actions/checkout@v3
    - name: Deploy to production
      run: |
        docker-compose down
        docker-compose up -d
EOF

# 提交代码到GitHub
$ git add .github/workflows/ci-cd.yml
$ git commit -m "Add GitHub Actions workflow"
$ git push

Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 1.02 KiB | 1.02 MiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
To https://github.com/fgedu/fgedu-app.git
 * [new branch]      main -> main

更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 最佳实践

  • 使用Dockerfile多阶段构建,减小镜像体积
  • 使用Docker镜像缓存,加速构建过程
  • 配置合理的构建参数,提高构建效率
  • 使用环境变量管理敏感信息,避免硬编码
  • 设置合理的构建超时时间,避免构建过程过长
  • 实施构建产物缓存,减少重复构建
  • 配置适当的资源限制,确保构建过程不会影响其他系统
  • 使用CI/CD工具的并行构建功能,提高构建速度
  • 实施构建失败通知,及时发现和解决问题
  • 定期清理构建产物和镜像,节省存储空间

5.2 常见问题与解决方案

问题 解决方案
构建失败 检查Dockerfile语法,确保依赖正确安装
镜像推送失败 检查Docker Hub凭证,确保网络连接正常
部署失败 检查docker-compose.yml配置,确保容器端口映射正确
构建速度慢 使用Docker镜像缓存,优化Dockerfile
资源不足 增加CI/CD服务器资源,设置合理的资源限制

5.3 优化建议

  • 使用Dockerfile多阶段构建,减小镜像体积
  • 使用Docker镜像缓存,加速构建过程
  • 配置合理的构建参数,提高构建效率
  • 使用环境变量管理敏感信息,避免硬编码
  • 设置合理的构建超时时间,避免构建过程过长
  • 实施构建产物缓存,减少重复构建
  • 配置适当的资源限制,确保构建过程不会影响其他系统
  • 使用CI/CD工具的并行构建功能,提高构建速度
  • 实施构建失败通知,及时发现和解决问题
  • 定期清理构建产物和镜像,节省存储空间

from Docker视频:www.itpux.com

通过以上CI/CD集成实践,可以实现Docker容器的自动化构建、测试和部署,提高开发效率和部署质量。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息