Как подключиться к контейнеру docker из-за пределов хоста (той же сети) [Windows]


Я создал свой первый контейнер docker, он работает на сервере с помощью Go, но я не могу получить к нему доступ извне хост-компьютера. Я только что начал с Докером, так что я немного потерялся здесь.

Итак, у меня есть очень простой код Go, который запускает сервер, я построил образ docker, который устанавливает Go и строит код в базовом образе Linux. Я запускаю сервер на порту 8080, поэтому я предоставляю этот порт хосту, запускающему контейнер следующим образом:

docker run -p 8080:8080 dockertest

работает и Я получаю доступ к серверу через IP-адрес машины docker (тот, который появляется на Настройки Быстрого Запуска Терминала при инициировании), проблема в том, что я не удается получить доступ к веб-сайту, который я размещаю вне хостинга, поэтому, если я попытаюсь открыть тот же IP-адрес на моем телефоне, это просто даст мне ошибку: эта веб-страница недоступна (ERR_CONNECTION_TIMED_OUT).

Я также попытался указать IP следующим образом:

docker run -p 192.168.0.157:8080:8080 dockertest

но когда я делаю что я могу получить доступ к веб-сайту ни через IP-адрес машины docker, ни через указанный IP-адрес в командной строке выше. Я также не уверен, какой IP я должен написать в этой команде я использовал IP моего компьютера, я также пробовал 127.0.0.1 (localhost), но это дало мне тот же результат: не удалось получить доступ к веб-сайту через любой IP вообще.

я погуглил эту проблему и нашел много вопросов StackOverflow, но ни один не помог мне решить мою проблему, большинство из них были ориентированы на Linux или Mac так что решение не относится к моей ситуации.

кроме того, я могу запустить код Go на своем компьютере и получить доступ к веб-сайту с другого устройства в той же сети через IP-адрес моего компьютера. Я не понимаю, почему я не могу получить к нему доступ, когда я запускаю его в машине docker, мне пришло в голову, что это может иметь какое-то отношение к IP-пересылке или чему-то еще, но я полный нуб в сети, я в основном веб-разработчик и почти не имею опыта работы в native.

4 52

4 ответа:

TL; DR Проверьте сетевой режим вашего хоста VirtualBox-он должен быть bridged Если вы хотите, чтобы виртуальная машина (и контейнер Docker, который она размещает) были доступны в вашей локальной сети.


похоже, что ваша путаница заключается в том, к какому хосту подключиться, чтобы получить доступ к вашему приложению через HTTP. Вы на самом деле не прописали, какова ваша конфигурация - я собираюсь сделать некоторые предположения, основанные на том, что у вас есть "окна" и "Пакет" в теги.

я предполагаю, что у вас есть Докер работает на какой-то вкус Linux работает в VirtualBox на хосте Windows. Я собираюсь пометить IP-адреса следующим образом:

D = IP-адрес контейнера Docker

L = IP-адрес хоста Linux, работающего в VirtualBox

W = IP-адрес хоста Windows

когда вы запускаете приложение Go на вашем хосте Windows, вы можно подключиться к нему с помощью http://W:8080/ из любой точки вашей локальной сети. Это работает, потому что приложение Go связывает порт 8080 на машине Windows и всех, кто пытается получить доступ к порту 8080 по IP-адресу W будет подключен.

и вот тут все усложняется:

VirtualBox, когда он устанавливает виртуальную машину (VM), может настроить сеть в одном из нескольких различных режимов. Я не помню, что все разные варианты, но один вы хотите это bridged. В этом режиме VirtualBox подключает виртуальную машину к локальной сети, как если бы она была автономной машиной в сети, как и любая другая машина, подключенная к вашей сети. В bridged режим, виртуальная машина появляется в вашей сети, как и любая другая машина. Другие режимы все по-другому, и машина не будет виден в сети.

Итак, предполагая, что вы правильно настроили сеть для хоста Linux (bridged), в Linux host будет иметь IP-адрес в вашей локальной сети (что-то вроде 192.168.0.x) и вы сможете получить доступ к контейнеру Docker по адресу http://L:8080/.

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

EDIT - основываясь на комментариях ниже, это звучит очень похоже на ситуацию, которую я описал выше правильный.

давайте немного вернемся: вот как Docker работает на моем компьютере (Ubuntu Linux).

представьте, что я выполняю ту же команду, что и вы: docker run -p 8080:8080 dockertest. Что это делает, так это запуск нового контейнера на основе dockertest изображение и переадресация (подключение) порта 8080 на хосте Linux (мой ПК) к порту 8080 на контейнере. Docker настраивает собственную внутреннюю сеть (с собственным набором IP-адресов), чтобы позволить демону Docker взаимодействовать и разрешать контейнеры для связи друг с другом. Так что в основном то, что вы делаете с этим -p 8080:8080 подключает внутреннюю сеть Docker к "внешней" сети-ie. сетевой адаптер хоста-на определенном порту.

со мной до сих пор? Хорошо, теперь давайте сделаем шаг назад и посмотрим на вашу систему. Ваша машина работает под управлением Windows-Docker не работает (в настоящее время) в Windows, поэтому инструмент, который вы используете, настроил хост Linux на виртуальной машине VirtualBox. Когда вы делаете docker run в вашей среде, точно то же самое происходит - порт 8080 на хосте Linux подключен к порту 8080 на контейнере. Большая разница здесь заключается в том, что ваш хост Windows не является хостом Linux, на котором работает контейнер, поэтому здесь есть еще один уровень, и это связь через этот уровень, где вы сталкиваетесь с проблемами.

вам нужно одно из двух:

  1. чтобы подключить порт 8080 на виртуальной машине VirtualBox к порту 8080 на хосте Windows, просто как вы подключаете контейнер Docker к порту хоста.

  2. для подключения Виртуальной машины VirtualBox непосредственно к локальной сети с bridged сетевой режим я описал выше.

если вы выберете первый вариант, вы сможете получить доступ к контейнеру по адресу http://W:8080 здесь W - это IP-адрес или имя хоста хоста Windows. Если вы выберете второй, вы сможете получить доступ к контейнеру по адресу http://L:8080 здесь L - это IP адрес или имя хоста виртуальной машины Linux.

Итак, это все объяснение более высокого уровня-теперь вам нужно выяснить, как изменить конфигурацию виртуальной машины VirtualBox. И вот где я действительно не могу вам помочь - я не знаю, какой инструмент вы используете, чтобы сделать все это на своей машине Windows, и я совсем не знаком с использованием Docker на Windows.

если вы можете попасть в окно Конфигурации VirtualBox, вы можете внести изменения, описанные ниже. Существует также команда линейный клиент, который будет изменять виртуальные машины, но я не знаком с этим.

на bridged режим (и это действительно самый простой выбор), выключите свою виртуальную машину, нажмите кнопку "Настройки" вверху и измените сетевой режим на bridged, затем перезагрузите виртуальную машину, и вы хорошо идти. Виртуальная машина должна получить IP-адрес в локальной сети через DHCP и должна быть видна другим компьютерам в сети по этому IP-адресу.

  1. открыть Oracle VM VirtualBox Manager
  2. выберите виртуальную машину, используемую Docker
  3. Нажать Настройки -> Сеть
  4. адаптер 1 должен (по умолчанию?) быть "прикрепленным к: NAT"
  5. Нажмите Дополнительно - > Переадресация Портов
  6. Добавить правило: протокол TCP, порт Хоста 8080, гостевой порт 8080 (оставьте хост IP и гостевой IP пустым)
  7. гость-это ваш контейнер docker, а хост-ваша машина

теперь вы должны иметь возможность просматривать ваш контейнер через localhost:8080 и ваш-внутренний-ip: 8080.

попробовав несколько вещей, это сработало для меня:

  • используйте -- publish=0.0.0.0:8080:8080 docker флаг
  • установите сетевой режим virtualbox в NAT и не используйте переадресацию портов

с адресами, отличными от 0.0.0.0 У меня не было успеха.

Я обнаружил, что наряду с установкой значений порта-p Docker для Windows использует vpnkit, а входящий трафик для него был отключен по умолчанию на брандмауэре моей хост-машины. После включения правил входящего TCP для vpnkit я смог получить доступ к своим контейнерам с других компьютеров в локальной сети.