1. Docker 安装 MySQL 完整指南
作为现代开发环境的标准配置,Docker 容器化部署 MySQL 已经成为开发者的必备技能。我在过去三年里用 Docker 部署过上百次 MySQL 实例,从个人开发环境到生产集群都有涉及。相比传统安装方式,Docker 版 MySQL 最明显的优势是环境隔离和版本切换的便捷性——你可以在同一台机器上运行 5.7 和 8.0 版本而不会产生冲突。
重要提示:生产环境部署 MySQL 容器时,务必做好数据卷持久化,否则容器删除后所有数据将丢失。我在第一次使用时曾因此丢失过测试数据。
1.1 为什么选择 Docker 版 MySQL
传统 MySQL 安装需要处理依赖库、配置文件路径、服务注册等一系列繁琐操作。而 Docker 方案通过以下特性解决了这些问题:
- 环境一致性:镜像包含所有依赖,避免"在我机器上能跑"的问题
- 快速部署:一条命令即可启动实例,重置环境只需删除容器
- 资源隔离:CPU/内存限制防止单个数据库耗尽主机资源
- 版本管理:通过标签切换版本(如
mysql:5.7和mysql:8.0)
实测对比:在 16GB 内存的 MacBook Pro 上,从下载镜像到可用实例,Docker 方案平均只需 2 分钟,而传统安装需要 15 分钟以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装准备与环境检查
2.1 Docker 环境配置
在开始之前,请确保已正确安装 Docker 引擎。不同系统的安装方式略有差异:
bash复制# Ubuntu/Debian
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
# CentOS/RHEL
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
# macOS
brew install --cask docker
验证安装是否成功:
bash复制docker --version # 应输出类似 Docker version 20.10.17 的信息
docker run hello-world # 测试基础功能
如果遇到虚拟化支持问题(特别是 Windows 系统),需要:
- 进入 BIOS 启用 VT-x/AMD-V 虚拟化
- 对于 WSL2,执行:
powershell复制dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart wsl --set-default-version 2
2.2 资源规划建议
根据我的经验,MySQL 容器需要以下最小资源:
- 开发环境:1 CPU 核心 + 1GB 内存
- 测试环境:2 CPU 核心 + 2GB 内存
- 生产环境:4+ CPU 核心 + 8GB+ 内存(建议使用物理机或专用 VM)
查看和设置资源限制(Docker Desktop):
bash复制docker stats # 实时监控资源使用
docker update --memory 2g --memory-swap 4g <container_name> # 动态调整运行中容器
3. MySQL 容器部署实战
3.1 基础部署命令
最简启动方式(适合快速测试):
bash复制docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0
生产环境推荐配置:
bash复制docker run -d \
--name mysql-prod \
-p 3306:3306 \
-v /path/to/mysql/data:/var/lib/mysql \
-v /path/to/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=complex_password_123 \
-e MYSQL_DATABASE=app_db \
-e MYSQL_USER=app_user \
-e MYSQL_PASSWORD=user_password \
--restart unless-stopped \
--memory 4g \
--cpus 2 \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
参数解析:
-v挂载数据卷实现持久化(关键!)--restart确保容器崩溃后自动重启- 最后的参数设置 MySQL 使用 UTF8MB4 字符集(支持emoji等特殊字符)
3.2 配置文件定制
在挂载的配置目录(如 /path/to/mysql/conf)中创建 custom.cnf:
ini复制[mysqld]
max_connections = 200
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
skip-name-resolve
default-time-zone = '+8:00'
[client]
default-character-set = utf8mb4
重启容器应用配置:
bash复制docker restart mysql-prod
3.3 多版本管理技巧
同时运行 5.7 和 8.0 版本:
bash复制# MySQL 5.7
docker run -d --name mysql57 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=pass mysql:5.7
# MySQL 8.0
docker run -d --name mysql80 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=pass mysql:8.0
连接时指定不同端口即可访问对应版本:
bash复制mysql -h 127.0.0.1 -P 3307 -u root -p # 连接5.7
mysql -h 127.0.0.1 -P 3308 -u root -p # 连接8.0
4. 高级配置与优化
4.1 性能调优实战
根据容器内存调整关键参数(以 4GB 内存容器为例):
ini复制[mysqld]
innodb_buffer_pool_size = 2G # 总内存的50-70%
innodb_log_file_size = 256M # buffer pool的1/8
innodb_flush_log_at_trx_commit = 2 # 非关键数据可牺牲部分持久性换性能
innodb_flush_method = O_DIRECT
table_open_cache = 4000
监控性能指标:
bash复制# 查看慢查询
docker exec mysql-prod mysql -uroot -p -e "SHOW VARIABLES LIKE 'slow_query%';"
# 实时状态
docker exec mysql-prod mysqladmin -uroot -p extended-status
4.2 主从复制配置
主库配置:
bash复制docker run -d --name mysql-master \
-v ./master-conf:/etc/mysql/conf.d \
-v ./master-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=master_pass \
-e MYSQL_REPLICATION_USER=repl \
-e MYSQL_REPLICATION_PASSWORD=repl_pass \
mysql:8.0 \
--server-id=1 \
--log-bin=mysql-bin \
--binlog-format=ROW
从库配置:
bash复制docker run -d --name mysql-slave \
--link mysql-master:master \
-v ./slave-conf:/etc/mysql/conf.d \
-v ./slave-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=slave_pass \
mysql:8.0 \
--server-id=2
配置复制关系:
sql复制-- 在主库执行
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_pass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 在从库执行
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='repl',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=155;
START SLAVE;
5. 常见问题排查指南
5.1 启动失败排查
问题现象:容器立即退出,状态为 Exited (1)
排查步骤:
bash复制# 查看日志
docker logs mysql-container
# 常见原因及解决方案
1. 端口冲突:修改 -p 参数或停止占用3306端口的服务
2. 数据目录权限:确保挂载目录对容器用户可写(chmod 777 /path/to/data)
3. 内存不足:增加 --memory 参数或减少 innodb_buffer_pool_size
5.2 连接问题处理
错误信息:ERROR 2002 (HY000): Can't connect to MySQL server
解决方案:
bash复制# 检查容器状态
docker ps -a | grep mysql
# 如果容器未运行
docker start mysql-container
# 检查端口映射
docker port mysql-container # 应显示 3306/tcp -> 0.0.0.0:3306
# 测试容器内连接
docker exec -it mysql-container mysql -uroot -p
5.3 数据恢复方案
当容器崩溃后如何恢复数据:
bash复制# 1. 创建新容器挂载原有数据卷
docker run --name mysql-new -v /path/to/old/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=new_pass -d mysql:8.0
# 2. 如果无法启动,尝试数据导出
docker run --rm -v /path/to/old/data:/var/lib/mysql -v /backup:/backup mysql:8.0 \
bash -c "mysqldump -uroot -p$OLD_PASS --all-databases > /backup/full.sql"
# 3. 使用官方恢复工具
docker run --rm -v /path/to/old/data:/var/lib/mysql mysql:8.0 /usr/bin/mysql_upgrade
6. 生产环境最佳实践
经过多个生产项目验证的配置方案:
-
数据安全三重保障
- 每日自动备份到云存储
bash复制docker exec mysql-prod sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /backups/mysql-$(date +%Y%m%d).sql- 启用 binlog 实现时间点恢复
- 使用
--restart unless-stopped确保服务高可用
-
监控配置
bash复制# Prometheus 监控示例 docker run -d --name mysql-exporter \ --link mysql-prod \ -e DATA_SOURCE_NAME="root:password@(mysql-prod:3306)/" \ prom/mysqld-exporter -
连接池优化
ini复制[mysqld] max_connections = 500 thread_cache_size = 100 wait_timeout = 600 interactive_timeout = 600 -
安全加固措施
- 修改默认 root 密码
- 创建应用专用用户并限制权限
sql复制CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPass!123'; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'%';- 定期运行
mysql_secure_installation等效脚本
我在实际运维中发现,合理配置的 Docker 版 MySQL 性能可以达到物理机安装的 90% 以上,而管理效率提升显著。特别是在需要快速扩展或迁移的场景下,容器化方案的优势更加明显。
