Docker实战场景:常见应用部署案例(含完整配置)
经过前面的学习,你已经掌握了Docker的核心操作和Compose编排能力。本章将聚焦实际工作中最常用的部署场景,提供可直接复用的配置文件和步骤,覆盖前端、Java、Python、中间件等主流应用,让你看完就能上手部署,真正做到“学以致用”。
每个案例都包含“需求说明+准备工作+配置文件+部署步骤+验证方法”,所有配置均经过实测,可直接复制使用。
一、场景1:部署前端项目(Vue/React)📱
需求说明
将本地打包好的Vue/React项目(dist目录)用Nginx部署,实现静态资源访问,支持自定义端口和配置。
准备工作
- 本地前端项目已打包,生成
dist目录(Vue执行npm run build,React执行yarn build); - 项目目录结构:
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;"]
部署步骤
- 进入
frontend-deploy目录,构建镜像:
docker build -t my-frontend:v1 .
- 启动容器(映射本地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数据库(数据持久化),用多阶段构建优化镜像体积。
准备工作
- Spring Boot项目已打包为
app.jar(执行mvn package -DskipTests); - 项目目录结构:
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:
部署步骤
- 进入
springboot-deploy目录,启动整个系统:
docker-compose up -d
- 查看应用日志,确认启动成功:
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应用,或爬虫程序,解决依赖包安装和环境隔离问题。
准备工作
- Python项目文件(以Flask为例):
python-deploy/
├── app.py # Flask应用代码
├── requirements.txt # 依赖包列表
├── Dockerfile
└── docker-compose.yml # 可选,结合Redis存储数据
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)
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:
部署步骤
- 单容器启动(无Redis):
docker build -t my-flask:v1 .
docker run -d -p 5001:5000 --name flask-app my-flask:v1
- 多容器启动(含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:
部署与验证
- 启动:
docker-compose up -d - 连接测试:
docker exec -it redis redis-cli -a 123456,执行set name docker和get 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:
部署与验证
- 启动:
docker-compose up -d - 连接测试:
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有用户列表接口),返回数据库中的用户数据即成功。
六、实战核心要点总结 📌
- 镜像选择:优先用Alpine版本(体积小、资源占用低),生产环境指定具体版本(如
nginx:1.25-alpine),避免latest; - 数据持久化:中间件和数据库必须用数据卷挂载,防止容器删除数据丢失;
- 配置复用:将常用配置(如Nginx.conf、Dockerfile)整理为模板,后续部署直接修改;
- 资源限制:生产环境用
deploy.resources.limits限制CPU和内存,避免单容器占用过多资源; - 日志排查:用
docker logs -f 容器名或docker-compose logs -f实时查看日志,快速定位问题。
下一章,我们将学习Docker进阶技巧,包括镜像深度优化、容器安全配置、多架构镜像构建等,让你的Docker使用更专业、更高效~
小练习:选择一个你熟悉的应用(如Django、Express),参考本章案例编写Dockerfile和docker-compose.yml,实现容器化部署。
更多推荐
所有评论(0)