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

Posted

技术标签:

【中文标题】如何在 docker-compose 中设置主机名?【英文标题】:How do I set hostname in docker-compose? 【发布时间】:2015-07-07 14:58:27 【问题描述】:

在我的docker-compose.yml 文件中,我有以下内容。但是,容器不会获取主机名值。有什么想法吗?

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

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

【问题讨论】:

您使用的是什么版本的 Compose? 此问题仍然存在:github.com/docker/compose/issues/2925 您可以设置主机名,但无法从其他容器访问。所以它大多是无用的。 值得注意的是,如果未指定version:,则 docker-compose 假定文件格式为 v1;见docs.docker.com/compose/compose-file/compose-versioning/… 【参考方案1】:

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

$ 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

【讨论】:

您使用的是什么版本的 Compose? 此格式在最新版本的 docker-compose 中不起作用。 YML 文件是很挑剔的东西;你确定这是 dns 的正确格式吗? YML 文件并不是那么挑剔。 “不起作用”是什么意思?根据the docs,hostnamedomainname 都是有效的docker-compose.yml 选项。更新:刚刚测试,似乎仍然可以正常工作(docker-compose 版本 1.4.2,docker 版本 1.8.2)。 有没有办法在 docker 环境之外公开这个主机名?如果主机可以通过 dns 名称访问 docker 容器,那就太好了。 这是可能的,并且可能值得自己提出问题。如果你搜索“docker dns”你会发现几个相关的结果;先看看外面有什么。【参考方案2】:

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

我简单地说 hostname: &lt;string&gt; 在我的 docker-compose 文件中。

例如:

[...]

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

[...]

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

【讨论】:

如果你在 docker-compose 文件中有多个容器,你会为每个容器设置主机名吗?这似乎效率很低? 如果您需要知名的容器名称,这是一个可行的解决方案。 这正是我所需要的:你可以在这里找到文档:docs.docker.com/compose/compose-file/…【参考方案3】:

我发现在使用docker run 时主机名对其他容器不可见。原来这是一个known issue(也许是一个已知的功能),部分讨论是:

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

就容器网络而言,分配主机名的正确方法是define an alias,如下所示:

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

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

docker-compose run --name alias1 some-service

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

更新:正如@grilix 指出的那样,您应该使用docker-compose run --use-aliases 来使定义的别名可用。

【讨论】:

我遇到的问题是我无法通过其他容器的 hosname 访问容器。而你是整个互联网中唯一一个提出这个问题的人......已经在谷歌上搜索了 20 个小时 这里也一样!数以百万计的开发人员似乎都在使用 Docker,这太疯狂了,但没有人知道如何给一个盒子起一个简单的名字,甚至官方文档也不知道。非常感谢:) 以防万一,现在我们可以使用--use-aliasesdocker-compose run。这将避免在run 命令上对别名进行硬编码【参考方案4】:

我需要旋转freeipa container 才能有一个工作的kdc,并且必须给它一个主机名,否则它就不会运行。 最终对我有用的是在 compose 中设置 HOSTNAME env 变量:

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

现在它的工作:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test

【讨论】:

对我来说,使用 slim 会导致 HOSTNAME 环境变量对容器的实际主机名完全没有影响 虽然这可能适用于您正在使用的容器,但 environment 指令仅向容器公开变量。容器仍然可以使用设置的值做一些事情。在许多情况下,它可能什么都不做。 暴露环境变量与容器的主机名无关,它们是两个独立的领域。【参考方案5】:

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

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

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

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

【讨论】:

Compose 3.7 中,我从同一堆栈的另一个服务容器中看到数据库服务主机名的唯一方法是将服务命名为主机名。使用 hostname: 属性失败。使用环境 HOSTNAME= 构造也失败了。 另一个同样有效的解决方案是使用aliases 属性,如foz 解决方案中所述。 这很好用,但有点乱 - 我现在已经将 container_namehostname 设置为相同的值以实现我的需要 container_name 的一个问题是它对本地主机系统是全局的,因此当您尝试运行多个堆栈并且两个不同的服务具有相同的 container_name 时会遇到冲突。【参考方案6】:

截至docker-compose version 3.0 and later,您可以只使用hostname 键:

version: "3.0"
services:
  dns:
    hostname: your-name

【讨论】:

提醒一下:这里的dns是服务的名字,不是服务的参数。 @SomeOne_1 不用说 @improbable 可能会造成混淆,评论有帮助

以上是关于如何在 docker-compose 中设置主机名?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据主机名在 .htaccess 中设置 php_value?

如何在xampp中设置虚拟主机?

如何在 ECS Fargate 任务定义中配置主机名

如何在一个文件中设置多个虚拟主机

如何在 nginx 中设置海量动态虚拟主机?

如何在 xampp 中设置具有相同父服务器别名或名称的虚拟主机