1. 背景与整体思路

当本机已存在裸机安装的 MySQL 服务并占用 3306 端口时,直接使用 Docker 运行 MySQL 容器会产生端口冲突。本文提供一套完整的解决方案,核心思路如下:

  1. 处理冲突与残留容器:清理之前可能创建失败的容器,避免名称冲突。
  2. 使用备用端口创建容器:将宿主机的 3307 端口映射到容器内部的 3306 端口,规避 3306 端口占用。
  3. 配置容器时直接开放远程访问:通过环境变量 MYSQL_ROOT_HOST=% 在创建时即允许 root 用户从任意 IP 连接,无需后续手动执行授权 SQL。
  4. 配置防火墙:在 Linux 宿主机上放行 3307 端口,确保外部工具(如 Navicat)可以访问。
  5. 远程连接验证:使用 Navicat 等数据库客户端通过宿主机 IP 和 3307 端口进行连接测试。

此方案适用于临时学习、测试环境,不涉及数据持久化卷配置,删除容器后数据会丢失。

2. 完整分步操作指南

2.1 检查并拉取 MySQL 镜像

首先,查看本地是否已有 MySQL 8.0 镜像。

docker images

如果没有 mysql:8.0 镜像,建议使用国内镜像源(如清华镜像)加速拉取。

# 拉取镜像
docker pull mirrors.tuna.tsinghua.edu.cn/library/mysql:8.0
# 为镜像打上标准标签
docker tag mirrors.tuna.tsinghua.edu.cn/library/mysql:8.0 mysql:8.0

2.2 清理残留容器

如果之前创建容器失败或存在名称冲突,需要先清理。请将以下命令中的容器 ID 替换为你实际报错的容器 ID。

# 替换 a11c5b8321a0 为你自己报错输出的容器ID
docker rm a11c5b8321a0

2.3 创建 MySQL 容器(映射 3307 端口)

执行以下命令创建并后台运行 MySQL 容器。关键参数 -p 3307:3306 将宿主机的 3307 端口映射到容器内的 MySQL 默认端口 3306,从而避开本机裸机 MySQL 对 3306 端口的占用。

docker run -d \
  --name mysql8 \
  -p 3307:3306 \
  -e MYSQL_ROOT_PASSWORD=Root@123456 \
  -e MYSQL_ROOT_HOST=% \
  mysql:8.0

参数说明:

  • -p 3307:3306:宿主机端口:容器内部端口。此处使用 3307 规避冲突。
  • -e MYSQL_ROOT_HOST=%:设置 root 用户可以从任何主机(%)远程连接,创建容器时即完成授权。
  • -e MYSQL_ROOT_PASSWORD=Root@123456:设置 root 用户的密码。
  • --name mysql8:为容器指定一个名称,便于管理。

2.4 防火墙配置(Linux 宿主机)

如果宿主机防火墙(如 firewalld)开启,需要放行 3307 端口,否则外部客户端无法连接。

# 永久添加 3307 端口规则
firewall-cmd --add-port=3307/tcp --permanent
# 重新加载防火墙配置
firewall-cmd --reload

2.5 验证容器运行状态

使用以下命令检查容器是否正常运行。

docker ps

如果创建成功,输出列表中会出现名为 mysql8 的容器,且 PORTS 字段显示为 0.0.0.0:3307->3306/tcp

2.6 使用 Navicat 远程连接

在 Navicat 中新建 MySQL 连接,配置如下:

  • 主机:虚拟机的 IP 地址(或宿主机 IP,如 127.0.0.1)
  • 端口3307(注意不是 3306)
  • 用户名:root
  • 密码:Root@123456

配置完成后点击“测试连接”,成功即可。

3. Docker 版 MySQL 核心特点与注意事项

  • 镜像与容器:Docker 镜像只是一个离线安装包,执行 docker run 命令后才会生成一个可运行的数据库容器实例。
  • 远程访问配置:通过 MYSQL_ROOT_HOST=% 参数在创建容器时直接开放 root 账户的远程访问权限,无需再手动登录容器执行 GRANT 授权语句。
  • 端口映射:格式为 宿主机端口:容器内部端口。当宿主机 3306 端口被占用时,更换为其他可用端口(如 3307)即可轻松规避冲突。
  • 数据持久性警告:本文未配置数据挂载卷(-v 参数)。在此配置下,删除容器后,容器内所有的数据库数据会全部丢失。此方案仅适用于临时学习、测试环境,生产环境务必配置数据卷进行持久化。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐