使用 Docker-Compose 安装 MySQL 8.0

本指南将帮助您使用 Docker-Compose 快速部署最新版本的 MySQL 8.0 数据库。

前置要求

  • Docker 已安装并运行
  • Docker-Compose 已安装
  • 至少 2GB 可用内存
  • 至少 10GB 可用磁盘空间

快速开始

1. 创建项目目录

mkdir mysql-docker
cd mysql-docker

2. 创建 docker-compose.yml 文件

创建 docker-compose.yml 文件:

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql8-server
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_strong_password_here
      MYSQL_DATABASE: myapp
      MYSQL_USER: myuser
      MYSQL_PASSWORD: myuser_password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql-init:/docker-entrypoint-initdb.d
    command: --default-authentication-plugin=mysql_native_password
    networks:
      - mysql-network

volumes:
  mysql_data:
    driver: local

networks:
  mysql-network:
    driver: bridge

3. 创建初始化脚本(可选)

创建 mysql-init 目录并添加初始化 SQL 脚本:

mkdir mysql-init

mysql-init/init.sql 中添加:

-- 创建示例数据库和表
CREATE DATABASE IF NOT EXISTS sample_db;

USE sample_db;

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入示例数据
INSERT INTO users (username, email) VALUES
('admin', 'admin@example.com'),
('user1', 'user1@example.com');

4. 启动 MySQL 服务

# 启动服务(后台运行)
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs mysql

5. 连接到 MySQL

使用 MySQL 客户端:

# 安装 MySQL 客户端(如果尚未安装)
# Ubuntu/Debian: sudo apt-get install mysql-client
# macOS: brew install mysql-client

# 连接到 MySQL
mysql -h 127.0.0.1 -P 3306 -u root -p

进入容器内部:

# 进入 MySQL 容器
docker-compose exec mysql mysql -u root -p

# 或者进入容器 bash
docker-compose exec mysql bash

配置说明

环境变量

变量名 描述 默认值
MYSQL_ROOT_PASSWORD root 用户密码 必须设置
MYSQL_DATABASE 启动时创建的数据库名
MYSQL_USER 创建新用户名
MYSQL_PASSWORD 新用户密码
MYSQL_ALLOW_EMPTY_PASSWORD 允许 root 空密码 no

卷挂载说明

  • mysql_data:/var/lib/mysql: 持久化 MySQL 数据
  • ./mysql-init:/docker-entrypoint-initdb.d: 初始化脚本目录

网络配置

  • 默认使用 bridge 网络
  • 容器间可以通过服务名 mysql 通信

常用命令

# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 停止并删除数据卷(⚠️ 会删除所有数据)
docker-compose down -v

# 重启服务
docker-compose restart mysql

# 查看日志(实时)
docker-compose logs -f mysql

# 进入容器
docker-compose exec mysql bash

# 备份数据库
docker-compose exec mysql mysqldump -u root -p myapp > backup.sql

# 恢复数据库
docker-compose exec -T mysql mysql -u root -p myapp < backup.sql

生产环境配置

对于生产环境,建议使用以下增强配置:

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql8-prod
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql-prod.cnf:/etc/mysql/conf.d/custom.cnf
      - ./mysql-backups:/backups
    command: --default-authentication-plugin=mysql_native_password
    networks:
      - mysql-network
    security_opt:
      - no-new-privileges:true
    read_only: true
    tmpfs:
      - /tmp
      - /var/tmp

volumes:
  mysql_data:
    driver: local

networks:
  mysql-network:
    driver: bridge

创建环境变量文件 .env

MYSQL_ROOT_PASSWORD=your_very_strong_password_here
MYSQL_DATABASE=production_db
MYSQL_USER=app_user
MYSQL_PASSWORD=app_user_password

创建 MySQL 配置文件 mysql-prod.cnf

[mysqld]
# 性能优化
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 安全设置
skip-name-resolve
max_connections = 200
query_cache_size = 0
query_cache_type = 0

# 日志设置
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

故障排除

常见问题

  1. 容器启动失败

    # 检查日志
    docker-compose logs mysql
    
    # 检查端口占用
    lsof -i :3306
    
  2. 连接被拒绝

    • 确认密码正确
    • 检查防火墙设置
    • 验证服务是否正在运行
  3. 数据丢失

    • 确认使用持久化卷
    • 检查卷挂载路径

性能调优

  1. 内存配置:根据服务器内存调整 innodb_buffer_pool_size
  2. 连接数:根据应用需求调整 max_connections
  3. 日志配置:适当配置日志避免性能影响

安全建议

  1. 使用强密码
  2. 限制数据库用户权限
  3. 定期备份数据
  4. 监控数据库性能和日志
  5. 定期更新 MySQL 版本
  6. 在生产环境中使用 SSL 连接

备份策略

#!/bin/bash
# 自动备份脚本 backup-mysql.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/path/to/backups"
CONTAINER_NAME="mysql8-server"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份所有数据库
docker exec $CONTAINER_NAME mysqldump -u root -p$MYSQL_ROOT_PASSWORD --all-databases > $BACKUP_DIR/mysql_backup_$DATE.sql

# 压缩备份文件
gzip $BACKUP_DIR/mysql_backup_$DATE.sql

# 删除 7 天前的备份
find $BACKUP_DIR -name "mysql_backup_*.sql.gz" -mtime +7 -delete

echo "备份完成: $BACKUP_DIR/mysql_backup_$DATE.sql.gz"

版本更新

# 1. 备份数据
docker-compose exec mysql mysqldump -u root -p --all-databases > full_backup.sql

# 2. 停止服务
docker-compose down

# 3. 拉取最新镜像
docker-compose pull

# 4. 启动服务
docker-compose up -d

# 5. 验证数据完整性

相关链接


注意:在生产环境中使用前,请务必测试配置并根据实际需求调整参数。