以下是一个使用 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


三、部署操作步骤

  1. 创建项目目录

    mkdir myapp && cd myapp
    mkdir -p nginx/{conf.d,html} mysql redis
    

  2. 添加配置文件

    • 将上述配置内容写入对应文件
    • nginx/html/index.html 添加测试页面
  3. 启动服务

    docker-compose up -d
    

  4. 验证服务状态

    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
    


四、关键配置说明

  1. 网络隔离

    • frontend 网络:暴露 Nginx 80 端口
    • backend 网络:内部服务通信(MySQL/Redis)
  2. 数据持久化

    • MySQL 数据存储在 mysql_data
    • Redis AOF 持久化通过 appendonly yes 启用
  3. 安全增强

    • MySQL 禁用 root 远程登录(通过 init.sql 创建应用用户)
    • Redis 启用密码认证
    • 使用非 root 容器用户(Alpine 镜像)

五、常用运维命令

# 查看日志
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


六、性能优化建议

  1. MySQL 容器添加配置:

    environment:
      TZ: Asia/Shanghai
      MYSQL_INNODB_BUFFER_POOL_SIZE: 512M
    

  2. Nginx 启用 Gzip 压缩(在 app.conf 中添加):

    gzip on;
    gzip_types text/plain application/json;
    

  3. Redis 调整内存策略:

    maxmemory 1gb
    maxmemory-policy volatile-lfu
    

提示:生产环境建议添加健康检查配置,并启用 TLS 加密通信。

通过此配置,您将获得一个安全、可扩展的容器化服务组合,可直接用于开发或生产环境部署。

更多推荐