导航菜单

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

搜索