对于我的微服务,每个服务都有一个不同的数据库用户,该用户只能使用给定微服务中的该用户连接到数据库。
所以用户 productapiuser 应该只能从主机 * productapi.myapp.com * 连接。所以我将该用户添加到mysql productapiuser@productapi.myapp.com,并授予它在与产品api相关的所有表上进行选择的权限。
CREATE USER 'productapiuser'@'productapi.myapp.com' IDENTIFIED BY 'mypassword';
GRANT SELECT ON 'product_db'.'product_table' TO 'productapiuser'@'productapi.myapp.com';
然后我从 /etc/mysql/conf.d/docker.cnf 中删除了 skip-name-resolve,并重新启动了容器。我让 skip-host-cache 暂时保持不变,这样我就不必担心缓存错误了。
我将主机名和域名添加到 docker-compose.yml
version: "1.29"
services:
mysql:
hostname: mysql
domainname: mysql.myapp.com
environment:
- MYSQL_ROOT_PASSWORD=mypassword
productapi:
build: ~/myapp/
hostname: productapi
domainname: productapi.myapp.com
然后构建容器并开始使用
docker-compose -f docker-compose.yml build mysql
docker-compose -f docker-compose.yml build productapi
docker-compose -f docker-compose.yml run --use-aliases mysql
docker-compose -f docker-compose.yml run --use-aliases productapi
数据库给出错误
SQLSTATE[HY 000] [1045]用户'productapiuser'@'9 c2 f03 b4 d50 c_docker-compose-developers-productapi-1.docker-compo'(使用密码:是)
显然是错误的主机名。所以我在我的数据库上安装了 ping
- ping productapi* 和 *ping productapi.myapp.com *
两者都给予输出:
PING productapi (172.19.0.4) 56(84) bytes of data.
64 bytes from 9c2f03b4d50c_docker-compose-developers-productapi-1.docker-compose-developers_default (172.19.0.4): icmp_seq=1 ttl=64 time=0.097 ms
它以某种方式将主机名链接到另一个主机名:9c2f03b4d50c_docker-compose-developers-productapi-1.docker-compose-developers_default
我在DB容器中安装了nslookup,并对
# nslookup productapi
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: productapi
Address: 172.19.0.4
然后我对ip做了一个 nslookup,它给出了:
# nslookup 172.19.0.4
4.0.19.172.in-addr.arpa name = 9c2f03b4d50c_docker-compose-developers-productapi-1.docker-compose-developers_default.
Authoritative answers can be found from:
我的问题是,为什么我放在.yaml文件中的主机和域名似乎在不同的服务上作为DNS工作?当MySQL查找IP地址时,MySQL如何解析我在docker-compose.yml中给予的主机名/域名?
或者说我们需要什么才能成功能用吗?
更新:@luuk指出我应该使用docker-compose run --use-aliases productapi
来启动容器。问题是www.example.com的nslookup172.19.0.4仍然给出输出:
4.0.19.172.in-addr.arpa name = 9c2f03b4d50c_docker-compose-developers-productapi-1.docker-compose-developers_default.
根据这两个答案:https://stackoverflow.com/a/51216303/1735311https://dba.stackexchange.com/a/90468/50646
解析主机名后,将在相反方向执行额外的DNS查找,以验证在第一个DNS查询www.example.com中发现的主机名foo.example.com确实Map到解析回原始IP地址的A记录(例如A记录foo.example.com → 203.0.113.113)。
所以我的问题与Docker环境中解析DNS请求的方式有关。那么,如何在Docker环境中调整A
和PTR
记录呢?
1条答案
按热度按时间kx5bkwkv1#
记住别名就是别名,这一点很重要。如果你想改变nslookup,你应该改变容器的名称和它的网络。别名只是为了给予“额外”的名称和网络而被修补。
docker-compose.yml应该如下所示:
通过这种方式,Docker环境中的
A
和PTR
记录将被正确设置为您的“主”主机名和网络,以便通过主机名和IP地址的反向查找来找到。MySQL现在可以通过主机名找到IP地址,并且在对IP地址进行反向查找时可以找到相同的主机名。