В зависимости от вашей конкретной ситуации, вы должны использовать разные решения:
Разрешение имени хоста внутри службы
Проблема: у вас есть несколько контейнеров (/ реплик) одного сервиса serviceX
, например:
- контейнер
a1b3d130275a
с именем хостаserviceX.1.nq4rjbae
- контейнер
65040b1cada6
с именем хостаserviceX.2.m9wl1f1r
- контейнер
944704427b9e
с именем хостаserviceX.3.3d08baql
Теперь вы хотите получить имя хоста контейнера second ( serviceX.2.m9wl1f1r
) и третьего ( serviceX.3.3d08baql
) из контейнера one ( serviceX.1.nq4rjbae
).
Docker предоставляет решение, называемое обнаружением контейнера, с использованием DNS-запроса tasks.$serviceName
, например:
nslookup tasks.serviceX [...] Name: tasks.serviceX Address 1: 10.0.0.205 a1b3d130275a (<- resolved locally by /etc/hosts) Address 2: 10.0.0.206 serviceX.2.m9wl1f1r Address 3: 10.0.0.207 serviceX.3.3d08baql
Также ведутся дискуссии о том, как сделать serviceX.
разрешимыми и, следовательно, создать предсказуемые имена хостов. »²« ³ »Но сейчас ни одно из них не реализовано, поэтому это решение работает только во время выполнения.
Примечание. Установка имени хоста с помощью функции шаблона (например docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}}
) сделает имена хостов локально предсказуемыми, но они не будут разрешаться другими контейнерами.
Межсервисное разрешение имени хоста
Проблема: У вас есть mutliple контейнеров различных услуг serviceX
, serviceY
. Но только один контейнер на услугу, например:
- контейнер
a1b3d130275a
с именем хостаserviceX.1.nq4rjbae
- контейнер
65040b1cada6
с именем хостаserviceY.2.m9wl1f1r
И вы хотите подключиться к контейнеру другого сервиса ( serviceX
) из одного сервиса ( serviceY
) и наоборот. Вам нужно только использовать --name
параметр:
docker service create --name=serviceX serviceX docker service create --name=serviceY serviceY
И вы можете полагаться, что контейнер a1b3d130275a
будет разрешаться по имени хоста, serviceX
а контейнер - 65040b1cada6
по имени хоста serviceY
.
Ссылка:
- Cker Docker - Проблема - Не удается получить доступ к контейнерам по имени хоста с драйвером оверлея Docker в режиме Swarm.
- ² сделать имя задачи в качестве сетевого псевдонима для контейнера поддержки
- ³ Определить схему для отображения ресурсов службы в DNS
- ⁴ Сделать службу поддержки псевдонимов сети шаблонов