Докер: Как найти сеть, в которой находится мой контейнер?

Я пытаюсь понять кое-что о Докере:

  1. Как я могу найти сеть, в которой находится мой контейнер?
  2. Могу ли я динамически отсоединить свой контейнер и подключиться к другой сети? Как?
  3. Если у меня работает два контейнера, как проверить, находятся ли два та же сеть? Могу ли я пинговать один от другого?

Ответ 1

Чтобы узнать, в какой сети находится ваш контейнер, при условии, что ваш контейнер называется c1:

$ docker inspect c1 -f "{{json .NetworkSettings.Networks }}"

Чтобы отключить контейнер от первой сети (если ваша первая сеть называется test-net):

$ docker network disconnect test-net c1

Затем, чтобы повторно подключить его к другой сети (предположив, что он называется test-net-2):

$ docker network connect test-net-2 c1

Чтобы проверить, находятся ли два контейнера (или более) в сети:

$ docker network inspect test-net -f "{{json .Containers }}"

Ответ 2

  • Сеть отображается на выходе docker container inspect $id, где $id - это идентификатор контейнера или имя контейнера. Имя указано в разделе NetworkSettings → Networks.

  • Вы можете использовать docker network connect $network_name $container_name для добавления сети в контейнер. Аналогично, docker network disconnect $network_name $container_name отключит контейнер из сети докеров.

  • Контейнеры могут пинговать друг друга по IP-адресу, если они находятся в одной сети докеров, и вы не отключили ICC. Если вы не находитесь в сети по умолчанию с именем "мост", вы можете использовать включенное обнаружение DNS для ping и подключиться к контейнерам по имени контейнера или сетевому псевдониму. Любая новая сеть, созданная с помощью docker network create $network_name, включала обнаружение DNS, даже если она использует драйвер моста, она просто должна быть отделена от той, которая называется "мост". Контейнеры также могут подключаться через TCP-порты, даже не выставляя или публикуя порты в докере, если они находятся в одной сети докеров.

Здесь приведен пример низкого уровня тестирования сетевого подключения с netcat:

$ docker network create test-net

$ docker run --net test-net --name nc-server -d nicolaka/netshoot nc -vl 8080
17df24cf91d1cb785cfd0ecbe0282a67adbfe725af9a1169f0650a022899d816

$ docker run --net test-net --name nc-client -it --rm nicolaka/netshoot nc -vz nc-server 8080
Connection to nc-server 8080 port [tcp/http-alt] succeeded!

$ docker logs nc-server
Listening on [0.0.0.0] (family 0, port 8080)
Connection from nc-client.test-net 37144 received!

$ docker rm nc-server
nc-server

$ docker network rm test-net