在Linux上使用Docker实现CI/CD通常包含以下组件: - Docker Engine:容器运行时环境 - 代码仓库:如GitHub、GitLab或Bitbucket - CI/CD工具:如Jenkins、GitLab CI或GitHub Actions - 容器注册表:如Docker Hub、AWS ECR或私有Registry
# 安装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
示例Dockerfile:
FROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
docker run -d -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
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"'
}
}
}
}
.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
# 启动新版本(绿色环境)
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
docker service update --image myapp:new-version myapp_service
# 容器日志
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"
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
使用.dockerignore:排除不必要的文件
安全扫描:
docker scan myapp:latest
docker run -it --memory="512m" --cpus="1.5" myapp
docker build --no-cache -t myapp .
# docker-compose.yml中
services:
app:
networks:
- mynet
db:
networks:
- mynet
networks:
mynet:
docker run -v /host/path:/container/path myapp
通过以上配置,您可以在Linux上建立一个完整的Docker化CI/CD流水线,实现从代码提交到自动化构建、测试和部署的全流程。