Docker 安装 MySQL 8 教程

使用 Docker Compose 部署 MySQL 8.0,目录结构清晰,便于管理和备份


目录结构

~/docker-apps/
├── docker-compose.yml      # Docker Compose 配置文件
├── .env                    # 环境变量(密码等敏感信息)
└── mysql8/                 # MySQL 数据目录
    ├── data/               # 数据库数据文件
    ├── conf/               # 自定义配置文件
    └── backup/             # 备份文件存放

安装步骤

1. 创建目录结构

mkdir -p ~/docker-apps/mysql8/{data,conf,backup}
cd ~/docker-apps

2. 创建环境变量文件

cat > .env << 'EOF'
# MySQL root 密码(必须修改!)
MYSQL_ROOT_PASSWORD=YourStrongRootPass123!
​
# 可选:自动创建的数据库
MYSQL_DATABASE=mydb
​
# 可选:自动创建的用户
MYSQL_USER=myuser
MYSQL_PASSWORD=MyUserPass456!
EOF

⚠️ 重要:务必修改密码!

3. 创建 docker-compose.yml

cat > docker-compose.yml << 'EOF'
version: '3.8'
​
services:
  mysql:
    image: mysql:8.0
    container_name: mysql8
    restart: unless-stopped
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE:-mydb}
      MYSQL_USER: ${MYSQL_USER:-myuser}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - ./mysql8/data:/var/lib/mysql
      - ./mysql8/conf:/etc/mysql/conf.d
      - ./mysql8/backup:/backup
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --default-authentication-plugin=mysql_native_password
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
      interval: 3s
      retries: 5
      start_period: 30s
​
networks:
  default:
    name: mysql_network
EOF

4. 启动 MySQL

docker compose up -d

等待 10-20 秒,MySQL 初始化完成。

5. 查看运行状态

# 查看容器状态
docker compose ps
​
# 查看日志
docker compose logs -f mysql

看到 ready for connections 说明启动成功,按 Ctrl+C 退出日志查看。

6. 验证安装

# 进入 MySQL 容器
docker compose exec mysql bash
​
# 登录 MySQL
mysql -u root -p
​
# 输入密码后,查看数据库
SHOW DATABASES;
EXIT;

常用操作

停止/启动/重启

cd ~/docker-apps
​
# 停止
docker compose down
​
# 启动
docker compose up -d
​
# 重启
docker compose restart

查看日志

# 查看全部日志
docker compose logs

# 实时跟踪日志
docker compose logs -f mysql

进入 MySQL 命令行

# 方式一:进入容器后登录
docker compose exec mysql bash
mysql -u root -p

# 方式二:直接执行命令
docker compose exec mysql mysql -u root -p

备份与恢复

自动备份脚本

创建备份脚本:

cat > ~/docker-apps/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="./mysql8/backup"
DATE=$(date +%Y%m%d_%H%M%S)

# 确保目录存在
mkdir -p ${BACKUP_DIR}

# 备份所有数据库
docker compose exec -T mysql mysqldump -u root -p${MYSQL_ROOT_PASSWORD} --all-databases > ${BACKUP_DIR}/all_databases_${DATE}.sql

# 备份指定数据库(取消注释使用)
# docker compose exec -T mysql mysqldump -u root -p${MYSQL_ROOT_PASSWORD} mydb > ${BACKUP_DIR}/mydb_${DATE}.sql

echo "备份完成: ${BACKUP_DIR}/all_databases_${DATE}.sql"
EOF

chmod +x backup.sh

执行备份:

cd ~/docker-apps
./backup.sh

恢复数据库

# 恢复指定备份
docker compose exec -i mysql mysql -u root -p < mysql8/backup/all_databases_20250402_120000.sql

定时自动备份(可选)

添加 crontab 任务:

# 编辑 crontab
crontab -e

# 添加每天凌晨 2 点自动备份
0 2 * * * cd ~/docker-apps && ./backup.sh >> backup.log 2>&1

远程连接配置

创建远程访问用户(推荐)

docker compose exec mysql mysql -u root -p

在 MySQL 中执行:

-- 创建远程访问用户
CREATE USER 'remote'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'remote'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

-- 查看用户
SELECT user, host FROM mysql.user;

防火墙开放端口

# OpenCloudOS / CentOS / RHEL
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload

⚠️ 安全提醒:生产环境建议限制 IP,不要开放 0.0.0.0/0


自定义配置

~/docker-apps/mysql8/conf/ 目录下创建自定义配置文件:

cat > ~/docker-apps/mysql8/conf/custom.cnf << 'EOF'
[mysqld]
# 最大连接数
max_connections = 200

# 缓冲池大小(根据服务器内存调整)
innodb_buffer_pool_size = 256M

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

重启生效:

docker compose restart

完全删除(清理数据)

cd ~/docker-apps

# 停止并删除容器
docker compose down

# 删除数据(谨慎操作!)
rm -rf mysql8/data/*

# 删除备份
rm -rf mysql8/backup/*

常见问题

Q: 连接时报 "caching_sha2_password" 错误

A: 已配置 mysql_native_password 认证方式,如果还有问题,执行:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;

Q: 中文乱码

A: 已配置 utf8mb4 字符集,创建数据库时默认就是 UTF-8

Q: 端口被占用

A: 修改 docker-compose.yml 中的端口映射,比如 "3307:3306"

Q: 容器启动后立刻退出

A: 查看日志 docker compose logs,通常是密码设置问题或权限问题

Q: 数据目录权限错误

A: 检查目录权限:

sudo chown -R 999:999 ~/docker-apps/mysql8/data

文档版本: 2026-04-01