小薛同学个人博客,XXTX的个人主页,acnb,ACNB,www.acnb.cn,个人主页,技术博客,编程学习,代码分享,全栈开发,前端开发,WordPress建站,Cloudflare CDN,JavaScript学习,Node.js教程,Python编程,网站建设,SEO优化,UI设计,用户体验,开发教程,IT技术,软件工程,计算机科学,互联网技术,网站开发,编程入门,高级编程,代码优化,项目实战,技术分享,学习资源,开发工具,开源项目,个人网站建设,博客搭建
2025-10-10
Docker

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编排和集群管理,可以构建出高效、可靠、可扩展的容器化应用。

关键要点:

  1. 使用多阶段构建优化镜像大小
  2. 合理配置网络和数据持久化
  3. 重视容器安全
  4. 自动化CI/CD流程