Я использую следующий файл компоновки докеров, расположенный по адресу /tmp/compose.yml
, для развертывания стека докеров:
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
не работает.
Состояние документов:
hostname Задает имя хоста, под которым контейнер знает себя. Это записывается в /etc/hostname, в /etc/hosts как имя IP-адреса контейнера, обращенного к хосту, и это имя, которое /bin/bash внутри контейнера будет отображаться в его приглашении. Но имя хоста нелегко увидеть снаружи контейнера. Он не появится ни в docker ps, ни в файле /etc/hosts любого другого контейнера.
Как добиться, чтобы контейнер службы роя докеров обслуживал связь контейнера с помощью предварительно определенных имен хостов контейнера?
Единственный способ, который работает, — это добавить такие записи, как:
[service_B_container_1_virtual_ip] service-B-1
[service_B_container_2_virtual_ip] service-B-2
до /etc/hosts
из service-A
контейнеров.
Также интересно, что если hostname
не задано в файле docker-composes
, а сгенерировано докером, ping [container_id]
преуспевает даже в рое многоузловых докеров.
Я ожидал такого же поведения для предопределенных имен хостов.