Docker部署MySQL完整教程(图文实操,新手零踩坑)
参照原文,本文只是整理了一下格式:Docker部署MySQL完整教程(图文实操,新手零踩坑)
在日常开发、测试或生产环境中,MySQL是最常用的关系型数据库之一。传统方式部署MySQL需要配置环境、解决依赖冲突,流程繁琐且易出错。而使用Docker部署MySQL,可实现“一键部署、环境隔离、版本可控”,大幅简化部署流程,尤其适合新手入门和多环境复用。
本文将基于Linux系统(CentOS 7/8, Ubuntu通用),从零开始讲解Docker部署MySQL的完整步骤,包含Docker环境检查、MySQL镜像拉取、容器创建、端口映射、数据持久化、远程访问配置,以及部署后的验证和常见问题排查,每一步均附带实操命令和说明,确保新手也能跟着完成部署。
一、前置准备(必做)
部署前需确保Linux系统已安装Docker,且Docker服务正常运行。若未安装Docker,请先完成Docker的安装配置,以下是简要安装命令(CentOS为例),详细安装可参考Docker官方文档。
1.1 安装Docker(CentOS)
# 1. 卸载旧版本Docker(若有)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 2. 安装必要的依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 3. 设置Docker官方镜像源(阿里云镜像源,下载更快)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4. 安装Docker CE(社区版,免费常用)
sudo yum install docker-ce docker-ce-cli containerd.io -y
# 5. 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 6. 验证Docker是否安装成功(出现Docker版本信息即成功)
docker --version
1.2 验证Docker服务状态
# 查看Docker服务运行状态,active (running) 表示正常运行
sudo systemctl status docker
若Docker服务未启动,执行 sudo systemctl start docker 启动即可。
提示:Ubuntu系统安装Docker的命令略有不同,核心流程一致,可替换对应yum命令为apt命令(如yum install替换为apt install)。
二、Docker部署MySQL核心步骤(实操重点)
本次部署以MySQL 8.0为例(最常用版本),步骤分为:拉取MySQL镜像 → 创建MySQL容器 → 配置容器参数(端口、密码、数据持久化)→ 启动容器 → 验证部署,全程可复制命令执行,无需手动修改复杂配置。
2.1 拉取MySQL镜像
首先从Docker Hub(官方镜像仓库)拉取MySQL镜像,建议指定具体版本(避免默认latest版本带来的兼容性问题)。
# 拉取MySQL 8.0镜像(推荐,稳定常用)
docker pull mysql:8.0
# 若需拉取其他版本(如5.7),替换版本号即可
# docker pull mysql:5.7
# 拉取完成后,查看本地镜像(出现mysql镜像即成功)
docker images
说明:拉取速度取决于网络环境,若速度较慢,可配置Docker阿里云镜像加速器(文末附配置方法)。
2.2 创建MySQL容器(核心步骤)
容器是Docker的运行实例,创建容器时需配置关键参数:端口映射、MySQL root密码、数据持久化(避免容器删除后数据丢失)。以下是完整创建命令,复制后直接执行,记得替换其中的密码(自定义)。
# 完整创建命令(复制执行,替换【你的密码】为自定义密码,如123456)
docker run -d \
--name mysql8 \
-p 3306:3306 \
-v /docker/mysql/data:/var/lib/mysql \
-v /docker/mysql/conf:/etc/mysql/conf.d \
-v /docker/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=【你的密码】 \
-e MYSQL_CHARSET=utf8mb4 \
--restart=always \
mysql:8.0
命令参数详解(必看,理解每一步作用)
-d:后台运行容器(守护进程模式),避免占用终端;--name mysql8:给容器命名为mysql8(自定义,方便后续管理,如停止、重启容器);-p 3306:3306:端口映射,将宿主机(Linux)的3306端口映射到容器内的3306端口(外部可通过宿主机IP:3306访问MySQL);-v /docker/mysql/data:/var/lib/mysql:数据持久化,将容器内MySQL的数据目录映射到宿主机的/docker/mysql/data目录(容器删除后,数据仍保存在宿主机,不会丢失);-v /docker/mysql/conf:/etc/mysql/conf.d:配置文件映射,将宿主机的配置目录映射到容器内,后续修改MySQL配置无需进入容器;-v /docker/mysql/log:/var/log/mysql:日志映射,将MySQL日志输出到宿主机目录,方便查看日志排查问题;-e MYSQL_ROOT_PASSWORD=【你的密码】:设置MySQL root用户的密码(自定义,后续登录需要);-e MYSQL_CHARSET=utf8mb4:设置MySQL默认字符集为utf8mb4(支持表情符号,避免中文乱码);--restart=always:设置容器开机自启(宿主机重启后,MySQL容器自动启动,无需手动操作);mysql:8.0:指定使用的MySQL镜像版本(与前面拉取的镜像版本一致)。
注意事项:
- 密码建议设置复杂一点(避免弱密码,生产环境更安全);
- 宿主机的映射目录(
/docker/mysql/xxx)无需手动创建,Docker会自动创建; - 若宿主机3306端口已被占用(如已安装本地MySQL),需修改端口映射,如
-p 3307:3306(外部通过3307端口访问)。
2.3 查看容器状态(验证容器是否创建成功)
# 查看所有运行中的容器(出现mysql8容器,状态为Up即成功)
docker ps
# 若未找到,查看所有容器(包括停止的),确认容器是否创建
docker ps -a
# 若容器状态为Exited(停止),执行以下命令启动
# docker start mysql8
补充命令:停止容器 docker stop mysql8、重启容器 docker restart mysql8、删除容器 docker rm -f mysql8(删除前需停止容器)。
2.4 验证MySQL部署成功(进入容器登录MySQL)
容器启动后,进入容器内部,登录MySQL,验证是否能正常连接和操作。
# 1. 进入mysql8容器内部(替换mysql8为你的容器名)
docker exec -it mysql8 /bin/bash
# 2. 登录MySQL(输入前面设置的root密码,密码不显示,输入后回车即可)
mysql -u root -p
# 3. 登录成功后,执行以下命令查看数据库(出现系统默认数据库即正常)
show databases;
# 4. 退出MySQL
exit;
# 5. 退出容器
exit;
若能成功登录并查看数据库,说明MySQL部署已完成!
三、可选配置(提升实用性)
部署完成后,可根据需求进行可选配置,如开启远程访问(外部工具连接)、修改MySQL配置、设置时区等,以下是最常用的配置。
3.1 开启MySQL远程访问(必配,外部工具连接)
默认情况下,Docker中的MySQL只允许容器内访问,若需用本地Navicat、SQLyog等图形工具连接,需开启远程访问权限。
# 1. 进入容器并登录MySQL(步骤同2.4)
docker exec -it mysql8 /bin/bash
mysql -u root -p
# 2. 执行授权命令(允许root用户从任何IP远程访问,替换【你的密码】为实际密码)
ALTER USER 'root'@'%' IDENTIFIED BY '【你的密码】';
# 3. 刷新权限(使授权生效)
FLUSH PRIVILEGES;
# 4. 退出MySQL和容器
exit;
exit;
补充:开放宿主机防火墙端口(允许外部访问3306端口),CentOS命令如下:
# 开放3306端口(永久生效)
sudo firewall-cmd --permanent --add-port=3306/tcp
# 重新加载防火墙配置(使端口开放生效)
sudo firewall-cmd --reload
# 查看已开放的端口(确认3306端口已开放)
sudo firewall-cmd --list-ports
此时,本地图形工具可通过「宿主机IP:3306」、root用户名和密码,连接到Docker中的MySQL。
3.2 修改MySQL配置(如时区、最大连接数)
由于我们已做了配置文件映射,修改MySQL配置无需进入容器,直接在宿主机的映射目录下创建配置文件即可。
# 1. 进入宿主机MySQL配置目录
cd /docker/mysql/conf
# 2. 创建配置文件(my.cnf,自定义配置)
vim my.cnf
# 3. 写入以下配置(示例:设置时区、最大连接数)
[mysqld]
default-time-zone = '+8:00' # 设置时区为东八区(北京时间)
max_connections = 1000 # 设置最大连接数(根据需求调整)
# 4. 保存并退出(vim操作:按ESC,输入:wq回车)
# 5. 重启MySQL容器(使配置生效)
docker restart mysql8
四、常见问题排查(新手必看,避免踩坑)
部署过程中可能遇到各种问题,以下是最常见的4种问题及解决方案,覆盖90%的新手踩坑场景。
问题1: 拉取MySQL镜像速度极慢,甚至超时
原因:Docker默认使用官方镜像源,国内网络访问较慢。
解决方案:配置阿里云Docker镜像加速器,步骤如下:
# 1. 创建加速器配置目录(若不存在)
sudo mkdir -p /etc/docker
# 2. 写入加速器配置(复制整段命令执行)
sudo tee /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": ["https://docker.mirrors.aliyun.com"]
}
EOF
# 3. 重新加载配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 4. 验证加速器是否生效(出现Registry Mirrors即成功)
docker info
问题2: 容器创建失败,提示“port is already allocated”
原因:宿主机3306端口已被占用(如已安装本地MySQL,或其他容器占用)。
解决方案:修改端口映射,将宿主机端口改为未被占用的端口,如3307,修改后的创建命令片段:-p 3307:3306,重新执行容器创建命令。
问题3: 远程连接MySQL失败,提示“无法连接到主机”
原因:大概率是3个问题之一——1. 宿主机防火墙未开放对应端口;2. MySQL未开启远程访问权限;3. 容器未正常运行。
解决方案:
- 检查容器状态:
docker ps,确保mysql8容器处于Up状态; - 检查防火墙端口:
sudo firewall-cmd --list-ports,确保3306(或自定义端口)已开放; - 重新执行3.1的远程访问授权命令,确保授权生效。
问题4: 登录MySQL时,提示“Access denied for user ‘root’@‘localhost’ (using password: YES)”
原因:输入的密码错误,或密码设置时出现拼写错误。
解决方案:确认密码与容器创建时MYSQL_ROOT_PASSWORD参数设置的一致;若忘记密码,可重置MySQL密码(文末附重置方法)。
五、补充技巧(实用进阶)
5.1 查看MySQL容器日志(排查问题常用)
# 查看mysql8容器实时日志(按Ctrl+C退出)
docker logs -f mysql8
# 查看日志最后100行(快速定位最新问题)
docker logs --tail 100 mysql8
5.2 重置MySQL root密码(忘记密码时使用)
# 1. 停止MySQL容器
docker stop mysql8
# 2. 重新启动容器,跳过权限验证(临时)
docker run -d \
--name mysql8-temp \
-p 3306:3306 \
-v /docker/mysql/data:/var/lib/mysql \
--privileged=true \
mysql:8.0 \
mysqld --skip-grant-tables
# 3. 新开一个终端,进入临时容器并登录MySQL
docker exec -it mysql8-temp /bin/bash
mysql -u root
# 4. 重置密码(替换【新密码】为自定义密码)
use mysql;
UPDATE user SET authentication_string=PASSWORD('【新密码】') WHERE user='root';
FLUSH PRIVILEGES;
exit;
# 5. 停止并删除临时容器,重启原容器
docker stop mysql8-temp
docker rm mysql8-temp
docker restart mysql8
5.3 备份MySQL数据(重要,避免数据丢失)
# 备份MySQL所有数据到宿主机/docker/mysql/backup目录(替换【你的密码】)
docker exec mysql8 mysqldump -u root -p【你的密码】 --all-databases > /docker/mysql/backup/all-db-backup.sql
# 备份指定数据库(如test数据库)
docker exec mysql8 mysqldump -u root -p【你的密码】 test > /docker/mysql/backup/test-db-backup.sql
六、总结
本文详细讲解了Docker部署MySQL 8.0的完整流程,从Docker环境准备、镜像拉取、容器创建,到后续的远程访问配置、常见问题排查,全程实操落地,新手只需跟着复制命令、按步骤执行,即可完成部署。
相比传统部署方式,Docker部署MySQL的优势在于“环境隔离、一键部署、可移植性强”,无论是开发测试环境还是小型生产环境,都非常适用。后续若需迁移MySQL,只需复制宿主机的映射目录(/docker/mysql)和容器创建命令,即可在另一台Docker环境中快速恢复。
如果部署过程中遇到其他问题,欢迎在评论区留言,我会及时回复解答;若本文对你有帮助,记得点赞+收藏,关注我,持续分享Docker、Linux、数据库相关实操教程!
附:常用命令汇总(收藏即用)
Docker相关
docker --version # 查看Docker版本
sudo systemctl start docker # 启动Docker服务
sudo systemctl status docker # 查看Docker服务状态
MySQL容器相关
docker pull mysql:8.0 # 拉取MySQL 8.0镜像
docker run ...(完整创建命令) # 创建MySQL容器
docker ps # 查看运行中的容器
docker start mysql8 # 启动MySQL容器
docker stop mysql8 # 停止MySQL容器
docker restart mysql8 # 重启MySQL容器
docker exec -it mysql8 /bin/bash # 进入容器
docker logs -f mysql8 # 查看容器日志
MySQL操作相关
mysql -u root -p # 登录MySQL
show databases; # 查看所有数据库
ALTER USER 'root'@'%' IDENTIFIED BY '密码'; # 开启远程访问
FLUSH PRIVILEGES; # 刷新权限
更多推荐


所有评论(0)