5

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

4

3 回答 3

4

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

也可以看看:

资料来源:

[1] = docker docs - 用户定义网络中的嵌入式 DNS 服务器

[2] = Docker 引擎发行说明 - 1.10.0 (2016-02-04) - 网络

[3] = Docker 拉取请求 - 供应商 libnetwork

于 2017-10-25T11:47:20.790 回答
3

可能值得查看 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。我希望这有帮助!

于 2014-10-09T08:54:10.593 回答
0

可以依赖于容器的操作系统,但假设容器运行 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 容器共享的公共桥接网络。

于 2020-05-15T15:42:23.463 回答