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/Dockerfile
FROM node:14-alpine as build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
3. 后端Dockerfile
# backend/Dockerfile
FROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]
4. Docker Compose配置
# docker-compose.yml
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
# Dockerfile.test
FROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "test"]
2. 创建Jenkins流水线配置
// Jenkinsfile
pipeline {
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配置
# docker-compose.prod.yml
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
# Dockerfile.dev
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.js
RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash - \
&& apt-get install -y nodejs
# 安装Python
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# 安装开发工具
RUN npm install -g nodemon typescript
RUN pip3 install pytest flake8
WORKDIR /workspace
CMD ["bash"]
使用Docker Compose管理开发环境
# docker-compose.dev.yml
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 -d
docker-compose -f docker-compose.dev.yml exec dev bash
优势
- 环境一致性:所有开发人员使用相同的开发环境
- 快速入职:新团队成员可以快速搭建开发环境
- 隔离性:开发环境与主机系统隔离
- 可版本控制:开发环境配置可以纳入版本控制
总结
本文通过六个实际案例,展示了Docker在不同场景下的应用。从Web应用部署到微服务架构,从CI/CD流水线到数据分析环境,Docker都能提供一致、可靠的解决方案。通过这些案例,你可以了解如何将Docker知识应用到实际项目中,充分