logo
GitHub

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. 启动应用

Terminal window
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

Terminal window
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:

启动开发环境

Terminal window
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知识应用到实际项目中,充分