mysql在Docker环境中快速部署与基础配置

11次阅读

一条命令即可运行可远程连接的mysql容器:docker run -d –name mysql-dev -e MYSQL_ROOT_PASSword=123456 -p 3306:3306 –restart=always -v /data/mysql:/var/lib/mysql mysql:8.0,需注意用户授权、配置挂载路径及数据卷权限。

mysql在Docker环境中快速部署与基础配置

直接拉起一个可连的 MySQL 容器

不需要构建镜像、不用改配置文件,docker run 一条命令就能跑起来一个带密码、可远程连接的 MySQL 实例,适合开发/测试快速验证。

  • 默认 root 密码通过 -e MYSQL_ROOT_PASSWORD=123456 设置,不设会启动失败
  • 端口映射必须显式声明:-p 3306:3306,否则容器内服务无法从宿主机访问
  • --restart=always 避免 Docker 重启后服务掉线
  • 首次运行会自动初始化数据目录,后续重启复用卷内容,不会重置密码或清库
docker run -d    --name mysql-dev    -e MYSQL_ROOT_PASSWORD=123456    -p 3306:3306    --restart=always    -v /data/mysql:/var/lib/mysql    -d mysql:8.0

连接被拒绝?检查 bind-address 和用户权限

容器内 MySQL 默认只监听 127.0.0.1,即使端口映射了,外部客户端也会报 Connection refusedaccess denied for user

  • MySQL 8.0+ 默认创建的 root@localhost 用户不能远程登录,必须额外授权 root@'%'
  • 启动时加 -e MYSQL_ROOT_HOST='%' 可让初始化脚本自动创建通配符主机用户(仅限 8.0.13+)
  • 若已启动,进容器执行 mysql -uroot -p123456 -e "CREATE USER 'root'@'%' IDENTIFIED BY '123456'; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"
  • 无需修改 my.cnf 中的 bind-address —— Docker 容器默认用 0.0.0.0 监听,问题几乎全出在用户权限上

挂载配置文件导致启动失败的常见原因

想自定义 max_connectionscharacter_set_server?别直接挂载整个 /etc/mysql/my.cnf,MySQL 容器启动逻辑对配置路径很敏感。

  • 官方镜像只认 /etc/mysql/conf.d/*.cnf/etc/mysql/mysql.conf.d/*.cnf 下的文件
  • 挂载单个配置文件时,路径必须是 /etc/mysql/conf.d/custom.cnf,且文件需有 unix 换行符(windows 编辑保存易出错)
  • 配置项写错格式(如漏掉 [mysqld] 段)会导致容器立即退出,docker logs mysql-dev 里会显示 unknown variableparse Error
  • 字符集相关配置(如 collation-server=utf8mb4_unicode_ci)必须和 init_connect 配合,否则客户端连接后仍可能用错编码
[mysqld] max_connections = 200 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4'

数据卷权限错误:container_linux.go:349: starting container process caused: chdir to cwd…no such file or Directory

这个错误不是路径不存在,而是宿主机挂载点(如 /data/mysql)权限不足,MySQL 进程(uid=999)无法写入。

  • 不要用 chmod 777 /data/mysql —— MySQL 容器启动时会校验目录属主,非 mysql:mysql(即 uid=999)会拒绝启动
  • 正确做法:宿主机上执行 sudo chown -R 999:999 /data/mysql(注意是数字 uid,不是用户名)
  • 如果用 Docker Compose,可在 service 下加 user: "999:999" 显式指定运行身份,避免依赖挂载点权限
  • 首次初始化后,目录里会出现 ibdata1mysql 等子目录,此时再改权限也无效,必须清空重来

Docker 里跑 MySQL 最容易卡在权限、用户授权、配置加载顺序这三处,问题现象相似但根因不同,查日志前先确认这三项是否都对得上。

text=ZqhQzanResources