10 - Docker 实际应用案例
Docker 实际应用案例
在前面的教程中,我们学习了Docker的基本概念、命令、镜像构建、数据管理、网络配置、Docker Compose以及生产环境最佳实践和故障排除。本文将通过一系列实际案例,展示如何在实际项目中应用Docker,帮助你将所学知识付诸实践。
案例1:部署Web应用
场景描述
部署一个基于Node.js的Web应用,包含前端、后端API和MongoDB数据库。
解决方案
1. 创建应用目录结构
my-web-app/├── frontend/│ ├── Dockerfile│ ├── package.json│ └── src/├── backend/│ ├── Dockerfile│ ├── package.json│ └── src/└── docker-compose.yml
2. 前端Dockerfile
# frontend/DockerfileFROM node:14-alpine as buildWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .RUN npm run build
FROM nginx:alpineCOPY --from=build /app/build /usr/share/nginx/htmlCOPY nginx.conf /etc/nginx/conf.d/default.confEXPOSE 80CMD ["nginx", "-g", "daemon off;"]
3. 后端Dockerfile
# backend/DockerfileFROM node:14-alpineWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 3000CMD ["node", "src/index.js"]
4. Docker Compose配置
version: '3'
services: frontend: build: ./frontend ports: - "80:80" depends_on: - backend networks: - app-network
backend: build: ./backend ports: - "3000:3000" environment: - MONGO_URI=mongodb://mongodb:27017/myapp depends_on: - mongodb networks: - app-network
mongodb: image: mongo:4.4 volumes: - mongo-data:/data/db networks: - app-network
networks: app-network: driver: bridge
volumes: mongo-data:
5. 启动应用
docker-compose up -d
优势
- 环境一致性:开发、测试和生产环境保持一致
- 简化部署:一个命令启动整个应用栈
- 隔离组件:各组件独立运行,互不干扰
- 数据持久化:MongoDB数据存储在命名卷中,确保数据不会丢失
案例2:WordPress博客平台
场景描述
快速部署WordPress博客平台,包含WordPress应用和MySQL数据库。
解决方案
Docker Compose配置
version: '3'
services: wordpress: image: wordpress:latest ports: - "8080:80" environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress_password WORDPRESS_DB_NAME: wordpress volumes: - wordpress_data:/var/www/html depends_on: - db restart: always
db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress_password restart: always
volumes: wordpress_data: db_data:
启动WordPress
docker-compose up -d
访问 http://localhost:8080 完成WordPress安装。
优势
- 快速部署:几分钟内完成WordPress环境搭建
- 数据持久化:使用命名卷保存WordPress文件和数据库数据
- 易于维护:可以轻松升级WordPress和MySQL版本
- 可移植性:可以在任何支持Docker的环境中运行
案例3:CI/CD流水线
场景描述
使用Docker构建持续集成/持续部署(CI/CD)流水线,自动化测试和部署过程。
解决方案
1. 创建测试环境的Dockerfile
FROM node:14-alpineWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .CMD ["npm", "test"]
2. 创建Jenkins流水线配置
// Jenkinsfilepipeline { agent { docker { image 'node:14-alpine' } } stages { stage('Build') { steps { sh 'npm install' } } stage('Test') { steps { sh 'npm test' } } stage('Build Docker Image') { steps { sh 'docker build -t myapp:${BUILD_NUMBER} .' } } stage('Deploy') { steps { sh 'docker-compose -f docker-compose.prod.yml up -d' } } }}
3. 生产环境Docker Compose配置
version: '3'
services: app: image: myapp:${BUILD_NUMBER} ports: - "80:3000" environment: - NODE_ENV=production restart: always
优势
- 环境一致性:测试和生产环境使用相同的Docker镜像
- 自动化:自动构建、测试和部署
- 版本控制:每次构建生成唯一标记的镜像
- 回滚简便:可以轻松回滚到之前的版本
案例4:微服务架构
场景描述
部署一个由多个微服务组成的应用,包括API网关、用户服务、产品服务和数据库。
解决方案
Docker Compose配置
version: '3'
services: api-gateway: build: ./api-gateway ports: - "80:8000" depends_on: - user-service - product-service networks: - microservice-network
user-service: build: ./user-service environment: - DB_HOST=user-db depends_on: - user-db networks: - microservice-network
product-service: build: ./product-service environment: - DB_HOST=product-db depends_on: - product-db networks: - microservice-network
user-db: image: postgres:13 volumes: - user-db-data:/var/lib/postgresql/data environment: - POSTGRES_USER=user_service - POSTGRES_PASSWORD=password - POSTGRES_DB=users networks: - microservice-network
product-db: image: postgres:13 volumes: - product-db-data:/var/lib/postgresql/data environment: - POSTGRES_USER=product_service - POSTGRES_PASSWORD=password - POSTGRES_DB=products networks: - microservice-network
networks: microservice-network: driver: bridge
volumes: user-db-data: product-db-data:
优势
- 服务隔离:每个微服务独立运行在自己的容器中
- 独立扩展:可以根据需求单独扩展特定服务
- 技术多样性:不同服务可以使用不同的技术栈
- 简化部署:使用Docker Compose管理整个微服务架构
案例5:数据分析环境
场景描述
搭建一个数据分析环境,包含Jupyter Notebook、PostgreSQL数据库和数据可视化工具。
解决方案
Docker Compose配置
version: '3'
services: jupyter: image: jupyter/datascience-notebook ports: - "8888:8888" volumes: - ./notebooks:/home/jovyan/work environment: - JUPYTER_ENABLE_LAB=yes networks: - data-network
postgres: image: postgres:13 volumes: - postgres-data:/var/lib/postgresql/data - ./init-scripts:/docker-entrypoint-initdb.d environment: - POSTGRES_USER=analyst - POSTGRES_PASSWORD=password - POSTGRES_DB=analytics networks: - data-network
grafana: image: grafana/grafana ports: - "3000:3000" volumes: - grafana-data:/var/lib/grafana depends_on: - postgres networks: - data-network
networks: data-network: driver: bridge
volumes: postgres-data: grafana-data:
优势
- 一站式环境:包含数据处理、存储和可视化工具
- 可重复性:确保分析环境的一致性
- 数据持久化:使用卷保存数据和分析结果
- 易于分享:可以轻松与团队成员共享环境配置
案例6:开发环境标准化
场景描述
为团队创建标准化的开发环境,确保所有开发人员使用相同的工具和配置。
解决方案
创建开发环境Dockerfile
FROM ubuntu:20.04
# 安装基本工具RUN apt-get update && apt-get install -y \ git \ curl \ wget \ vim \ build-essential \ && rm -rf /var/lib/apt/lists/*
# 安装Node.jsRUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash - \ && apt-get install -y nodejs
# 安装PythonRUN apt-get update && apt-get install -y \ python3 \ python3-pip \ && rm -rf /var/lib/apt/lists/*
# 安装开发工具RUN npm install -g nodemon typescriptRUN pip3 install pytest flake8
WORKDIR /workspace
CMD ["bash"]
使用Docker Compose管理开发环境
version: '3'
services: dev: build: context: . dockerfile: Dockerfile.dev volumes: - .:/workspace - node_modules:/workspace/node_modules ports: - "3000:3000" - "9229:9229" command: bash stdin_open: true tty: true
volumes: node_modules:
启动开发环境
docker-compose -f docker-compose.dev.yml up -ddocker-compose -f docker-compose.dev.yml exec dev bash
优势
- 环境一致性:所有开发人员使用相同的开发环境
- 快速入职:新团队成员可以快速搭建开发环境
- 隔离性:开发环境与主机系统隔离
- 可版本控制:开发环境配置可以纳入版本控制
总结
本文通过六个实际案例,展示了Docker在不同场景下的应用。从Web应用部署到微服务架构,从CI/CD流水线到数据分析环境,Docker都能提供一致、可靠的解决方案。通过这些案例,你可以了解如何将Docker知识应用到实际项目中,充分