主题模式
Are you an LLM? You can read better optimized documentation at /fe/docker/compose-templates.md for this page in Markdown format
2026 Docker Compose 实战:一键部署常用服务模板库
Docker Compose 是管理多容器应用的利器。与其每次手动敲 docker run 一长串参数,不如写一份 docker-compose.yml,一条命令搞定所有服务。
本文整理了日常开发中最常用的服务模板,复制即用。
🚀 快速开始
安装 Docker Compose
bash
# Docker Compose V2 已内置在 Docker 中
# 验证版本
docker compose version
# 如果未安装,执行以下命令
sudo apt install -y docker-compose-plugin基础命令
bash
# 启动所有服务(后台运行)
docker compose up -d
# 查看运行状态
docker compose ps
# 查看日志
docker compose logs -f
# 停止所有服务
docker compose down
# 停止并删除数据卷
docker compose down -v
# 重启单个服务
docker compose restart nginx目录结构规范
推荐的项目目录结构:
project/
├── docker-compose.yml # 主配置文件
├── .env # 环境变量
├── nginx/
│ └── conf.d/
│ └── default.conf
├── mysql/
│ └── data/ # 数据持久化
├── redis/
│ └── data/
└── minio/
└── data/📦 模板一:Nginx 反向代理
最基础的服务,用于反向代理和静态文件托管。
yaml
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:
- '80:80'
- '443:443'
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
- ./nginx/certs:/etc/nginx/certs
- ./nginx/logs:/var/log/nginx
restart: unless-stopped
networks:
- webnet
networks:
webnet:
driver: bridgeNginx 反向代理配置示例
创建 nginx/conf.d/proxy.conf:
nginx
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://app:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}📦 模板二:MySQL + phpMyAdmin
开发环境必备的数据库组合。
yaml
services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
MYSQL_DATABASE: ${MYSQL_DATABASE:-appdb}
MYSQL_USER: ${MYSQL_USER:-appuser}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-apppass123}
ports:
- '3306:3306'
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
command: --default-authentication-plugin=caching_sha2_password --character-set-server=utf8mb4
restart: unless-stopped
networks:
- dbnet
phpmyadmin:
image: phpmyadmin:latest
container_name: phpmyadmin
environment:
PMA_HOST: mysql
PMA_PORT: 3306
UPLOAD_LIMIT: 50M
ports:
- '8888:80'
depends_on:
- mysql
restart: unless-stopped
networks:
- dbnet
networks:
dbnet:
driver: bridgeMySQL 自定义配置
创建 mysql/conf/custom.cnf:
ini
[mysqld]
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 性能优化
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
max_connections = 200
# 日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2📦 模板三:Redis + RedisInsight
缓存和消息队列的标配。
yaml
services:
redis:
image: redis:7-alpine
container_name: redis
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- '6379:6379'
volumes:
- ./redis/data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
restart: unless-stopped
networks:
- dbnet
redisinsight:
image: redis/redisinsight:latest
container_name: redisinsight
ports:
- '5540:5540'
volumes:
- ./redisinsight/data:/data
depends_on:
- redis
restart: unless-stopped
networks:
- dbnet
networks:
dbnet:
driver: bridgeRedis 配置文件
创建 redis/redis.conf:
conf
# 持久化
appendonly yes
appendfsync everysec
# 内存
maxmemory 256mb
maxmemory-policy allkeys-lru
# 安全
requirepass your_redis_password
# 日志
loglevel notice📦 模板四:MinIO 对象存储
自建 S3 兼容的对象存储服务。
yaml
services:
minio:
image: minio/minio:latest
container_name: minio
environment:
MINIO_ROOT_USER: ${MINIO_USER:-minioadmin}
MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD:-minioadmin123}
command: server /data --console-address ":9001"
ports:
- '9000:9000'
- '9001:9001'
volumes:
- ./minio/data:/data
restart: unless-stopped
networks:
- webnet
networks:
webnet:
driver: bridge访问 http://your-ip:9001 打开 MinIO 控制台。
📦 模板五:Grafana + Prometheus 监控栈
完整的监控解决方案。
yaml
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- '9090:9090'
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/data:/prometheus
restart: unless-stopped
networks:
- monitor
grafana:
image: grafana/grafana:latest
container_name: grafana
environment:
GF_SECURITY_ADMIN_USER: ${GRAFANA_USER:-admin}
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin123}
ports:
- '3000:3000'
volumes:
- ./grafana/data:/var/lib/grafana
depends_on:
- prometheus
restart: unless-stopped
networks:
- monitor
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- '9100:9100'
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command: --path.procfs=/host/proc --path.sysfs=/host/sys --path.rootfs=/rootfs
restart: unless-stopped
networks:
- monitor
networks:
monitor:
driver: bridgePrometheus 配置
创建 prometheus/prometheus.yml:
yaml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']📦 模板六:Portainer 容器管理面板
可视化 Docker 管理工具。
yaml
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
ports:
- '9443:9443'
- '9000:9000'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer/data:/data
restart: unless-stopped访问 https://your-ip:9443 首次设置管理员密码。
📦 模板七:全栈开发环境
前后端分离项目的完整开发环境。
yaml
services:
# 前端开发服务器
frontend:
image: node:20-alpine
container_name: frontend
working_dir: /app
volumes:
- ./frontend:/app
- frontend_node_modules:/app/node_modules
ports:
- '5173:5173'
command: sh -c "npm install && npm run dev -- --host 0.0.0.0"
environment:
- VITE_API_URL=http://localhost:8080
networks:
- devnet
# 后端 API 服务器
backend:
image: node:20-alpine
container_name: backend
working_dir: /app
volumes:
- ./backend:/app
- backend_node_modules:/app/node_modules
ports:
- '8080:8080'
command: sh -c "npm install && npm run dev"
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=appuser
- DB_PASSWORD=apppass123
- DB_NAME=appdb
- REDIS_HOST=redis
- REDIS_PORT=6379
depends_on:
- mysql
- redis
networks:
- devnet
- dbnet
# 数据库
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: appdb
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass123
ports:
- '3306:3306'
volumes:
- ./mysql/data:/var/lib/mysql
restart: unless-stopped
networks:
- dbnet
# 缓存
redis:
image: redis:7-alpine
container_name: redis
ports:
- '6379:6379'
volumes:
- ./redis/data:/data
restart: unless-stopped
networks:
- dbnet
volumes:
frontend_node_modules:
backend_node_modules:
networks:
devnet:
driver: bridge
dbnet:
driver: bridge🔧 环境变量管理
使用 .env 文件
创建 .env 文件管理敏感配置:
bash
# .env
MYSQL_ROOT_PASSWORD=your_strong_password
MYSQL_DATABASE=appdb
MYSQL_USER=appuser
MYSQL_PASSWORD=your_app_password
MINIO_USER=minioadmin
MINIO_PASSWORD=your_minio_password
GRAFANA_USER=admin
GRAFANA_PASSWORD=your_grafana_password
REDIS_PASSWORD=your_redis_password安全提醒
切勿将 .env 文件提交到 Git 仓库! 在 .gitignore 中添加:
.env.env 示例模板
创建 .env.example 供团队参考:
bash
# 复制此文件为 .env 并修改值
MYSQL_ROOT_PASSWORD=
MYSQL_DATABASE=appdb
MYSQL_USER=appuser
MYSQL_PASSWORD=🛡️ 生产环境注意事项
1. 安全加固
yaml
services:
app:
image: myapp:latest
# 限制资源
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
# 只读文件系统
read_only: true
# 安全选项
security_opt:
- no-new-privileges:true
# 临时文件
tmpfs:
- /tmp2. 健康检查
yaml
services:
mysql:
image: mysql:8.0
healthcheck:
test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
interval: 10s
timeout: 5s
retries: 3
start_period: 30s3. 日志管理
yaml
services:
app:
image: myapp:latest
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'📋 常用组合速查
| 场景 | 服务组合 | 端口 |
|---|---|---|
| Web 开发 | Nginx + Node.js + MySQL | 80, 3000, 3306 |
| API 开发 | Node.js + MySQL + Redis | 8080, 3306, 6379 |
| 监控 | Prometheus + Grafana | 9090, 3000 |
| 容器管理 | Portainer | 9443 |
| 对象存储 | MinIO | 9000, 9001 |
| 全栈 | 前端 + 后端 + MySQL + Redis | 5173, 8080, 3306, 6379 |
❓ 常见问题
容器间如何互相访问?
使用服务名作为主机名。例如 mysql 服务可以通过 mysql:3306 访问:
yaml
backend:
environment:
- DB_HOST=mysql # 使用服务名
- DB_PORT=3306数据持久化丢失?
确保正确挂载数据卷:
yaml
volumes:
- ./mysql/data:/var/lib/mysql # 宿主机路径:容器路径端口冲突?
修改宿主机端口映射:
yaml
ports:
- '13306:3306' # 宿主机用 13306,避免与其他 MySQL 冲突如何查看容器日志?
bash
# 查看所有服务日志
docker compose logs -f
# 查看单个服务日志
docker compose logs -f mysql🔗 相关文章
- Docker 基础环境安装 - Docker 安装教程
- Docker 镜像源配置 - 国内镜像加速
- Docker 容器管理 - 常用容器操作
- Watchtower 自动更新 - 自动更新容器与清理镜像
- Git 分支管理最佳实践 - 团队协作流程
