Невозможно пропинговать контейнер docker, размещенный на другой виртуальной машине. - PullRequest
0 голосов
/ 27 февраля 2020
 Two docker container hosted on two different VM, port exposed to both docker container 60000. 
 Both VMs communicate through each through NAT NETWORK and not using docker 
 network compose.  Running docker-A sudo docker run --rm -it -p 8888:8888 -v 
 $(pwd):/workdir -w /workdir tensor  
 Docker-A->172.17.0.1
 Docker-B->172.17.0.3 
 VM-A(Docker-A hosted)->172.25.1.24
 VM-B(Docker-B hosted)->172.25.1.13

Когда я пытаюсь пропинговать от Docker -A до Docker -B, я получаю сообщение об ошибке «Недоступный хост назначения». Я использовал ping 172.17.0.3 для соединения с Docker -B. Борьба с сетевой проблемой Docker basi c. Помощь высоко ценится. Спасибо

1 Ответ

1 голос
/ 27 февраля 2020

Никогда напрямую не используйте частные IP-адреса контейнера. В этом сценарии виртуальная машина A не может получить доступ к частным IP-адресам контейнера на виртуальной машине B. В действительности есть только две ситуации, когда частные IP-адреса контейнера доступны вообще, и в обоих случаях есть более эффективные способы сделать это.

Каждая виртуальная машина работает со своим собственным экземпляром Docker и имеет свое собственное сетевое пространство. Хотя похоже, что оба контейнера имеют адреса в 172.17.0.0/16, на самом деле они являются отдельными сетями, и фактически два демона Docker могли бы независимо решить назначить один и тот же IP-адрес для обоих контейнеров. Если вы не попытались настроить оверлейную сеть , то одна виртуальная машина (или физическая система) не может достичь контейнеров другого сервера по частному IP-адресу, поэтому для этого нет IP-маршрута. (И в этом случае, поскольку оба хоста имеют одинаковый диапазон сети IPv4, маршрут VM A к 172.17.0.0/16 указывает на сеть Docker VM A, которая отличается от сети VM B.)

Чтобы сделать Контейнер доступен снаружи Docker пространства, вам нужно запустить его с параметром docker run -p (или эквивалентной Docker Compose ports: настройкой). Затем вы можете получить доступ к контейнеру, используя DNS-имя хоста (или ВМ) или IP-адрес и опубликованный (первый) номер порта. Вы не можете ping (1) удаленный контейнер таким образом, но также нет особой причины хотеть отправлять ICMP-пакеты контейнера.

vm-a$ curl http://172.25.1.13:8888  # using vm-b's IP address

Если два контейнера были на тот же хост (или ВМ), вы можете создать Docker сеть и запустить оба контейнера --name some-name --net some-net; если оба имеют одинаковый --net some-net, то каждый контейнер может связаться с другим, используя some-name другого в качестве имени хоста. Работа в сети в Compose может быть более доступной, даже если вы не используете Compose; без Compose вы должны вручную docker network create сеть.

(я сказал, что было две ситуации, в которых работают частные адреса контейнера. Это (1) с консоли того же хоста Linux, на котором запущен контейнеры, и (2) между контейнерами в той же сети Docker. Они не работают с других хостов, ни на хостах MacOS, ни на хостах Windows. Приведенные выше подходы не имеют этих ограничений и также переживают такие вещи, как приватный контейнер IP изменение адресов при удалении и воссоздании контейнеров.)

...