Как получить все IP-адреса в сети докеров?

У меня есть контейнеры, работающие в ройком стеке служб (на разных докер-машинах каждый), соединенных вместе в оверлейной сети докеров.

Как можно было бы получить все используемые IP-адреса в сети, связанные с их услугами или именем контейнера изнутри контейнера в этой сети?

Спасибо

привет, Пол, есть новости по этому поводу?

shay__ 11.06.2019 08:04

Привет, Шей, к сожалению, нет ...

Paul Soubrane 12.06.2019 14:09
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
4
2
9 175
4

Ответы 4

  1. Найдите имя ИЛИ ID оверлейной сети -

    $ docker network ls | grep overlay

  2. Сделайте осмотр -

    docker inspect $NETWORK_NAME

Вы сможете найти имена контейнеров и назначенные им IP-адреса. Вы можете выполнить выборку / grep необходимых значений из результатов проверки. Вы найдете результат, как показано ниже -

    "IPAM": {
        "Driver": "default",
        "Options": null,
        "Config": [
            {
                "Subnet": "172.23.0.0/16",
                "Gateway": "172.23.0.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": true,
    "Ingress": false,
    "ConfigFrom": {
        "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
        "183584efd63af145490a9afb61eac5db994391ae94467b32086f1ece84ec0114": {
            "Name": "emailparser_lr_1",
            "EndpointID": "0a9d0958caf0fa454eb7dbe1568105bfaf1813471d466e10030db3f025121dd7",
            "MacAddress": "02:42:ac:17:00:04",
            "IPv4Address": "172.23.0.4/16",
            "IPv6Address": ""
        },
        "576cb03e753a987eb3f51a36d4113ffb60432937a2313873b8608c51006ae832": {
            "Name": "emailparser",
            "EndpointID": "833b5c940d547437c4c3e81493b8742b76a3b8644be86af92e5cdf90a7bb23bd",
            "MacAddress": "02:42:ac:17:00:02",
            "IPv4Address": "172.23.0.2/16",
            "IPv6Address": ""
        },

Спасибо за ваш ответ. Я ищу способ сделать это из контейнера в сети ... Я обновляю свой пост, чтобы было понятнее.

Paul Soubrane 23.03.2018 10:43

Сначала найдите имя сети, которую использует ваш рой.

Затем запустите docker network inspect <NETWORK-NAME>. Это даст вам вывод JSON, в котором вы найдете объект с ключом «Контейнеры». Этот объект показывает все контейнеры в сети и их IP-адреса соответственно.

Спасибо за ваш ответ. Я ищу способ сделать это из контейнера в сети ... Я обновил свой пост, чтобы он был понятнее.

Paul Soubrane 23.03.2018 10:46

Предполагая, что вы используете конечную точку VIP по умолчанию, вы можете использовать DNS для разрешения IP-адресов службы. Вот пример использования dig для получения IP-адреса VIP и последующего получения IP-адресов отдельных контейнеров за этим VIP с помощью задач.

docker network create --driver overlay --attachable sweet

docker service create --name nginx --replicas=5 --network sweet nginx

docker container run --network sweet -it bretfisher/netshoot dig nginx
~~~
;; ANSWER SECTION:
nginx.          600 IN  A   10.0.0.3
~~~

docker container run --network sweet -it bretfisher/netshoot dig tasks.nginx
~~~
;; ANSWER SECTION:
tasks.nginx.        600 IN  A   10.0.0.5
tasks.nginx.        600 IN  A   10.0.0.8
tasks.nginx.        600 IN  A   10.0.0.7
tasks.nginx.        600 IN  A   10.0.0.6
tasks.nginx.        600 IN  A   10.0.0.4
~~~

Если вы хотите выполнить эту команду изнутри контейнеров, сначала вам нужно смонтировать docker.sock для каждой службы (при условии, что докер установлен в контейнере)

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

затем в каждом контейнере вы должны установить jq, и после этого вы можете просто запустить ожидаемый вывод docker network inspect <network_name_here> | jq -r 'map(.Containers[].IPv4Address) []', например:

172.21.0.2/16
172.21.0.5/16
172.21.0.4/16
172.21.0.3/16

Другие вопросы по теме