经过前面的学习,你已经掌握了Docker的核心操作和Compose编排能力。本章将聚焦实际工作中最常用的部署场景,提供可直接复用的配置文件和步骤,覆盖前端、Java、Python、中间件等主流应用,让你看完就能上手部署,真正做到“学以致用”。

每个案例都包含“需求说明+准备工作+配置文件+部署步骤+验证方法”,所有配置均经过实测,可直接复制使用。

一、场景1:部署前端项目(Vue/React)📱

需求说明

将本地打包好的Vue/React项目(dist目录)用Nginx部署,实现静态资源访问,支持自定义端口和配置。

准备工作

  1. 本地前端项目已打包,生成dist目录(Vue执行npm run build,React执行yarn build);
  2. 项目目录结构:
frontend-deploy/
├── dist/          # 打包后的静态资源
├── Dockerfile     # 构建前端镜像
└── nginx.conf     # Nginx配置文件

核心配置文件

1. Nginx配置(nginx.conf)

解决前端路由刷新404问题,配置静态资源缓存:

server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;  # 容器内静态资源目录
    index index.html;

    # 解决Vue/React路由刷新404
    location / {
        try_files $uri $uri/ /index.html;
        expires 1d;  # 静态资源缓存1天
    }

    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
    }
}
2. Dockerfile

基于Nginx Alpine镜像,复制dist文件和配置:

# 基础镜像(轻量,约20MB)
FROM nginx:alpine

# 删除默认Nginx配置
RUN rm /etc/nginx/conf.d/default.conf

# 复制自定义Nginx配置
COPY nginx.conf /etc/nginx/conf.d/

# 复制前端打包后的dist目录到容器
COPY dist/ /usr/share/nginx/html/

# 暴露80端口
EXPOSE 80

# 启动Nginx(前台运行,避免容器退出)
CMD ["nginx", "-g", "daemon off;"]

部署步骤

  1. 进入frontend-deploy目录,构建镜像:
docker build -t my-frontend:v1 .
  1. 启动容器(映射本地8081端口到容器80):
docker run -d -p 8081:80 --name frontend-app my-frontend:v1

验证效果

访问localhost:8081,能看到前端项目首页,刷新路由不报错即成功。

避坑点

  • 若静态资源加载失败,检查dist目录路径是否正确(Dockerfile中COPY dist/后是否带斜杠);
  • 路由刷新404,确认Nginx配置中try_files $uri $uri/ /index.html;是否添加。

二、场景2:部署Java Spring Boot应用 ☕

需求说明

部署Spring Boot应用,结合MySQL数据库(数据持久化),用多阶段构建优化镜像体积。

准备工作

  1. Spring Boot项目已打包为app.jar(执行mvn package -DskipTests);
  2. 项目目录结构:
springboot-deploy/
├── app.jar        # Spring Boot打包产物
├── Dockerfile     # 多阶段构建配置
└── docker-compose.yml  # 编排Spring Boot+MySQL

核心配置文件

1. Dockerfile(多阶段构建)

分离编译和运行环境,最终镜像仅含JRE,体积从500MB+缩减到100MB左右:

# 第一阶段:编译(用带Maven的JDK镜像,仅用于打包)
FROM maven:3.8-openjdk-17 AS builder
WORKDIR /app
# 复制pom.xml和源代码(若本地已打包,可跳过此步,直接复制jar包)
COPY pom.xml .
COPY src ./src
# 打包生成jar包(输出到target目录)
RUN mvn package -DskipTests

# 第二阶段:运行(用仅含JRE的轻量镜像)
FROM openjdk:17-jre-slim
WORKDIR /app
# 从第一阶段复制jar包到当前镜像
COPY --from=builder /app/target/*.jar app.jar
# 暴露应用端口(与Spring Boot配置一致)
EXPOSE 8080
# 启动命令(指定JVM参数,优化性能)
CMD ["java", "-jar", "app.jar", "-Xms512m", "-Xmx512m"]
2. docker-compose.yml(编排应用+MySQL)
version: '3.8'
services:
  # Spring Boot应用
  app:
    build: .
    ports:
      - "8082:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/springboot_db?useSSL=false&serverTimezone=UTC
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=123456
    depends_on:
      - mysql
    restart: always

  # MySQL数据库
  mysql:
    image: mysql:5.7
    ports:
      - "3307:3306"
    volumes:
      - mysql-data:/var/lib/mysql  # 数据持久化
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=springboot_db  # 自动创建数据库
    restart: always

volumes:
  mysql-data:

部署步骤

  1. 进入springboot-deploy目录,启动整个系统:
docker-compose up -d
  1. 查看应用日志,确认启动成功:
docker-compose logs -f app

验证效果

访问localhost:8082/health(假设应用有健康检查接口),返回UP即成功;或通过数据库工具连接localhost:3307,能看到springboot_db数据库。

避坑点

  • 应用连接MySQL失败:检查SPRING_DATASOURCE_URL中的主机名是否为mysql(Compose服务名),而非localhost
  • 镜像体积过大:确保使用多阶段构建,避免直接基于JDK镜像打包。

三、场景3:部署Python应用(Flask/爬虫)🐍

需求说明

部署Python Flask Web应用,或爬虫程序,解决依赖包安装和环境隔离问题。

准备工作

  1. Python项目文件(以Flask为例):
python-deploy/
├── app.py         # Flask应用代码
├── requirements.txt  # 依赖包列表
├── Dockerfile
└── docker-compose.yml  # 可选,结合Redis存储数据
  1. app.py(简单Flask应用):
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello Docker Python!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  1. requirements.txt
flask==2.3.3

核心配置文件

1. Dockerfile

基于Python Alpine镜像,减少体积,加速依赖安装:

# 基础镜像(Python 3.11,约40MB)
FROM python:3.11-alpine

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖(国内源加速)
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

# 复制应用代码
COPY app.py .

# 暴露端口
EXPOSE 5000

# 启动应用
CMD ["python", "app.py"]
2. docker-compose.yml(结合Redis)

若应用需要Redis存储数据,添加Redis服务:

version: '3.8'
services:
  flask-app:
    build: .
    ports:
      - "5001:5000"
    depends_on:
      - redis
    restart: always

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data  # 数据持久化
    restart: always

volumes:
  redis-data:

部署步骤

  1. 单容器启动(无Redis):
docker build -t my-flask:v1 .
docker run -d -p 5001:5000 --name flask-app my-flask:v1
  1. 多容器启动(含Redis):
docker-compose up -d

验证效果

访问localhost:5001,返回“Hello Docker Python!”即成功;若连接Redis,可进入容器执行redis-cli验证数据存储。

避坑点

  • 依赖安装慢:在pip install时添加国内源(如清华源);
  • 容器启动后立即退出:检查app.py中是否指定host='0.0.0.0'(默认仅本地可访问)。

四、场景4:部署中间件(Redis/MongoDB)🛢️

需求说明

部署常用中间件,实现数据持久化、自定义配置,满足生产环境基础需求。

4.1 部署Redis(带密码+数据持久化)

docker-compose.yml
version: '3.8'
services:
  redis:
    image: redis:alpine
    ports:
      - "6380:6379"
    volumes:
      - redis-data:/data  # 数据持久化(RDB/AOF文件存储)
      - ./redis.conf:/etc/redis/redis.conf  # 自定义配置(可选)
    command: redis-server /etc/redis/redis.conf --requirepass 123456  # 设置密码
    restart: always
    # 资源限制(生产环境推荐)
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

volumes:
  redis-data:
部署与验证
  1. 启动:docker-compose up -d
  2. 连接测试:docker exec -it redis redis-cli -a 123456,执行set name dockerget name,返回"docker"即成功。

4.2 部署MongoDB(带认证+数据持久化)

docker-compose.yml
version: '3.8'
services:
  mongodb:
    image: mongo:5.0
    ports:
      - "27018:27017"
    volumes:
      - mongo-data:/data/db  # 数据持久化
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=123456
    restart: always
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 1G

volumes:
  mongo-data:
部署与验证
  1. 启动:docker-compose up -d
  2. 连接测试:docker exec -it mongodb mongo -u root -p 123456 --authenticationDatabase admin,执行show dbs即成功。

避坑点

  • Redis密码遗忘:删除容器和数据卷,重新启动(生产环境需备份配置);
  • MongoDB权限问题:连接时必须指定--authenticationDatabase admin,否则认证失败。

五、场景5:部署多容器微服务简化版(Nginx+Node.js+MySQL)🌐

需求说明

模拟微服务架构,Nginx反向代理Node.js API,API连接MySQL数据库,实现完整业务流程。

核心配置(docker-compose.yml)

version: '3.8'
services:
  # Nginx反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - node-api
    restart: always

  # Node.js API服务
  node-api:
    image: node:18-alpine
    working_dir: /app
    volumes:
      - ./node-api:/app  # 绑定挂载代码(开发模式)
    environment:
      - DB_HOST=mysql
      - DB_USER=root
      - DB_PASS=123456
      - DB_NAME=node_db
    command: sh -c "npm install && node server.js"
    depends_on:
      - mysql
    restart: always

  # MySQL数据库
  mysql:
    image: mysql:5.7
    volumes:
      - mysql-data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=node_db
    restart: always

volumes:
  mysql-data:

验证效果

访问localhost/api/users(假设Node.js API有用户列表接口),返回数据库中的用户数据即成功。

六、实战核心要点总结 📌

  1. 镜像选择:优先用Alpine版本(体积小、资源占用低),生产环境指定具体版本(如nginx:1.25-alpine),避免latest
  2. 数据持久化:中间件和数据库必须用数据卷挂载,防止容器删除数据丢失;
  3. 配置复用:将常用配置(如Nginx.conf、Dockerfile)整理为模板,后续部署直接修改;
  4. 资源限制:生产环境用deploy.resources.limits限制CPU和内存,避免单容器占用过多资源;
  5. 日志排查:用docker logs -f 容器名docker-compose logs -f实时查看日志,快速定位问题。

下一章,我们将学习Docker进阶技巧,包括镜像深度优化、容器安全配置、多架构镜像构建等,让你的Docker使用更专业、更高效~

小练习:选择一个你熟悉的应用(如Django、Express),参考本章案例编写Dockerfile和docker-compose.yml,实现容器化部署。

更多推荐