mysql容器必须挂载/var/lib/mysql目录,否则重启或删除后数据丢失;推荐命名卷docker run -v mysql-data:/var/lib/mysql,初始化sql放/docker-entrypoint-initdb.d/,配置文件置于/etc/mysql/conf.d/并只读挂载。

直接用 docker run 挂载宿主机目录最省事
不需要提前创建 volume,也不用写 docker-compose.yml,一条命令就能跑起来,适合开发、测试或单机部署。关键就是把宿主机的目录(比如 /opt/mysql/data)映射到容器的 /var/lib/mysql。
常见错误现象:docker run 启动后容器立刻退出,docker logs mysql-container 显示 mysqld: Can't read dir of '/etc/mysql/conf.d/' 或权限拒绝 —— 这通常是因为挂载路径已存在旧数据但属主不是 MySQL 用户,或者宿主机目录权限太严(如 root-only)。
- 先创建干净目录:
mkdir -p /opt/mysql/{data,conf} - 写个最小配置
/opt/mysql/conf/my.cnf,只保留[mysqld]段和character-set-server=utf8mb4,避免加载空文件出错 - 运行命令时用
-v /opt/mysql/data:/var/lib/mysql和-v /opt/mysql/conf:/etc/mysql/conf.d,不要挂到/etc/mysql/my.cnf(会覆盖默认配置) - 加
--user 999:999(MySQL 官方镜像中 mysql 用户 UID/GID 是 999)可绕过多数权限问题
docker volume create 创建命名卷更稳妥
命名卷由 Docker 管理,自动处理权限、路径初始化和 SELinux 上下文,适合生产环境或需要多容器共享数据的场景。它不会像 bind mount 那样受宿主机文件系统权限拖累。
使用场景:你不想暴露宿主机绝对路径,或部署在不同 Linux 发行版上要保证行为一致;CI/CD 流水线中需要可重复的干净数据状态。
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- 创建:
docker volume create mysql-data - 启动时挂载:
-v mysql-data:/var/lib/mysql,不用指定宿主机路径 - 查看实际位置:
docker volume inspect mysql-data→ 查Mountpoint字段,通常是/var/lib/docker/volumes/mysql-data/_data - 注意:命名卷不支持直接编辑文件(比如改
my.cnf),配置还得靠 bind mount 或构建自定义镜像
挂载配置文件必须放在 /etc/mysql/conf.d/
MySQL 8.0 官方镜像启动时会顺序加载 /etc/mysql/my.cnf → /etc/mysql/conf.d/*.cnf → /etc/mysql/mysql.conf.d/*.cnf。如果你把配置挂到 /etc/mysql/my.cnf,会完全跳过默认配置,导致 skip-networking 或 bind-address 缺失,外部连不上。
典型错误:mysql -h 127.0.0.1 -P 3306 -u root -p 报 Can't connect to MySQL server,但 docker exec -it mysql-container mysql -uroot -p 能进 —— 就是配置没生效或监听被禁了。
- 正确做法:挂载单个文件到
/etc/mysql/conf.d/custom.cnf(后缀必须是.cnf) - 文件内容开头必须是
[mysqld],不能有 BOM 或 Windows 换行符 - 关键项建议显式写出:
bind-address = 0.0.0.0、character-set-server = utf8mb4、default_authentication_plugin = mysql_native_password(兼容老客户端)
容器启动失败时优先检查 /var/lib/mysql 目录状态
这是挂载类故障最高发位置。MySQL 启动前会校验 ibdata1、mysql 系统库等是否存在且可读写。如果宿主机目录非空但不是合法 MySQL 数据目录,容器会静默退出。
容易被忽略的点:你上次用的是 MySQL 5.7 镜像,这次换 8.0,直接复用旧数据卷会导致升级失败;或者用 rm -rf /opt/mysql/data/* 清空目录,但没清掉隐藏的 .wh..wh.aufs 层(aufs 存储驱动下),残留元数据干扰初始化。
- 安全清空方法:
docker run --rm -v /opt/mysql/data:/target alpine rm -rf /target/* - 验证是否干净:
ls -A /opt/mysql/data应该无输出(第一次启动前) - 首次启动后,立刻
docker exec mysql-container ls /var/lib/mysql,确认出现mysql、sys、performance_schema等系统库目录 - 如果卡在
Starting MySQL不动,docker logs -f mysql-container最后几行大概率提示InnoDB initialization failure,基本就是数据目录状态异常










