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-apps2. 创建环境变量文件
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
EOF4. 启动 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
评论