Docker Compose 实战:部署 MySQL + Redis + Nginx 组合服务
·
以下是一个使用 Docker Compose 部署 MySQL + Redis + Nginx 组合服务的完整实战指南,包含详细配置说明和最佳实践:
一、项目结构
myapp/
├── docker-compose.yml
├── nginx/
│ ├── conf.d/
│ │ └── app.conf
│ └── html/
│ └── index.html
├── mysql/
│ └── init.sql
└── redis/
└── redis.conf
二、配置文件详解
1. docker-compose.yml 核心配置
version: '3.8'
services:
# MySQL 服务
mysql:
image: mysql:8.0
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: app_db
MYSQL_USER: appuser
MYSQL_PASSWORD: userpass
volumes:
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- backend
# Redis 服务
redis:
image: redis:6.2-alpine
container_name: redis_cache
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
- redis_data:/data
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
networks:
- backend
# Nginx 服务
nginx:
image: nginx:1.21-alpine
container_name: web_server
volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/conf.d:/etc/nginx/conf.d
ports:
- "80:80"
depends_on:
- mysql
- redis
networks:
- frontend
- backend
# 网络隔离
networks:
frontend:
driver: bridge
backend:
driver: bridge
# 数据持久化
volumes:
mysql_data:
redis_data:
2. Nginx 配置 (nginx/conf.d/app.conf)
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
# 示例代理配置
location /api {
proxy_pass http://backend-service:8080;
proxy_set_header Host $host;
}
}
3. MySQL 初始化脚本 (mysql/init.sql)
CREATE DATABASE IF NOT EXISTS app_data;
GRANT ALL PRIVILEGES ON app_data.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
4. Redis 配置 (redis/redis.conf)
bind 0.0.0.0
requirepass your_redis_password
maxmemory 256mb
maxmemory-policy allkeys-lru
appendonly yes
三、部署操作步骤
-
创建项目目录
mkdir myapp && cd myapp mkdir -p nginx/{conf.d,html} mysql redis -
添加配置文件
- 将上述配置内容写入对应文件
- 在
nginx/html/index.html添加测试页面
-
启动服务
docker-compose up -d -
验证服务状态
docker-compose ps预期输出:
NAME COMMAND SERVICE STATUS PORTS mysql_db "docker-entrypoint.s…" mysql running 0.0.0.0:3306->3306/tcp redis_cache "docker-entrypoint.s…" redis running 0.0.0.0:6379->6379/tcp web_server "/docker-entrypoint.…" nginx running 0.0.0.0:80->80/tcp
四、关键配置说明
-
网络隔离
frontend网络:暴露 Nginx 80 端口backend网络:内部服务通信(MySQL/Redis)
-
数据持久化
- MySQL 数据存储在
mysql_data卷 - Redis AOF 持久化通过
appendonly yes启用
- MySQL 数据存储在
-
安全增强
- MySQL 禁用 root 远程登录(通过
init.sql创建应用用户) - Redis 启用密码认证
- 使用非 root 容器用户(Alpine 镜像)
- MySQL 禁用 root 远程登录(通过
五、常用运维命令
# 查看日志
docker-compose logs -f nginx
# 进入MySQL容器
docker-compose exec mysql mysql -u appuser -p
# 备份数据卷
docker run --rm -v myapp_mysql_data:/volume -v $(pwd):/backup alpine \
tar czf /backup/mysql_backup.tar.gz -C /volume ./
# 更新配置后重启
docker-compose restart nginx
六、性能优化建议
-
MySQL 容器添加配置:
environment: TZ: Asia/Shanghai MYSQL_INNODB_BUFFER_POOL_SIZE: 512M -
Nginx 启用 Gzip 压缩(在
app.conf中添加):gzip on; gzip_types text/plain application/json; -
Redis 调整内存策略:
maxmemory 1gb maxmemory-policy volatile-lfu
提示:生产环境建议添加健康检查配置,并启用 TLS 加密通信。
通过此配置,您将获得一个安全、可扩展的容器化服务组合,可直接用于开发或生产环境部署。
更多推荐
所有评论(0)