【问题标题】:Cannot connect to mysql server (root) inside docker container executed with docker-compose: Access denied无法连接到使用 docker-compose 执行的 docker 容器内的 mysql 服务器(root):访问被拒绝
【发布时间】:2021-11-12 16:41:52
【问题描述】:

我正在使用 docker-compose 在 docker 容器内运行 mysql 服务器,这是我的 yaml 文件:

version: '3'
services:
 mysqltest:
  image: mysql
  network_mode: host
  ports:
   - "3306:3306"
  volumes:
   - "/home/myuser/bds/mysql/:/var/lib/mysql"
  user: "1000:1000"
  environment:
   - "MYSQL_ROOT_PASSWORD=mysecret"

容器使用 docker-compose up 命令加载文件,但是当我尝试使用 root 用户从主机连接到 mysql 服务器时,它失败了:

mysql -h 127.0.0.1 -u root -pmysecret
ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)

但是,如果我使用 docker 命令行启动容器,我可以使用相同的命令连接到容器内的服务器:

docker run -it --rm --name mysqltest --user 1000:1000 -v /home/myuser/bds/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysecret -p 3306:3306 -d mysql

我尝试将network_mode设置为host,none,也没有指定它,但是使用docker-compose的结果是一样的。

我的 YAML 文件可能有什么问题,导致我无法像使用 docker 命令一样连接?

提前致谢

【问题讨论】:

  • 对我来说,当我没有指定它时它可以工作(= 默认模式是桥接)。你的默认模式是什么?您可以检查: docker network ls 并搜索使用您的 docker-compose 创建的网络

标签: mysql docker docker-compose


【解决方案1】:

我假设您没有更改默认的 Docker 配置。默认情况下,Docker 将在网络模式下运行:'bridge' 而不是主机。看看区别here

您可以使用docker inspect container 进行检查。 当您使用命令启动容器时,您将以桥接模式启动容器,并且容器端口 3306 将映射到 3306。尝试主机时不会发生这种情况。再次查看不同之处的链接。

所以更新您的docker-compose.yaml 并将网桥定义为网络模式:

version: '3'
services:
 mysqltest:
  image: mysql
  network_mode: bridge
  ports:
   - "3306:3306"
  volumes:
   - "/home/myuser/bds/mysql/:/var/lib/mysql"
  user: "1000:1000"
  environment:
   - "MYSQL_ROOT_PASSWORD=mysecret"

【讨论】:

  • 我检查了我的 docker 安装的默认网络模式。它是桥接模式,所以在这种模式下,我可以使用命令行 docker 命令连接到 mysql 服务器来启动容器。我尝试在yaml文件中手动指定桥接网络模式,结果还是一样,还是无法从主机连接到服务器
  • 容器日志有什么特别之处吗?
  • 我没有查日志,我去看看。我开始怀疑它可能是mysql版本
【解决方案2】:

解决了!!问题源于使用不同的 docker 命令设置不同的 mysql root 密码:

  1. 我第一次测试容器时,我使用 std docker 命令和环境 MYSQL_ROOT_PASSWORD=othersecret。一切正常。我使用 mysql 命令从主机连接并恢复了数据库
  2. 完成测试后,我编写了 yaml 文件,但使用的是我想用于生产的 root 密码:
environment:
 MYSQL_ROOT_PASSWORD: "mysecret"

但是,当我使用 docker-compose 和 yaml 文件启动容器时,我无法使用 mysql 命令从主机连接。似乎原始 root 密码(“othersecret”)已写入 mysql 架构内的用户表,这就是为什么我无法使用 yaml 文件中设置的密码进行连接的原因。我清理了 mysql 目录并使用 docker-compose 启动了容器(没有指定网络模式),最后我能够从主机连接。

【讨论】:

  • 过几天,如果可以的话,请回到这里并将其标记为解决方案,以便其他人在遇到类似问题时知道该怎么做。谢谢。
  • 我现在试图标记它,但 SO 说我必须等一个小时,稍后再回来:)
猜你喜欢
  • 1970-01-01
  • 2018-10-23
  • 2019-10-05
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
相关资源
最近更新 更多