如何从没有envvariables的主机上的docker容器中获取docker主机的主机名

除了使用环境variables之外,在主机上运行的容器内部还有什么方法来获得docker主机的主机名? 我知道我可以在容器创build时将主机名作为环境variables传递给容器。 我想知道如何在运行时查看它。

foo.example.com (docker host) bar (docker container) 

有没有一种方法容器bar在docker主机foo.example.com运行得到“foo.example.com”?

编辑添加用例:

容器将为表单的服务发现创build一个SRVlogging

 _service._proto.name. TTL class SRV priority weight port target. ----------------------------------------------------------------- _bar._http.example.com 60 IN SRV 5000 5000 20003 foo.example.com. 

其中20003是docker主机上的一个dynamic分配的端口,用于在bar中的某个固定端口上侦听的服务(docker处理从主机端口到容器端口的映射)。

我的容器将运行健康状况检查,以确保它已成功创buildSRVlogging,因为其他Docker主机上还有许多其他容器容器,这些容器也会创build自己的SRVlogging。

 _service._proto.name. TTL class SRV priority weight port target. ----------------------------------------------------------------- _bar._http.example.com 60 IN SRV 5000 5000 20003 foo.example.com. <-- _bar._http.example.com 60 IN SRV 5000 5000 20003 foo2.example.com. _bar._http.example.com 60 IN SRV 5000 5000 20003 foo3.example.com. 

运行状况检查将循环查找上面第一个SRVlogging,因此需要知道其主机名。

在旁边

我使用Helios,并发现它为我添加了一个env var ,我可以从中获取主机名。 但是,我只是好奇,因为我没有使用太阳神docker时使用docker工人。

您可以将主机名作为环境variables传递。 你也可以挂载/ etc,这样你可以猫/ etc / hostname。 但是我同意维塔利,这不是容器IMO的预期用例。

您可以轻松地将其作为环境variables传递

 docker run .. -e HOST_HOSTNAME=`hostname` .. 

运用

 -e HOST_HOSTNAME=`hostname` 

将调用主机名称并将其作为名为HOST_HOSTNAME的环境variablesHOST_HOSTNAME ,当然您可以根据需要自定义密钥。

请注意,这可以在bash shell上运行,如果你使用不同的shell,你可能需要看到“反向”选项,例如一个鱼壳替代品

 docker run .. -e HOST_HOSTNAME=(hostname) .. 

我添加了这个,因为在其他答案中没有提到。 您可以使用-h指令在运行时为容器指定一个特定的主机名。

 docker run -h=my.docker.container.example.com ubuntu:latest 

你可以使用反引号(或者你的shell使用的任何等价物)来获取hosthame的输出到-h参数中。

 docker run -h=`hostname` ubuntu:latest 

有一个警告,hostname的值将从你运行命令的主机中获取,所以如果你想要运行你的docker容器的虚拟机的主机名,那么使用hostname作为参数可能是不正确的,如果你正在使用主机在虚拟机上执行docker命令。

我认为我有同样的问题的原因是最新的Docker for Mac beta中的一个bug ,但是埋在那里的评论中,我find了一个为我和我的团队工作的解决scheme。 我们正在将其用于本地开发,在我们正在努力取代它的时候,我们需要集装箱化的服务与庞然大物进行对话。 这可能不是生产可行的解决scheme。

在主机上,将已知的可用IP地址别名到回送接口:

 $ sudo ifconfig lo0 alias 10.200.10.1/24 

然后将该主机名添加到您的dockerconfiguration中。 在我的情况下,我使用的是docker-compose,所以我将其添加到我的docker-compose.yml中:

 extra_hosts: # configure your host to alias 10.200.10.1 to the loopback interface: # sudo ifconfig lo0 alias 10.200.10.1/24 - "relevant_hostname:10.200.10.1" 

然后,我通过附加到bash会话来validation所需的主机服务(Web服务器)是否在容器内部可用,并使用wget从主机的Web服务器请求页面:

 $ docker exec -it container_name /bin/bash $ wget relevant_hostname/index.html $ cat index.html 

另一个对我有用的选项是将主机的networking名称空间绑定到docker。

通过增加:

 docker run --net host