Докер: Как найти сеть, в которой находится мой контейнер?
Я пытаюсь понять кое-что о Докере:
- Как я могу найти сеть, в которой находится мой контейнер?
- Могу ли я динамически отсоединить свой контейнер и подключиться к другой сети? Как?
- Если у меня работает два контейнера, как проверить, находятся ли два
та же сеть? Могу ли я пинговать один от другого?
Ответы
Ответ 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