参照原文,本文只是整理了一下格式: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镜像版本(与前面拉取的镜像版本一致)。

注意事项

  1. 密码建议设置复杂一点(避免弱密码,生产环境更安全);
  2. 宿主机的映射目录(/docker/mysql/xxx)无需手动创建,Docker会自动创建;
  3. 若宿主机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. 容器未正常运行。

解决方案

  1. 检查容器状态:docker ps,确保mysql8容器处于Up状态;
  2. 检查防火墙端口:sudo firewall-cmd --list-ports,确保3306(或自定义端口)已开放;
  3. 重新执行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;                        # 刷新权限

更多推荐