Я не понимаю, как проверить связь с сервисом, работающим в Docker Swarm, который развернут в глобальном режиме. Допустим, у меня есть 2 узла в моем кластере Swarm (пример ниже). Я развернул некоторые службы в глобальном режиме, поэтому 2 экземпляра работают на своем собственном узле. Обе службы предоставляют один и тот же порт, как в примере ниже.
version: '3.7'
services:
cadvisor:
image: google/cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- 8080:8080
networks:
- monitor-net
deploy:
mode: global
restart_policy:
condition: on-failure
networks:
monitor-net:
Я запускаю другой контейнер в той же сети и пытаюсь пропинговать службы. Docker может разрешить службу по имени службы:
root@bdc091e9f4d1:/# ping cadvisor
PING cadvisor (10.0.16.165) 56(84) bytes of data.
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=3 ttl=64 time=0.044 ms
Но она просто выбирает одну из служб. Как я могу добраться до одного из каждого узла? Я пытался использовать имя хоста
services:
cadvisor:
image: google/cadvisor
hostname: "{{.Node.Hostname}}.{{.Service.Name}}"
. Он устанавливает hostname
, как и ожидалось. docker container inspect ...
"Config": {
"Hostname": "node01.mon_cadvisor",
"Domainname": "",
"User": "",
"AttachStdin": false,
Если я пинг node01.mon_cadvisor
, Docker, кажется, не разрешает адрес службы по его hostanme
Так как это сделать?