我使用以下 docker compose 文件位于/tmp/compose.yml
对于docker堆栈部署:
version: "3.6"
services:
service-A:
image: service-A
networks:
- net
hostname: "service-A-{{.Task.Slot}}"
deploy:
replicas: 2
service-B:
image: service-B
networks:
- net
hostname: "service-B-{{.Task.Slot}}"
deploy:
replicas: 2
networks:
net:
运行命令:
docker network create -d overlay net
docker stack deploy -c /tmp/compose.yml my
我的期望是service-A
各个容器将能够发现service-B
容器按容器预定义的主机名:service-B-1, service-B-2
。
然而,ping service-B-1
从任何内部service-A
容器失败。
Docs https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/ state:
hostname设置容器通过其识别自身的主机名。这是写的
进入/etc/hostname,进入/etc/hosts作为容器的名称
面向主机的 IP 地址,是 /bin/bash 中的名称
容器将显示在其提示符中。但主机名并不容易
从容器外部看到。它不会出现在 docker ps 中,也不会出现
在任何其他容器的 /etc/hosts 文件中。
如何通过容器预定义的主机名实现docker swarm服务容器到服务容器的通信?
唯一有效的方法是添加条目,例如:
[service_B_container_1_virtual_ip] service-B-1
[service_B_container_2_virtual_ip] service-B-2
to /etc/hosts
of service-A
容器。
也很有趣的是,如果hostname
没有设置在docker-composes
文件,但由 docker 生成,ping [container_id]
即使跨多主机 docker swarm 也能成功。
我期望预定义的主机名具有相同的行为。