【实战总结】Docker部署MySQL完整教程:附docker-compose模板与常用命令大全
使用 Docker 启动 MySQL 是一个非常常见且高效的部署方式。下面为您提供一份从基础到高级的完整指南。
一、基础启动方法
1. 最简单的启动方式
# 拉取最新版 MySQL 镜像(可选,run 时会自动拉取)
docker pull mysql:8.0# 启动 MySQL 容器
docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORD=my-secret-pw \-p 3306:3306 \mysql:8.0
2. 推荐的生产环境启动方式
docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORD=YourStrongPassword123! \-e MYSQL_DATABASE=myapp \-e MYSQL_USER=app_user \-e MYSQL_PASSWORD=AppUserPass123! \-p 3306:3306 \-v mysql_data:/var/lib/mysql \-v /host/mysql/conf:/etc/mysql/conf.d \--restart=unless-stopped \mysql:8.0
二、环境变量配置
核心环境变量
变量名 | 说明 | 示例 |
| 必需 root用户密码 | |
| 自动创建的数据库 | |
| 自动创建的用户 | |
| 自动用户的密码 | |
| 允许空密码 | |
| 生成随机root密码 | |
高级配置变量
docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORD=securepassword \-e MYSQL_INITDB_SKIP_TZINFO=1 \-e MYSQL_CHARSET=utf8mb4 \-e MYSQL_COLLATION=utf8mb4_unicode_ci \-p 3306:3306 \mysql:8.0
三、数据持久化
1. 使用 Docker Volume(推荐)
# 创建 volume
docker volume create mysql_data# 启动容器并使用 volume
docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORD=password \-v mysql_data:/var/lib/mysql \-p 3306:3306 \mysql:8.0
2. 使用主机目录
# 创建主机目录
mkdir -p /docker/mysql/data
mkdir -p /docker/mysql/conf# 启动容器并挂载目录
docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORD=password \-v /docker/mysql/data:/var/lib/mysql \-v /docker/mysql/conf:/etc/mysql/conf.d \-p 3306:3306 \mysql:8.0
四、配置文件定制
1. 创建自定义配置文件
# 创建配置目录
mkdir -p /docker/mysql/conf# 创建自定义配置文件
cat > /docker/mysql/conf/my.cnf << EOF
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-authentication-plugin=mysql_native_password# 性能优化
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
max_connections=1000# 日志配置
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2[client]
default-character-set=utf8mb4
EOF
2. 启动时应用配置
docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORD=password \-v /docker/mysql/data:/var/lib/mysql \-v /docker/mysql/conf:/etc/mysql/conf.d \-p 3306:3306 \mysql:8.0
五、网络配置
1. 使用自定义网络
# 创建自定义网络
docker network create mysql-network# 启动 MySQL
docker run -d \--name mysql-server \--network mysql-network \-e MYSQL_ROOT_PASSWORD=password \-p 3306:3306 \mysql:8.0# 其他容器连接到同一网络
docker run -d \--name web-app \--network mysql-network \-e DATABASE_URL=mysql://root:password@mysql-server:3306/myapp \my-web-app
2. 仅内部网络(不暴露端口)
docker run -d \--name mysql-internal \--network mysql-network \-e MYSQL_ROOT_PASSWORD=password \mysql:8.0
六、Docker Compose 部署
1. 基础 docker-compose.yml
version: '3.8'services:mysql:image: mysql:8.0container_name: mysql-serverenvironment:MYSQL_ROOT_PASSWORD: YourStrongPassword123!MYSQL_DATABASE: myappMYSQL_USER: app_userMYSQL_PASSWORD: AppUserPass123!ports:- "3306:3306"volumes:- mysql_data:/var/lib/mysql- ./conf:/etc/mysql/conf.dnetworks:- mysql-netrestart: unless-stoppedvolumes:mysql_data:networks:mysql-net:driver: bridge
2. 生产级 docker-compose.yml
version: '3.8'services:mysql:image: mysql:8.0container_name: mysql-productionenvironment:MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}MYSQL_DATABASE: ${MYSQL_DATABASE}MYSQL_USER: ${MYSQL_USER}MYSQL_PASSWORD: ${MYSQL_PASSWORD}ports:- "3306:3306"volumes:- mysql_data:/var/lib/mysql- ./mysql/conf:/etc/mysql/conf.d- ./mysql/init:/docker-entrypoint-initdb.dnetworks:- backendrestart: unless-stoppedhealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]timeout: 20sretries: 10adminer:image: adminercontainer_name: mysql-adminports:- "8080:8080"networks:- backendrestart: unless-stoppedvolumes:mysql_data:networks:backend:driver: bridge
环境变量文件 (.env):
MYSQL_ROOT_PASSWORD=YourSecureRootPassword123!
MYSQL_DATABASE=production_db
MYSQL_USER=app_user
MYSQL_PASSWORD=YourAppUserPassword123!
七、初始化脚本
1. 初始化数据库脚本
创建 init/01-init.sql
:
-- 创建额外数据库
CREATE DATABASE IF NOT EXISTS analytics;
CREATE DATABASE IF NOT EXISTS reporting;-- 创建专用用户
CREATE USER 'analytics_user'@'%' IDENTIFIED BY 'AnalyticsPass123!';
GRANT SELECT, INSERT, UPDATE ON analytics.* TO 'analytics_user'@'%';-- 创建初始表结构
USE myapp;
CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 启动时执行初始化
docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORD=password \-v ./init:/docker-entrypoint-initdb.d \-p 3306:3306 \mysql:8.0
八、常用管理命令
1. 容器管理
# 查看运行中的容器
docker ps# 查看 MySQL 日志
docker logs mysql-server# 实时查看日志
docker logs -f mysql-server# 进入容器
docker exec -it mysql-server bash# 进入 MySQL 命令行
docker exec -it mysql-server mysql -u root -p
2. 备份与恢复
# 备份数据库
docker exec mysql-server mysqldump -u root -p password myapp > backup.sql# 恢复数据库
docker exec -i mysql-server mysql -u root -p password myapp < backup.sql# 备份整个数据目录
docker stop mysql-server
tar -czf mysql_backup.tar.gz /docker/mysql/data
docker start mysql-server
九、故障排查
1. 检查容器状态
# 查看容器状态
docker ps -a# 查看资源使用情况
docker stats mysql-server# 检查网络
docker network ls
2. 常见问题解决
# 容器启动失败,查看日志
docker logs mysql-server# 端口被占用,更改端口
docker run -d ... -p 3307:3306 ...# 数据卷权限问题
docker run -d ... -v mysql_data:/var/lib/mysql:Z ...
3. 性能监控
# 进入 MySQL 监控
docker exec -it mysql-server mysql -u root -p -e "SHOW PROCESSLIST;"# 查看性能状态
docker exec -it mysql-server mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
十、安全最佳实践
1. 安全启动示例
docker run -d \--name mysql-secure \-e MYSQL_RANDOM_ROOT_PASSWORD=yes \-e MYSQL_USER=app_admin \-e MYSQL_PASSWORD=SecureAppPass123! \-e MYSQL_DATABASE=application_db \-p 3306:3306 \-v mysql_secure_data:/var/lib/mysql \--security-opt=no-new-privileges:true \--read-only \mysql:8.0
2. 使用 Secrets(Docker Swarm)
version: '3.8'services:mysql:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_passwordMYSQL_DATABASE: myappsecrets:- mysql_root_passwordvolumes:- mysql_data:/var/lib/mysqlsecrets:mysql_root_password:file: ./secrets/mysql_root_password.txt
十一、版本选择建议
版本标签 | 说明 | 使用场景 |
| 最新稳定版 | 推荐用于生产 |
| 老牌稳定版 | 兼容旧应用 |
| 最新版 | 测试环境 |
| 特定版本 | 生产环境(版本固定) |
推荐生产环境配置
# 生产环境启动命令
docker run -d \--name mysql-production \-e MYSQL_ROOT_PASSWORD=YourStrongPassword123! \-e MYSQL_DATABASE=production_db \-p 3306:3306 \-v mysql_production_data:/var/lib/mysql \-v /opt/mysql/conf:/etc/mysql/conf.d \--restart=unless-stopped \--memory=2g \--cpus=2 \mysql:8.0
通过以上配置,您可以轻松地在 Docker 环境中部署和管理 MySQL,享受容器化带来的便捷性和可移植性。记得根据实际需求调整配置参数,并在生产环境中做好数据备份和安全防护。
另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。