Никогда напрямую не используйте частные 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 изменение адресов при удалении и воссоздании контейнеров.)