简介:本文通过分步图解和详细说明,指导开发者在Docker容器中快速部署MySQL8.0数据库,涵盖环境准备、容器配置、持久化存储及性能优化等关键环节。
在Linux系统(推荐Ubuntu 20.04+)上执行以下命令安装Docker:
sudo apt updatesudo apt install docker.iosudo systemctl enable --now docker
验证安装结果:
docker --version # 应显示版本号如Docker 20.10.17docker run hello-world # 测试容器运行
建议为MySQL容器分配独立磁盘空间:
/var/lib/mysql-docker目录/etc/fstab添加持久化挂载(示例):
/dev/sdb1 /var/lib/mysql-docker ext4 defaults 0 0
参数详解:
docker run --name mysql8 \-e MYSQL_ROOT_PASSWORD=YourStrongPassword \-e MYSQL_DATABASE=app_db \-e MYSQL_USER=app_user \-e MYSQL_PASSWORD=user_pass \-p 3306:3306 \-v /var/lib/mysql-docker:/var/lib/mysql \-d mysql:8.0
-e:设置环境变量(密码复杂度需≥12位,包含大小写字母、数字和特殊字符)-p:端口映射(建议限制为本地IP访问)-v:数据卷持久化(避免使用主机目录直接映射)创建自定义配置文件my-custom.cnf:
[mysqld]default_authentication_plugin=mysql_native_passwordinnodb_buffer_pool_size=2Gmax_connections=200character_set_server=utf8mb4collation_server=utf8mb4_unicode_ci
通过--config-file参数加载:
docker run ... -v /path/to/my-custom.cnf:/etc/mysql/conf.d/custom.cnf ...
docker network create mysql-netdocker run --network=mysql-net ...
sudo ufw allow from 192.168.1.0/24 to any port 3306
生成证书后挂载到容器:
-v /path/to/certs:/etc/mysql/ssl \-e MYSQL_TLS_MODE=REQUIRED
# 创建备份容器docker exec mysql8 sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases' > backup.sql# 定时任务示例(crontab)0 3 * * * /usr/bin/docker exec mysql8 /usr/bin/mysqldump -uroot -p"$(docker exec mysql8 env | grep MYSQL_ROOT_PASSWORD | cut -d= -f2)" --all-databases | gzip > /backups/mysql_$(date +\%Y\%m\%d).sql.gz
docker stats mysql8# 或进入容器执行docker exec -it mysql8 mysqladmin -uroot -p ext | grep -i "questions\|innodb"
| 现象 | 解决方案 |
|---|---|
| 容器启动失败 | 检查docker logs mysql8中的错误日志 |
| 连接拒绝 | 验证-p参数和防火墙设置 |
| 性能下降 | 调整innodb_buffer_pool_size参数 |
| 数据丢失 | 检查数据卷挂载是否正确 |
# 实时查看错误日志docker exec -it mysql8 tail -f /var/log/mysql/error.log# 查询慢查询日志(需提前配置)docker exec -it mysql8 mysqldumpslow -s t /var/log/mysql/mysql-slow.log
主节点配置:
[mysqld]server-id=1log_bin=mysql-binbinlog_format=ROW
从节点启动命令:
docker run --name mysql8-slave \-e MYSQL_ROOT_PASSWORD=... \-e REPLICATION_USER=repl \-e REPLICATION_PASSWORD=... \--network=mysql-net \-d mysql:8.0 --replicate-do-db=app_db
docker run ... --memory="4g" --memory-swap="4g" --cpus="2.0" ...
docker stop mysql8docker rm mysql8
docker pull mysql:8.0.33docker run ... mysql:8.0.33 ...
# 启动新版本容器docker run --name mysql8-new ... -d mysql:8.0.33# 验证后切换流量# 回滚方案:docker stop mysql8-new; docker start mysql8
-- 分析慢查询EXPLAIN SELECT * FROM users WHERE name LIKE '%test%';-- 添加合适索引ALTER TABLE users ADD INDEX idx_name (name);
CREATE USER 'app_reader'@'%' IDENTIFIED BY 'secure_pass';GRANT SELECT ON app_db.* TO 'app_reader'@'%';
[mysqld]audit_log=ONaudit_log_file=/var/log/mysql/audit.log
graph TDA[环境检查] --> B[创建数据卷]B --> C[启动容器]C --> D{启动成功?}D -->|是| E[配置验证]D -->|否| F[日志分析]E --> G[连接测试]F --> H[参数调整]H --> CG --> I[生产就绪]
通过以上系统化的部署方案,开发者可以在30分钟内完成从环境准备到生产就绪的完整流程。建议定期执行docker system prune清理无用资源,并建立完善的监控告警机制。对于高可用场景,可结合Kubernetes Operator实现自动化管理。