【问题标题】:How do docker containers resolve hostname of other docker containers running on the same machine?docker 容器如何解析在同一台机器上运行的其他 docker 容器的主机名?
【发布时间】:2014-10-09 03:34:07
【问题描述】:

我开始使用 docker 并喜欢它,主要是因为 Docker 容器是一种轻量级的虚拟机。但我无法弄清楚 docker 容器如何能够解析彼此的主机名。他们可以使用那里的 IP 相互连接,但不使用他们的主机名,我什至无法编辑容器中的 /etc/hosts 以某种方式弥补这一点。当我重新启动容器时,它们会获得不同的 IP,因此我想使用主机名代替 IP 来相互通信。比方说,我想在容器中运行 Zookeeper 集群的 Zookeeper 实例,并且我想将 Zookeeper 服务器的主机名放在 config (zoo.cfg) 文件中。

【问题讨论】:

  • 不确定 docker 是否允许回调分配的 IP,然后它可以更新 DNS 服务器。其他选项包括客户端发送 Dyndns 更新,您通过 DHCPd 分配 IP(其中一些可以更新 DNS),或者您可以检查队列。正常的解决方案是使用主机暴露端口,这对于具有静态侦听器的服务器确实有效。

标签: docker dockerhub


【解决方案1】:

Docker 1.10 开始,如果您创建不同的 docker 网络,Docker 将使用内部 DNS 服务器 [1][2][3] 在容器内解析主机名。 您可以通过在docker run 中指定带有--name 的主机名来更改网络主机名。否则,主机名将引用容器 id(12 字符长哈希,由 docker container ls 显示)。

另见:

来源:

[1] = docker docs - Embedded DNS server in user-defined networks

[2] = Docker Engine release notes - 1.10.0 (2016-02-04) - Networking

[3] = Docker pull requests - Vendoring libnetwork

【讨论】:

  • 这听起来像是我需要的,但不知道该怎么做...您介意看看this question 并帮助我吗?!谢谢!
【解决方案2】:

可能值得查看 Docker 链接 (https://docs.docker.com/userguide/dockerlinks/)。当您链接到正在运行的容器时,会为您希望连接的容器添加一个主机条目。

在他们的例子中他们展示了

$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db

正如您在此处看到的,它们将 bash 中的应用程序链接到名为 db 的容器,随后为 db 添加了一个主机条目,其中包含该容器的 IP 地址。

因此,在运行 zookeeper 的情况下,您可以简单地将启动的容器链接到 zookeeper。我希望这会有所帮助!

【讨论】:

  • 这与 compsoe 的 documentation 所说的相同 - 但我看不到任何主机条目:docker exec -it my_container tail -20 /etc/hosts 不会返回我在撰写文件中定义的任何服务。
【解决方案3】:

可以依赖容器的操作系统,但假设容器运行 Linux 您可以通过这种方式检查您的 DNS 配置:

cat /etc/resolv.conf 

它可以返回如下内容:

nameserver 127.0.0.11
options ndots:0

/etc/resolv.conf 是类 UNIX 操作系统中 DNS 的标准配置文件。 在这种特殊情况下,容器被配置为使用 127.0.0.11 作为 DNS 服务器。 因此容器可以使用它的主机名查询它以确定另一个容器的 IP 地址。 您可以使用 nslookup 命令检查该主机是否实际工作,例如:

nslookup redis 127.0.0.11

,它将联系 DNS 服务器 127.0.0.11 并要求解析主机名“redis”。 它可以返回如下内容:

Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      redis
Address 1: 172.21.0.3 counter-app_redis_1.counter-app_counter-net 

,这意味着主机名解析为 ip 172.21.0.3。

在这种特定情况下,名称服务器条目是通过在 docker-compose.yml 配置文件中使用以下条目添加的:

...
networks:
  counter-net:

此根条目配置了由多个 docker 容器共享的公共桥接网络。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多