如何在Docker Compose中设置主机名?

Dav*_*ets 88 docker docker-compose

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

dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock
Run Code Online (Sandbox Code Playgroud)

imp*_*ble 50

docker-compose 3.0 及更高版本开始,您可以只使用hostname密钥:

version: "3.0"
services:
  dns:
    hostname: your-name
Run Code Online (Sandbox Code Playgroud)

  • 只是提醒一下:这里的dns是服务的名称,而不是服务的参数。 (14认同)
  • `version:` 键不再有任何用处。https://docs.docker.com/compose/compose-file/04-version-and-name/ “顶级版本属性是由向后兼容性规范定义的,但仅提供信息。” (5认同)

lar*_*sks 46

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

$ cat > compose.yml <<EOF
dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock
EOF
Run Code Online (Sandbox Code Playgroud)

然后把事情搞砸:

$ 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
Run Code Online (Sandbox Code Playgroud)

然后检查容器内的主机名,一切似乎都没问题:

$ docker exec -it stack_dns_1 hostname
affy.affy.com
Run Code Online (Sandbox Code Playgroud)

  • YML文件真的不是那么挑剔.什么"不起作用"是什么意思?根据[docs](https://docs.docker.com/compose/compose-file/),`hostname`和`domainname`都是有效的`docker-compose.yml`选项.更新:刚刚测试过,似乎工作得还不错(docker-compose版本1.4.2,docker版本1.8.2). (3认同)

foz*_*foz 33

我发现使用时其他容器看不到主机名docker run.这结果是一个已知问题(可能更多是一个已知的功能),部分讨论是:

我们应该向使用主机名的文档添加警告.我认为它很少有用.

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

services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1
          - alias2
Run Code Online (Sandbox Code Playgroud)

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

docker-compose run --name alias1 some-service
Run Code Online (Sandbox Code Playgroud)

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

  • 同样在这里!数以百万计的开发人员似乎都在使用 Docker,这太疯狂了,但没有人知道如何给一个盒子起一个简单的名字,甚至官方文档也不知道。非常感谢 :) (9认同)
  • 我遇到了这个问题,我无法通过其他容器的hosname访问容器.而你是整个互联网中唯一一个说出这个问题的人..已经谷歌搜索了20个小时 (3认同)

Mar*_*ani 29

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

我只需 hostname: <string> 输入我的docker-compose文件.

例如:

[...]

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

[...]
Run Code Online (Sandbox Code Playgroud)

和容器lb01 at-lb01选为主机名.

  • 如果您需要容器的知名名称,那么这是一个可行的解决方案。 (4认同)

K.J*_*.J. 5

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

services:
  dns:
    image: phensley/docker-dns
    container_name: affy
Run Code Online (Sandbox Code Playgroud)

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

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