Skip to content

Docker Compose 部署 MySQL

MySQL 作为最流行的开源关系型数据库之一,通过 Docker Compose 部署可以简化安装过程并确保环境一致性。以下是详细的部署方法和最佳实践。

一、基础部署方案

1. 单节点基础配置

yaml
version: "3.8"
services:
  mysql:
    image: mysql:8.0
    container_name: mysql-server
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: app_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: userpassword
      TZ: Asia/Shanghai
    ports:
      - "3306:3306"
    volumes:
      - ./data:/var/lib/mysql
      - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
    restart: unless-stopped

关键配置说明

  • MYSQL_ROOT_PASSWORD:设置 root 用户密码(生产环境建议使用复杂密码)
  • volumes:实现数据持久化和配置自定义
  • restart:确保容器异常退出后自动重启

2. 生产环境推荐配置

yaml
version: "3.8"
services:
  mysql:
    image: mysql:8.0.34
    container_name: production_mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      TZ: Asia/Shanghai
    ports:
      - "${DB_PORT}:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./config/my.cnf:/etc/mysql/conf.d/my.cnf:ro
    networks:
      - backend
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 2G
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3

volumes:
  mysql_data:
    driver: local
    driver_opts:
      type: none
      device: ./data/mysql
      o: bind

networks:
  backend:
    driver: bridge

生产环境增强特性

  • 资源限制防止单个服务耗尽主机资源
  • 健康检查确保服务可用性
  • 独立网络增强安全性
  • 使用环境变量文件(.env)管理敏感信息

二、高级配置技巧

1. 主从复制集群

yaml
services:
  mysql-master:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: masterpass
      MYSQL_REPLICATION_USER: repl_user
      MYSQL_REPLICATION_PASSWORD: repl_pass
    command:
      - --server-id=1
      - --log-bin=mysql-bin
      - --binlog-format=ROW
    volumes:
      - master_data:/var/lib/mysql
    networks:
      - mysql-cluster

  mysql-slave:
    image: mysql:8.0
    depends_on:
      - mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: slavepass
      MYSQL_MASTER_HOST: mysql-master
      MYSQL_MASTER_USER: repl_user
      MYSQL_MASTER_PASSWORD: repl_pass
    command:
      - --server-id=2
    volumes:
      - slave_data:/var/lib/mysql
    networks:
      - mysql-cluster

volumes:
  master_data:
  slave_data:

networks:
  mysql-cluster:
    driver: bridge

主从复制关键点

  • 每个节点需要唯一 server-id
  • 主节点需开启二进制日志
  • 从节点通过环境变量连接主节点

2. 多环境配置管理

使用扩展配置实现开发/生产环境差异化:

base-compose.yml (基础配置):

yaml
services:
  mysql:
    image: mysql:${MYSQL_VERSION:-8.0}
    volumes:
      - ${DATA_VOLUME:-mysql_data}:/var/lib/mysql

docker-compose.prod.yml (生产环境扩展):

yaml
services:
  mysql:
    extends:
      file: base-compose.yml
      service: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${PROD_DB_PASSWORD}
    deploy:
      resources:
        limits:
          memory: 4G

通过不同环境变量文件切换配置

三、安全加固方案

1. 基础安全配置

yaml
services:
  mysql:
    image: mysql:8.0
    user: "999:999" # 使用非root用户运行
    cap_drop:
      - ALL # 移除所有特权
    security_opt:
      - no-new-privileges:true
    environment:
      - MYSQL_SECURE_TRANSPORT=ON
      - MYSQL_SSL=ON
    volumes:
      - ./ssl:/etc/mysql/ssl # SSL证书目录

2. 网络隔离

yaml
networks:
  internal:
    internal: true # 内部专用网络
  external:
    driver: bridge

services:
  mysql:
    networks:
      - internal # 数据库只连接内部网络
  app:
    networks:
      - internal
      - external # 应用可连接内外网络

通过网络隔离限制数据库暴露范围

四、性能优化建议

1. 关键参数调优

在 my.cnf 配置文件中添加:

ini
[mysqld]
innodb_buffer_pool_size = 4G  # 物理内存的70%-80%
innodb_log_file_size = 1G
table_open_cache = 2000
max_connections = 500
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

2. 容器资源限制

yaml
deploy:
  resources:
    limits:
      cpus: "4"
      memory: 8G
    reservations:
      memory: 6G

根据服务器资源配置合理的资源限制

五、日常运维管理

1. 常用命令

bash
# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f mysql

# 执行备份
docker-compose exec mysql mysqldump -u root -p${DB_ROOT_PASSWORD} --all-databases > backup.sql

# 进入MySQL命令行
docker-compose exec mysql mysql -uroot -p

2. 备份与恢复方案

定时备份服务配置:

yaml
services:
  backup:
    image: mysql:8.0
    depends_on:
      - mysql
    volumes:
      - ./backups:/backups
    command: >
      sh -c 'while true; do 
        sleep 86400; 
        mysqldump -h mysql -u root -p$$MYSQL_ROOT_PASSWORD --all-databases | gzip > /backups/backup_$$(date +%Y%m%d).sql.gz; 
      done'
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}

数据恢复流程:

bash
# 停止服务
docker-compose stop mysql

# 恢复数据
docker-compose run --rm mysql bash -c "gunzip < /backups/backup_20230101.sql.gz | mysql -u root -p${DB_ROOT_PASSWORD}"

# 重启服务
docker-compose start mysql

确保重要数据定期备份

六、常见问题排查

  1. 容器启动后立即退出

    • 检查数据目录权限:chown -R 999:999 data(MySQL 容器默认 UID/GID)
    • 查看日志定位具体错误:docker-compose logs mysql
  2. 远程客户端无法连接

    • 确认防火墙规则放行端口
    • 检查 MySQL 用户权限设置
    sql
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
    FLUSH PRIVILEGES;
  3. 初始化脚本未执行

    • 确认 SQL 文件已放入/docker-entrypoint-initdb.d目录
    • 检查文件权限:chmod +x initdb/*.sql

通过以上方案,您可以快速构建适应不同场景的 MySQL 服务,从开发测试到生产环境都能获得良好的体验。根据实际业务需求调整配置参数,并定期进行压力测试以确保数据库性能满足要求。