从 0 到 1 完整流程:Docker 安装 MySQL(规避 3306 端口冲突)
·
1. 背景与整体思路
当本机已存在裸机安装的 MySQL 服务并占用 3306 端口时,直接使用 Docker 运行 MySQL 容器会产生端口冲突。本文提供一套完整的解决方案,核心思路如下:
- 处理冲突与残留容器:清理之前可能创建失败的容器,避免名称冲突。
- 使用备用端口创建容器:将宿主机的 3307 端口映射到容器内部的 3306 端口,规避 3306 端口占用。
- 配置容器时直接开放远程访问:通过环境变量
MYSQL_ROOT_HOST=%在创建时即允许 root 用户从任意 IP 连接,无需后续手动执行授权 SQL。 - 配置防火墙:在 Linux 宿主机上放行 3307 端口,确保外部工具(如 Navicat)可以访问。
- 远程连接验证:使用 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参数)。在此配置下,删除容器后,容器内所有的数据库数据会全部丢失。此方案仅适用于临时学习、测试环境,生产环境务必配置数据卷进行持久化。
更多推荐




所有评论(0)