如何在docker-compose中设置主机名?


120

在我的docker-compose.yml文件中,具有以下内容。但是,容器不会选择主机名值。有任何想法吗?

dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock

当我检查容器中的主机名时,它没有启动affy


1
您正在使用哪个版本的Compose?
kojiro

Answers:



57

这似乎正常工作。如果我将您的配置放入文件中:

$ cat > compose.yml <<EOF
dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock
EOF

然后提出:

$ docker-compose -f compose.yml up
Creating tmp_dns_1...
Attaching to tmp_dns_1
dns_1 | 2015-04-28T17:47:45.423387 [dockerdns] table.add tmp_dns_1.docker -> 172.17.0.5

然后检查容器内的主机名,一切似乎都很好:

$ docker exec -it stack_dns_1 hostname
affy.affy.com

1
您正在使用哪个版本的Compose?
kojiro

此格式在最新版本的docker-compose中不起作用。YML文件是挑剔的东西;您确定这是DNS的正确格式吗?
George Stocker

3
YML文件并不是真的那么挑剔。“无效”是什么意思?根据docshostnamedomainname均为有效docker-compose.yml选项。更新:经过测试,似乎仍然可以正常工作(docker-compose版本1.4.2,docker版本1.8.2)。
larsks 2015年

有什么办法可以在Docker环境之外公开此主机名?如果主机可以通过其dns名称访问docker容器,那就太好了。
Paul Praet

1
这是可能的,也许值得一问。如果搜索“ docker dns”,您将找到几个相关结果;先看看那里有什么。
larsks'Apr 6'16

53

我发现使用时主机名对其他容器不可见docker run。事实证明这是一个已知问题(也许是一个已知功能),其中一部分讨论是:

我们可能应该在文档中添加有关使用主机名的警告。我认为它很少有用。

就容器网络而言,分配主机名的正确方法是定义一个别名,如下所示:

services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1
          - alias2

不幸的是,这仍然无法使用docker run。解决方法是为容器分配一个名称:

docker-compose run --name alias1 some-service

并且alias1然后可以从其他容器ping通。


10
我一直困扰着我无法通过其他容器的hosname访问容器的问题。而且您是整个互联网上唯一一个表示此问题的人..已经搜索了20个小时
holms 18-4-9

7
同样在这里!数以百万计的开发人员似乎在使用Docker真是太疯狂了,但是没人知道如何给一个盒子起一个简单的名字,甚至是官方文档也是如此。非常感谢您:)
Sliq,

1
为以防万一,现在我们可以使用--use-aliasesdocker-compose run。这样可以避免在run命令上对别名进行硬编码
grilix

38

基于Docker文档:https : //docs.docker.com/compose/compose-file/#/command

我只是放入 hostname: <string> 了docker-compose文件。

例如:

[...]

lb01:
  hostname: at-lb01
  image: at-client-base:v1

[...]

容器lb01 at-lb01作为主机名。


如果您在docker-compose文件中有多个容器,是否会为每个容器设置主机名?看来效率很低?
vgoklani

6
如果您需要容器的知名名称,那么这是一个可行的解决方案。
Marcello Romani

9

我发现的最简单的方法是只在docker-compose.ymlSee container_name文档中设置容器名称。适用于docker-compose v1 +。它适用于容器到容器,而不是从主机到容器。

services:
  dns:
    image: phensley/docker-dns
    container_name: affy

现在,您应该可以affy使用容器名称从其他容器进行访问。我必须在开发环境中为多个Redis服务器执行此操作。

注意只要您不需要扩展,该解决方案就可以工作。例如一致的单个开发人员环境。


Compose 3.7唯一的出路,我得到了数据库服务主机名从同一组的其他服务容器内看到了命名服务的主机名。使用该hostname:属性失败。使用环境HOSTNAME =构造也失败。
Stephane

另一个可行的解决方案是使用解决方案中aliases描述的属性foz
Stephane

1
这个伟大的工程,但有点乱-现在我已经采取了设置container_name,并hostname以相同的值来实现我需要什么
奥利弗·邓杰

3

我需要旋转freeipa容器才能使用有效的kdc,并且必须为其提供一个主机名,否则它将无法运行。最终为我工作的是HOSTNAME在compose中设置env变量:

version: 2
services:
  freeipa:
    environment:
      - HOSTNAME=ipa.example.test

现在可以正常工作:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test

2
对我来说,使用slim会导致HOSTNAME环境变量对容器的实际主机名完全没有影响
Oliver Dungey

2
尽管这可能与您使用的容器一起使用,但环境指令仅向容器公开变量。仍然需要容器根据设置的值执行操作。在许多情况下,它可能什么也不做。
MrJohnBBQ

暴露环境变量与容器的主机名无关,它们是两个独立的领域。
Marcello Romani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.