动态将容器主机名解析为IP

时间:2019-02-16 00:09:56

标签: docker docker-compose dockerfile docker-networking

我在docker-compose.yml中有几项服务需要彼此通话。这不是问题,因为作曲家在内部负责所有网络。但是,其中一项服务需要白名单以允许与其API进行通信。不幸的是,此白名单仅对IPv4地址进行了限制-它无法解析主机名。

我希望避免定义自己的自定义网络并为容器分配静态IP地址,以保持其灵活性。我已经上下搜索了,但没有找到一种在运行时甚至在构建阶段都无法解析服务名称的方法。

我尝试安装DNS工具并使用dig,但无法确定IP地址。这可能与我对Docker如何处理网络层缺乏了解有关。

所以我的问题是:

  • 如何在运行时或在构建阶段解析容器服务名称?
  • 使用docker-compose进行构建时,它是否为容器分配了静态地址,或者重新启动后容器IP是否有可能更改?

1 个答案:

答案 0 :(得分:1)

一个月前我面临着类似的挑战,并且有可能获得想要的东西(即使我正在使用Kubernetes而不是使用docker-compose)。

Docker提供了一个内部DNS解析系统,如本StackOverflow question中所述。 如果您对dig进行了一些修改,则会发现该容器使用了与主机不同的DNS IP。

特别是,launching the Wordpress example构成了docker-compose文档,您可以通过以下方式查看它:

mkdir /tmp/test && cd /tmp/test
# create a docker-compose.yaml file and past the example from the link above
docker-compose up -d
# it should be test_default, check it out with `docker network ls`
docker run --rm -it --network test_default ubuntu /bin/bash

然后,在容器内输入:

apt-get update && apt-get install -y dnsutils
dig wordpress

您应该获得与此类似的信息:

root@91e47b426ed3:/# dig wordpress

; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> wordpress
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17239
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;wordpress.                     IN      A

;; ANSWER SECTION:
wordpress.              600     IN      A       172.18.0.3

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Sun Feb 17 19:39:24 UTC 2019
;; MSG SIZE  rcvd: 52

在这里您看到SERVER字段显示127.0.0.11#53,在我的案例中,这是内部Docker DNS系统。您可以检查该地址是否是报告的地址(在我的情况下为172.18.0.3),该地址用于安装curl并通过端口80到达该地址。

请记住,您可以创建一个脚本或程序来定期执行地址解析,获取DNS为该服务返回的地址列表,并相应地更新白名单。

  

如何在运行时或在构建阶段解析容器服务名称?

以Java为例,您可以使用InetAddress类,该类给出一个URL,它返回IP4和IP6地址的列表(您可以使用Apache Common库中的InetAddressValidator对其进行过滤)。您可以看到更多here(这就是我解决问题的方式)。在Linux中,有一个特定的系统调用getaddrinfo,用于获取给定URL的IP列表。

  

使用docker-compose进行构建时,它是否为容器分配了静态地址,或者在重启后容器IP是否有可能更改?

关于第二个问题,docker-compose使用docker build的相同逻辑,因此不会分配静态IP地址或类似地址。最重要的是,如果容器崩溃并重新启动,则其IP可能会更改。