我有一个使用 MySQL 镜像运行 docker 的 docker 容器。假设它叫做sql
。
这个容器有 2 个数据库:database1
和database2
我已经为每个数据库创建了特定的用户,比如user1
完全访问database1
和user2
完全访问database2
然后我有另外两个带有 PHP 镜像的 docker 容器。假设一个名为php1
和php2
。
所有 3 个容器、sql
和php1
都php2
在同一个 Docker 网络中运行
问题是,如果我授予权限user1
并user2
说:
GRANT ALL PRIVILEGES ON `database1`.* TO 'user1'@'php1';
GRANT ALL PRIVILEGES ON `database2`.* TO 'user2'@'php2';
然后如果我尝试使用以下命令登录php1
:
mysql -p -u user1 -h sql
它无法进行身份验证,因为它使用网络 IP(例如172.18.0.3
)来解析主机名,而不是使用主机名php1
这里的问题是,我读到 MySQL 中有一个配置,my.cnf
我不确定它是否与此有关,称为skip-name-resolve
但根据这篇文章:https://nixcp.com/skip-name-resolve/
即使这可以解决这个问题,但它会严重阻碍性能。
我想知道是否有人对这种情况有解决方案。
一种选择是将静态 IP 固定到每个 docker 实例,然后直接使用 IP 而不是名称进行身份验证。
但我想知道除了使用静态 IP 或删除skip-name-resolve
我完全忽略的指令之外是否还有更好的解决方案。
经过几个小时的思考,终于找到了一个最简单的解决办法
我没有在查询中使用主机名
GRANT
,而是仅使用“%”通配符来定位同一用户的所有主机。我在运行并检查了他们的表格后,通过查看 WordPress/MySQL docker composer 文件的生成方式,就得到了这个想法
User
。他们这样做本质上是为了解决问题。可能每个人都这样做,但如果你打算自己配置一切,也许你一开始并没有意识到这一点。