Docker 下安装 MySQL 全面指南(优化增强版)
使用 Docker 安装 MySQL 可以极大简化部署流程,同时方便迁移与扩容。本文将提供从快速安装到生产优化的完整方案,并涵盖常见问题的解决方法。
一、快速安装
1. 拉取镜像
建议根据项目需要选择版本:
- MySQL 5.7:兼容性好,适合老项目
- MySQL 8.0:新特性多,性能更好,但部分旧客户端不兼容
# 拉取最新 MySQL 8.0
docker pull mysql:8.0
# 拉取 MySQL 5.7
docker pull mysql:5.7
2. 启动容器(基础版)
docker run -d \
--name mysql-server \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
mysql:8.0
3. 推荐配置(带持久化与字符集)
mkdir -p /docker/mysql/data /docker/mysql/conf.d
# 创建自定义配置文件
cat > /docker/mysql/conf.d/custom.cnf <<EOF
[mysqld]
max_connections = 200
innodb_buffer_pool_size = 256M
default-time-zone = '+08:00'
EOF
docker run -d \
--name mysql-server \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=myapp \
-e MYSQL_USER=appuser \
-e MYSQL_PASSWORD=apppass \
-p 3306:3306 \
-v /docker/mysql/data:/var/lib/mysql \
-v /docker/mysql/conf.d:/etc/mysql/conf.d \
--restart unless-stopped \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
二、生产环境优化建议
- 强密码策略
- 避免简单密码(尤其是 123456)
- 可用随机密码生成器:openssl rand -base64 16
- 限制 root 远程登录
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'root'@'%';
- 时区设置
- 启动时添加 -e TZ=Asia/Shanghai
- MySQL 配置 default-time-zone = '+08:00'
- 持久化存储
- 确保数据目录挂载到宿主机或持久卷(防止容器删除导致数据丢失)
- 备份策略
- 定期 mysqldump 或 mysqlpump
- 可结合 cron + Docker Volume 实现自动备份
三、容器管理与运维
1. 进入容器
docker exec -it mysql-server bash
docker exec -it mysql-server mysql -uroot -p
2. 查看日志
docker logs -f mysql-server
3. 控制容器
docker stop mysql-server
docker start mysql-server
docker restart mysql-server
四、Docker Compose 部署
docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql-server
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
TZ: Asia/Shanghai
volumes:
- ./data:/var/lib/mysql
- ./conf.d:/etc/mysql/conf.d
ports:
- "3306:3306"
restart: unless-stopped
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
启动:
docker-compose up -d
五、常见问题排查
问题 | 原因 | 解决方案 |
Can't connect to MySQL server | 端口未开放或容器未启动 | 检查 docker ps 和防火墙设置 |
Access denied for user | 密码或用户权限错误 | 确认 MYSQL_USER 和权限设置 |
Old authentication protocol | 客户端不支持 caching_sha2_password | 改用 mysql_native_password |
Data loss after container restart | 未持久化数据卷 | 使用 -v /path:/var/lib/mysql 持久化数据 |
时区不正确 | 默认 UTC | 设置 TZ 环境变量和 MySQL 配置 |
六、连接方式
- 主机连接
mysql -h 127.0.0.1 -P 3306 -u root -p
- 容器间连接
- 同一网络下使用服务名连接(如 mysql-server)
七、总结
- 开发环境:快速启动,方便调试
- 生产环境:必须配置持久化、时区、强密码、定期备份
- 版本选择:新项目建议用 8.0,老项目慎重升级
- 安全性:最小权限原则,限制 root 远程访问