插件窝 干货文章 如何利用Docker容器在Linux上进行持续集成和持续部署?

如何利用Docker容器在Linux上进行持续集成和持续部署?

Docker compose build myapp 993    来源:    2025-04-14

利用Docker容器在Linux上实现持续集成/持续部署(CI/CD)

基础架构概述

在Linux上使用Docker实现CI/CD通常包含以下组件: - Docker Engine:容器运行时环境 - 代码仓库:如GitHub、GitLab或Bitbucket - CI/CD工具:如Jenkins、GitLab CI或GitHub Actions - 容器注册表:如Docker Hub、AWS ECR或私有Registry

实施步骤

1. 环境准备

# 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 验证安装
docker --version
sudo systemctl enable docker
sudo systemctl start docker

2. 创建Docker化的应用

示例Dockerfile:

FROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]

3. 设置CI/CD流水线

选项A:使用Jenkins

  1. 安装Jenkins:
docker run -d -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
  1. 配置Jenkins流水线(Jenkinsfile):
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'docker build -t myapp:${BUILD_NUMBER} .'
            }
        }
        stage('Test') {
            steps {
                sh 'docker run myapp:${BUILD_NUMBER} npm test'
            }
        }
        stage('Deploy') {
            steps {
                sh 'docker tag myapp:${BUILD_NUMBER} myregistry/myapp:latest'
                sh 'docker push myregistry/myapp:latest'
                sh 'ssh user@server "docker pull myregistry/myapp:latest && docker-compose up -d"'
            }
        }
    }
}

选项B:使用GitLab CI

.gitlab-ci.yml示例:

stages:
  - build
  - test
  - deploy

variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

build:
  stage: build
  script:
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG

test:
  stage: test
  script:
    - docker run $IMAGE_TAG npm test

deploy:
  stage: deploy
  script:
    - ssh user@server "docker pull $IMAGE_TAG && docker-compose up -d"
  only:
    - main

4. 自动化部署策略

  1. 蓝绿部署
# 启动新版本(绿色环境)
docker-compose -f docker-compose-green.yml up -d

# 测试通过后切换流量
docker-compose -f docker-compose-green.yml up -d
docker-compose -f docker-compose-blue.yml down
  1. 滚动更新
docker service update --image myapp:new-version myapp_service

5. 监控和日志

# 容器日志
docker logs -f container_name

# 资源监控
docker stats

# 使用Prometheus+Grafana监控
docker-compose.yml示例:
version: '3'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"

最佳实践

  1. 多阶段构建:减少最终镜像大小
FROM node:14 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
  1. 使用.dockerignore:排除不必要的文件

  2. 安全扫描

docker scan myapp:latest
  1. 资源限制
docker run -it --memory="512m" --cpus="1.5" myapp
  1. 使用Docker Compose管理多容器应用

常见问题解决

  1. 构建缓存问题
docker build --no-cache -t myapp .
  1. 容器间通信
# docker-compose.yml中
services:
  app:
    networks:
      - mynet
  db:
    networks:
      - mynet
networks:
  mynet:
  1. 数据持久化
docker run -v /host/path:/container/path myapp

通过以上配置,您可以在Linux上建立一个完整的Docker化CI/CD流水线,实现从代码提交到自动化构建、测试和部署的全流程。