Docker容器化部署指南
构建、部署和管理容器化应用程序
Docker核心概念
Docker是一个开源的容器化平台,可以将应用程序及其依赖打包成一个独立的容器,实现一次构建,到处运行。
优势: 环境一致性、资源隔离、快速部署、易于扩展。
1. Docker基础命令
1.1 镜像管理
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
docker image ls
# 删除镜像
docker rmi nginx
docker image rm nginx
# 导出镜像
docker save -o nginx.tar nginx:latest
# 导入镜像
docker load -i nginx.tar
1.2 容器管理
# 运行容器
docker run -d --name mynginx -p 80:80 nginx
# 查看运行中的容器
docker ps
docker container ls
# 查看所有容器
docker ps -a
docker container ls -a
# 停止容器
docker stop mynginx
# 启动已停止的容器
docker start mynginx
# 重启容器
docker restart mynginx
# 删除容器
docker rm mynginx
# 进入容器
docker exec -it mynginx bash
# 查看容器日志
docker logs mynginx
docker logs -f mynginx # 跟踪日志
# 查看容器资源使用
docker stats mynginx
2. Dockerfile最佳实践
# 多阶段构建Dockerfile示例
# 阶段1:构建环境
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 阶段2:运行环境
FROM nginx:alpine
LABEL maintainer="小薛同学 "
# 复制构建产物
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制Nginx配置
COPY nginx.conf /etc/nginx/nginx.conf
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
# 环境变量
ENV NODE_ENV=production \
PORT=80
# 非root用户运行
RUN chown -R nginx:nginx /usr/share/nginx/html && \
chmod -R 755 /usr/share/nginx/html
USER nginx
# 暴露端口
EXPOSE 80
# 启动命令
CMD ["nginx", "-g", "daemon off;"]
2.1 构建优化建议
- 使用多阶段构建减小镜像体积
- 利用Docker缓存层
- 使用轻量级基础镜像(如alpine)
- .dockerignore文件排除不需要的文件
3. Docker Compose多容器编排
# docker-compose.yml示例
version: '3.8'
services:
# Web应用服务
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://user:password@db:5432/mydb
depends_on:
- db
- redis
networks:
- app-network
volumes:
- ./logs:/app/logs
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
# 数据库服务
db:
image: postgres:14-alpine
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-network
restart: unless-stopped
# Redis缓存
redis:
image: redis:7-alpine
command: redis-server --requirepass mypassword
volumes:
- redis-data:/data
networks:
- app-network
restart: unless-stopped
# Nginx反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- web
networks:
- app-network
restart: unless-stopped
# 监控工具
monitor:
image: grafana/grafana:latest
ports:
- "3001:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-data:/var/lib/grafana
networks:
- app-network
restart: unless-stopped
networks:
app-network:
driver: bridge
volumes:
postgres-data:
redis-data:
grafana-data:
3.1 Compose常用命令
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
docker-compose logs -f web
# 重启服务
docker-compose restart web
# 构建镜像
docker-compose build
# 执行命令
docker-compose exec web npm test
# 清理资源
docker-compose down -v --remove-orphans
4. 网络配置
# 创建自定义网络
docker network create my-network
# 查看网络
docker network ls
# 查看网络详情
docker network inspect my-network
# 连接容器到网络
docker network connect my-network my-container
# 断开网络连接
docker network disconnect my-network my-container
# 删除网络
docker network rm my-network
5. 数据持久化
5.1 卷(Volume)
# 创建卷
docker volume create my-volume
# 查看卷
docker volume ls
# 使用卷
docker run -d \
--name mysql \
-v my-volume:/var/lib/mysql \
mysql:8.0
# 绑定挂载
docker run -d \
--name nginx \
-v /host/path:/container/path \
nginx:alpine
# 查看卷详情
docker volume inspect my-volume
# 清理未使用的卷
docker volume prune
6. Docker Swarm集群管理
# 初始化Swarm集群
docker swarm init --advertise-addr
# 查看节点
docker node ls
# 加入工作节点
docker swarm join --token :2377
# 创建服务
docker service create \
--name web \
--replicas 3 \
-p 80:80 \
nginx:alpine
# 查看服务
docker service ls
docker service ps web
# 扩缩容
docker service scale web=5
# 更新服务
docker service update \
--image nginx:1.21 \
--update-parallelism 2 \
--update-delay 10s \
web
# 滚动更新配置
docker service update \
--rollback \
web
# 删除服务
docker service rm web
# 离开Swarm
docker swarm leave --force
7. 安全最佳实践
7.1 镜像安全扫描
# 使用Trivy扫描镜像漏洞
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy:latest \
image nginx:latest
# 使用Docker Bench Security
docker run -it --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
--label docker_bench_security \
docker/docker-bench-security
7.2 安全配置建议
- 使用非root用户运行容器
- 限制容器资源使用
- 启用内容信任(Docker Content Trust)
- 定期更新基础镜像
- 扫描镜像漏洞
8. CI/CD集成
# .github/workflows/docker.yml示例
name: Docker Build and Push
on:
push:
branches: [ main ]
tags: [ 'v*.*.*' ]
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ secrets.DOCKER_USERNAME }}/myapp
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
NODE_ENV=production
VERSION=${{ github.sha }}
- name: Scan for vulnerabilities
uses: aquasecurity/trivy-action@master
with:
image-ref: ${{ secrets.DOCKER_USERNAME }}/myapp:latest
format: 'sarif'
output: 'trivy-results.sarif'
- name: Upload Trivy scan results
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: 'trivy-results.sarif'
总结
Docker彻底改变了应用程序的打包、分发和运行方式。通过合理的Dockerfile编写、Compose编排和集群管理,可以构建出高效、可靠、可扩展的容器化应用。
关键要点:
- 使用多阶段构建优化镜像大小
- 合理配置网络和数据持久化
- 重视容器安全
- 自动化CI/CD流程