MySQL Docker容器发现错误的主机名

flseospp  于 2023-06-05  发布在  Mysql
关注(0)|答案(1)|浏览(331)

对于我的微服务,每个服务都有一个不同的数据库用户,该用户只能使用给定微服务中的该用户连接到数据库。
所以用户 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环境中调整APTR记录呢?

kx5bkwkv

kx5bkwkv1#

记住别名就是别名,这一点很重要。如果你想改变nslookup,你应该改变容器的名称和它的网络。别名只是为了给予“额外”的名称和网络而被修补。
docker-compose.yml应该如下所示:

version: "1.29"
services:
  mysql:
    networks:
      - myapp
    environment:
      - MYSQL_ROOT_PASSWORD=mypassword
  productapi:
    build: ~/myapp/
    container_name: productapi
    networks:
      - myapp
networks:
  myapp:
    name: myapp.com

通过这种方式,Docker环境中的APTR记录将被正确设置为您的“主”主机名和网络,以便通过主机名和IP地址的反向查找来找到。

  • nsloopup* 将返回正确的信息:
# nslookup 172.25.0.5
5.0.25.172.in-addr.arpa name = productapi.myapp.com.

Authoritative answers can be found from:

MySQL现在可以通过主机名找到IP地址,并且在对IP地址进行反向查找时可以找到相同的主机名。

相关问题