必须挂载数据卷并显式指定utf8mb4字符集,否则重启丢数据、中文乱码;mysql_root_password为唯一必填项,端口冲突时改用-p 3307:3306,远程连接需--bind-address=0.0.0.0。

docker run 启动 MySQL 8.0 容器,3 分钟内就能连上用起来——前提是别跳过数据卷和字符集这两步,否则重启后数据丢了、中文存乱码,还得重来。
容器启动时必须挂载数据卷,否则重启即丢数据
MySQL 容器默认把数据存在 /var/lib/mysql,这是容器临时文件系统的一部分。一旦 docker rm 或宿主机重启,目录就清空了。
- 推荐用命名卷:
-v mysql8-data:/var/lib/mysql—— Docker 自动管理,不用手动建目录,也不用担心权限 - 若要用宿主机路径(比如调试或备份方便),必须确保目录存在且权限正确:
sudo chown -R 1001:1001 /mydata/mysql/data(MySQL 容器内用户 UID 是 1001) - 别只挂配置不挂数据:见过太多人挂了
/etc/mysql/conf.d却忘了/var/lib/mysql,结果配置生效了,但初始化完一重启库全空
连接失败?先检查 MYSQL_ROOT_PASSWORD 和端口映射
常见报错 Access denied for user 'root'@'172.17.0.1' 或 Can't connect to MySQL server on 'localhost:3306',90% 出在这两处。
-
MYSQL_ROOT_PASSWORD是唯一必填环境变量,漏设或密码含特殊字符(如$、!)没加引号,容器会直接退出(docker logs mysql8能看到错误) - 端口冲突很常见:如果宿主机已跑着原生 MySQL,
-p 3306:3306会失败,改成-p 3307:3306更稳妥 - 远程连接被拒?默认 MySQL 8.0 只监听
127.0.0.1,加--bind-address=0.0.0.0参数(或通过自定义my.cnf设置)
中文乱码?utf8mb4 必须在启动命令里显式指定
MySQL 8.0 默认字符集是 utf8mb4,但容器启动时不加参数,客户端连接仍可能 fallback 到 latin1,导致插入中文后查出来是问号或 Mojibake。
- 启动时加两个参数:
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci - 别指望只改
my.cnf就行——如果配置文件挂载晚于 mysqld 初始化,这些设置不会生效 - 验证方式:进容器执行
mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set%';",确认所有值都是utf8mb4
想自动建库建用户?用 MYSQL_DATABASE 和 MYSQL_USER
开发测试时总要反复删库重来,手动 CREATE DATABASE 太慢。Docker 镜像原生支持初始化逻辑,但有隐藏限制。
-
-e MYSQL_DATABASE=test_db会在首次启动时创建该库(仅第一次有效) -
-e MYSQL_USER=dev -e MYSQL_PASSWORD=dev123会创建用户并赋予该库的全部权限——但注意:这个用户**没有**对其他库(如mysql系统库)的操作权 - 别试图用
MYSQL_DATABASE创建多个库:它只接受单个库名,写成"db1,db2"会被当做一个库名处理
docker logs mysql8,比重试十次更省时间。











