在我码头式的写作中。yml文件,我有以下。但是容器不会获取主机名值。什么好主意吗?
dns:
image: phensley/docker-dns
hostname: affy
domainname: affy.com
volumes:
- /var/run/docker.sock:/docker.sock
当我在容器中检查主机名时,它没有捡到affy。
在我码头式的写作中。yml文件,我有以下。但是容器不会获取主机名值。什么好主意吗?
dns:
image: phensley/docker-dns
hostname: affy
domainname: affy.com
volumes:
- /var/run/docker.sock:/docker.sock
当我在容器中检查主机名时,它没有捡到affy。
这似乎是正确的。如果我把你的配置文件:
$ 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
根据docker文档: https://docs.docker.com/compose/compose-file/#/command
我简单地说 主机名:<字符串> 在docker-compose文件中。
例如:
[...]
lb01:
hostname: at-lb01
image: at-client-base:v1
[...]
容器lb01选择at-lb01作为主机名。
我发现当使用docker运行时,主机名对其他容器不可见。这是一个众所周知的问题(也许是一个更广为人知的特征),讨论的一部分是:
我们可能应该在文档中添加关于使用主机名的警告。我认为它很少有用。
从容器网络的角度来看,分配主机名的正确方法是这样定义别名:
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias2
不幸的是,这仍然不能与docker运行。解决方法是为容器分配一个名称:
docker-compose run --name alias1 some-service
然后alias1可以从其他容器ping通。
更新:正如@grilix指出的那样,您应该使用docker-compose run——use-aliases使定义的别名可用。
我需要旋转freeipa容器来拥有一个工作的kdc,并且必须给它一个主机名,否则它将无法运行。 最终对我有用的是在compose中设置HOSTNAME env变量:
version: 2
services:
freeipa:
environment:
- HOSTNAME=ipa.example.test
现在它工作了:
docker exec -it freeipa_freeipa_1 hostname
ipa.example.test
我发现的最简单的方法是在docker-compose中设置容器名称。yml参见container_name文档。适用于docker-compose v1+。它适用于容器到容器,而不是从主机到容器。
services:
dns:
image: phensley/docker-dns
container_name: affy
现在您应该能够使用容器名从其他容器访问affy。我必须在一个开发环境中为多个redis服务器这样做。
说明只要不需要缩放,该解决方案就有效。例如一致的个人开发人员环境。
从docker-compose 3.0及以后版本开始,你可以只使用hostname键:
version: "3.0"
services:
yourservicename:
hostname: your-name