必须指定-p映射端口和-e设置root密码才能连接mysql容器;推荐使用mysql:8镜像并挂载命名卷持久化数据;连接失败时优先检查容器状态和日志。

用 docker run 一条命令跑起 MySQL 容器,但连不上?
默认不加参数直接 docker run -d mysql 启动的容器,根本没法从宿主机连接——它没暴露端口,也没设 root 密码,还用了随机初始化数据目录。
- 必须显式指定
-p 3306:3306把容器 3306 映射到宿主机(否则localhost:3306就是空的) - 必须通过
-e MYSQL_ROOT_PASSWORD=123456设置密码,否则容器启动失败并报错MYSQL_ROOT_PASSWORD not set - 如果想跳过初始化(比如已有数据卷),得加
--skip-initialization,但普通初学者别碰这个,容易挂掉
mysql:8 和 mysql:5.7 镜像选哪个?
除非你维护老项目,否则无脑选 mysql:8。5.7 的 mysql_native_password 认证插件在新客户端(如 MySQL 8.0+ 客户端、DBeaver 23+、Navicat 16+)里默认被禁用,连上就报 Authentication plugin 'caching_sha2_password' cannot be loaded。
-
mysql:8默认用caching_sha2_password,安全且兼容新工具;如果非要连旧应用,启动时加-e MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password -
mysql:5.7已停止官方维护(2023 年 10 月起),CVE 补丁不再更新 - 镜像体积差异不大,
mysql:8.0约 512MB,mysql:5.7约 490MB,别为省几十 MB 冒安全风险
怎么让数据库重启后数据不丢?
容器删了,里面的数据就没了。关键不是“怎么备份”,而是“第一次启动就必须挂载数据卷”。
- 用命名卷最省心:
docker run -d -v mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name my-mysql mysql:8,mysql-data会自动创建并持久化 - 别用宿主机绝对路径(比如
-v /home/user/mysql:/var/lib/mysql),权限不对会导致容器启动卡在Initializing database,日志里反复刷mysqld: Can't create/write to file - 挂载点必须是空目录或命名卷,不能复用已存的非 MySQL 数据目录,否则初始化失败且无明确提示
从宿主机连容器 MySQL 总是 Connection refused?
不是密码错,也不是端口错,大概率是容器没真正跑起来,或者防火墙/SELinux 拦了映射端口。
- 先确认容器状态:
docker ps -f name=my-mysql,看 STATUS 是不是healthy或至少运行中;如果秒退,立刻执行docker logs my-mysql查最后一行错误 - Mac / Windows 用户注意:
localhost能连,但127.0.0.1可能连不上(Docker Desktop 网络栈差异),统一用localhost - Linux 用户若开 firewall,记得放行:
sudo ufw allow 3306;SELinux 开启时需加:z标签(如-v mysql-data:/var/lib/mysql:z)
真正麻烦的从来不是命令敲几遍,而是容器日志里那句没被看到的 Starting MySQL database server: mysqld failed! —— 它后面跟着的才是根因。











