docker - 如何设置与 docker 容器一起使用的 mysql 主机限制
问题描述
我正在将一个mysql:5容器(来自 docker hub 的图像)设置为与另一个容器(Web 服务器)共享的子网络。
我想将我的 mysql 用户限制为与 Web 服务器容器对应的主机。
如果我直接使用网络服务器容器 ip 限制它,它可以工作,但是由于 docker 环境,这个 ip 不能改变,所以我想要一些类似的东西:
GRANT ALL PRIVILEGES ON `db`.* TO 'user'@'container-name'
当我尝试连接服务器时响应:
用户 'user'@'172.18.0.4' 的访问被拒绝
其中 172.18.0.4 是 Web 服务器容器的正确 ip。
例子 :
docker-compose.yaml
version: '2'
services:
mysql1:
image: mysql
container_name: mysql1
ports:
- '3306:3306'
environment:
- MYSQL_ROOT_PASSWORD=rootpwd
mysql2:
image: mysql
container_name: mysql2
environment:
- MYSQL_ROOT_PASSWORD=rootpwd
向上容器
docker-compose up -d
在mysql1中创建用户
docker-compose exec mysql1 mysql -u root --password="rootpwd" -e "CREATE USER user@mysql2 IDENTIFIED BY 'pwd'; GRANT ALL PRIVILEGES ON * TO user@mysql2" sys
尝试通过用户从 mysql2 访问 mysql1
docker-compose exec mysql2 mysql -u user --password="pwd" -h mysql1 sys
错误 1045 (28000): 用户 'user'@'172.18.0.3' 的访问被拒绝(使用密码:是)
Docker 网络信息
docker network inspect test-mysql-user-host_default
{ "Name": "test-mysql-user-host_default", "Id": "305f4da33e0b79d899ac289e6b3fc1ebf2733baf0bf3d60a53cc94cec44176d1", "Created": "2019-04-26T09:53:23.3237197Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "133ebd1e6ba485212e5448670c66c1718917650bc217264183c725fb1a928118": { "Name": "mysql1", "EndpointID": "ce89aa1674e9c46fad50b2f36aec8d1eecf2227f597a785be67785ade770fef7", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" }, "d67072a5c486752b7018fa321e47ae09fb873199604c2b520f2305968d43b577": { "Name": "mysql2", "EndpointID": "e6b62c6ce9e266d38be383fa6029f378e1ca67a18420dd3f508a3089200c0d98", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} }
解决方案
来自贝拉肯的评论
这似乎是 MySQL 的 skip-resolve-host 选项的问题,该选项当前硬编码在 Dockerfile 中(请参阅此 GitHub 问题)。TLDR:您可以基于 mysql:5 创建自己的映像并将此选项去掉,或者使用 % 通配符代替 mysql2。
他在这里是mysql:5.7 的官方 dockerfile,在第 70 行我们可以找到:
#don't reverse lookup hostnames, they are usually another container
&& echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf
我做了一个新的 Dockerfile 女巫删除了这个配置文件。
FROM mysql:5.7
RUN rm /etc/mysql/conf.d/docker.cnf
EXPOSE 3306 33060
CMD ["mysqld"]
推荐阅读
- excel - 从一列中按特定条件对行进行分组
- c++ - 为什么 cin.ignore() 忽略我的 getline 输入的第一个字符?
- sql-server-2016 - 在 SQL Server 2017 上创建具有 800+ 百万行的现有分区表的列存储索引
- apache-spark - Spark Window Functions:每帧/范围计算一次?
- javascript - 在给它一个无效值时,是否可以使 jQuery DateTimePicker 不默认为当前日期和时间?
- laravel-backpack - 如何将背包克隆功能用于独特的字段形式
- git - 如何使用 GitHub Actions 创建孤立(不相关)分支
- android - android上的react-native出现“TypeError:网络请求失败”之类的错误
- python - 添加多个 Python Selenium WebDriverWait 异常以下载元素
- javascript - 在带有 analytics.js 片段的网站上使用 GTM 设置 ClientId?