Docker Compose 常用模板


模板 1:Web 项目(Nginx + 静态网站)

 # 最简模板:用 Nginx 托管静态网页
 ​
 services:
   web:
     image: nginx:alpine              # 轻量级 Web 服务器
     ports:
       - "80:80"                      # 宿主机80端口 → 容器80端口(访问网站用)
     volumes:
       - ./html:/usr/share/nginx/html # 把当前目录的 html 文件夹挂载到网站根目录
       # 修改本地 html 文件,浏览器实时生效(热更新)

使用场景:部署静态网站、前端打包后的 dist 目录


模板 2:Web + 数据库(最常用)

 # 通用 Web 应用模板:应用 + MySQL
 ​
 services:
   # ---------- 应用服务 ----------
   app:
     image: nginx:alpine              # 换成你自己的镜像
     ports:
       - "8080:80"                    # 访问 http://IP:8080
     depends_on:
       - db                           # 先启动数据库再启动应用
     # 如果是自己构建的镜像,用下面这行替代 image:
     # build: .
 ​
   # ---------- 数据库服务 ----------
   db:
     image: mysql:8.0                 # MySQL 数据库
     environment:
       MYSQL_ROOT_PASSWORD: 123456    # root 密码(必填)
       MYSQL_DATABASE: myapp          # 自动创建数据库(可选)
     volumes:
       - db_data:/var/lib/mysql       # 数据持久化(重启不丢失)
 ​
 volumes:
   db_data:                           # 声明数据卷

使用场景:大多数需要数据库的 Web 应用


模板 3:从源码构建(Python/Node/Java)

 # 从 Dockerfile 构建镜像并运行
 ​
 services:
   app:
     build: .                         # 使用当前目录的 Dockerfile 构建
     ports:
       - "3000:3000"
     volumes:
       - .:/app                       # 挂载源码 → 修改代码实时生效(开发模式)
     environment:
       - NODE_ENV=development          # 环境变量(代码里用 process.env.NODE_ENV 读取)

使用场景:开发环境、自己写的应用


模板 4:LNMP(Nginx + PHP + MySQL)

 # PHP 网站经典架构
 ​
 services:
   # ---------- Nginx(Web 服务器) ----------
   nginx:
     image: nginx:alpine
     ports:
       - "80:80"
     volumes:
       - ./html:/usr/share/nginx/html   # 网站代码
       - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro  # Nginx 配置(只读)
     depends_on:
       - php
 ​
   # ---------- PHP(处理动态请求) ----------
   php:
     image: php:8.2-fpm-alpine          # PHP-FPM 版本
     volumes:
       - ./html:/usr/share/nginx/html   # 和 Nginx 共享代码目录
     # 如果需要 MySQL 扩展,用 build 方式:
     # build: ./php
 ​
   # ---------- MySQL(数据库) ----------
   mysql:
     image: mysql:8.0
     environment:
       MYSQL_ROOT_PASSWORD: root123
     volumes:
       - mysql_data:/var/lib/mysql
 ​
 volumes:
   mysql_data:

使用场景:WordPress、ThinkPHP、Laravel 等 PHP 项目


模板 5:前后端分离

 # 前端(Vue/React)+ 后端(Node/Java)+ 数据库
 ​
 services:
   # ---------- 前端 ----------
   frontend:
     build: ./frontend                # 前端项目目录(有 Dockerfile)
     ports:
       - "80:80"                      # 浏览器访问
 ​
   # ---------- 后端 API ----------
   backend:
     build: ./backend                 # 后端项目目录
     ports:
       - "3000:3000"                  # API 接口地址
     environment:
       - DB_HOST=mongo                # 数据库地址(用服务名访问)
     depends_on:
       - mongo
 ​
   # ---------- 数据库 ----------
   mongo:
     image: mongo:7
     volumes:
       - mongo_data:/data/db
 ​
 volumes:
   mongo_data:

使用场景:Vue/React + Node.js/Spring Boot + MongoDB/MySQL


模板 6:一键部署 WordPress

 # 最流行的博客系统
 ​
 services:
   wordpress:
     image: wordpress:latest
     ports:
       - "8000:80"                    # http://IP:8000 访问
     environment:
       WORDPRESS_DB_HOST: db:3306     # 数据库地址(服务名:端口)
       WORDPRESS_DB_USER: wordpress   # 数据库用户名
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
     volumes:
       - wp_data:/var/www/html        # 插件/主题文件持久化
 ​
   db:
     image: mysql:8.0
     environment:
       MYSQL_ROOT_PASSWORD: root123
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
     volumes:
       - db_data:/var/lib/mysql
 ​
 volumes:
   wp_data:
   db_data:

使用场景:快速搭建博客、内容管理系统


模板 7:应用 + Redis 缓存

 # 需要缓存的 Web 应用
 ​
 services:
   app:
     build: .
     ports:
       - "8080:8080"
     environment:
       - REDIS_HOST=redis              # 代码里用这个地址连接 Redis
     depends_on:
       - redis
 ​
   redis:
     image: redis:7-alpine             # 轻量级缓存数据库
     volumes:
       - redis_data:/data              # 缓存数据持久化(可选)
     # 如果有密码:
     # command: redis-server --requirepass mypassword
 ​
 volumes:
   redis_data:

使用场景:Session 存储、接口缓存、消息队列


模板 8:微服务多应用

 # 多个独立服务协同工作
 ​
 services:
   # ---------- 用户服务 ----------
   user-service:
     build: ./user-service
     ports:
       - "8001:8080"
     environment:
       - DB_HOST=mysql-user
 ​
   # ---------- 订单服务 ----------
   order-service:
     build: ./order-service
     ports:
       - "8002:8080"
     environment:
       - DB_HOST=mysql-order
 ​
   # ---------- 网关 ----------
   gateway:
     build: ./gateway
     ports:
       - "80:8080"                    # 统一入口
 ​
   # ---------- 共享数据库 ----------
   mysql-user:
     image: mysql:8.0
     environment:
       MYSQL_ROOT_PASSWORD: root123
 ​
   mysql-order:
     image: mysql:8.0
     environment:
       MYSQL_ROOT_PASSWORD: root123

使用场景:微服务架构、多模块项目


核心配置速查(复制即用)

1. 端口映射

ports:
  - "8080:80"      # 宿主机端口:容器端口

2. 环境变量

environment:
  - DB_HOST=db
  - DB_PASSWORD=${DB_PASSWORD}    # 从 .env 文件读取(不硬编码密码)

3. 数据持久化

volumes:
  - ./data:/app/data              # 宿主机目录:容器目录(开发常用)
  - db_data:/var/lib/mysql        # 命名卷(生产推荐)

4. 启动顺序

depends_on:
  - db                            # 等 db 启动后再启动当前服务
  # 注意:只控制启动顺序,不等待服务就绪

5. 重启策略

restart: unless-stopped           # 挂了自动重启(推荐)
restart: always                   # 总是重启

6. 构建镜像

build: .                          # 使用当前目录 Dockerfile
build: ./backend                  # 使用指定目录 Dockerfile


.env 文件(存放敏感信息)

# .env(和 docker-compose.yml 放在同一目录)
# 在 yml 中用 ${变量名} 引用

DB_PASSWORD=your_password_here
JWT_SECRET=your_secret_key
REDIS_PASSWORD=redis_pass

# docker-compose.yml 中引用
environment:
  - DB_PASSWORD=${DB_PASSWORD}


常用命令速查

 # 启动(最常用)
 docker compose up -d
 ​
 # 启动 + 重新构建
 docker compose up -d --build
 ​
 # 停止并清理容器
 docker compose down
 ​
 # 查看运行状态
 docker compose ps
 ​
 # 查看日志
 docker compose logs -f
 ​
 # 进入容器(调试)
 docker compose exec app sh      # app 是服务名
 ​
 # 重启某个服务
 docker compose restart app
 ​
 # 验证配置文件语法
 docker compose config