Подтвердить что ты не робот

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

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

Таким образом, у меня очень простой код Go, который запускает сервер, я создал образ докеры, который устанавливает 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-адрес докера, ни указанный IP-адрес в командной строке выше. Я также не уверен, какой IP-адрес я должен написать в этой команде, я использовал свой компьютер IP, я также пробовал 127.0.0.1 (localhost), но это дало мне тот же результат: не удалось получить доступ к веб-сайту через любой IP вообще.

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

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

4b9b3361

Ответ 1

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


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

Я предполагаю, что у вас есть Docker, работающий на каком-то вкусе 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 будет иметь IP-адрес в вашей локальной сети (что-то вроде 192.168.0.x), и вы сможете получить доступ к своим Контейнер для докеров в 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 с "внешней" сетью - то есть. сетевой адаптер хоста - на конкретном порту.

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

Что вам нужно, это одна из двух вещей:

  • для подключения порта 8080 на виртуальной виртуальной машине к порту 8080 на хосте Windows, так же, как вы подключаете контейнер Docker к хост-порту.

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

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

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

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

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

Ответ 2

  • Откройте диспетчер виртуальных виртуальных машин VM.
  • Выберите виртуальную машину, используемую Docker
  • Нажмите "Настройки" → "Сеть"
  • Адаптер 1 должен (по умолчанию?) быть "привязан к: NAT"
  • Нажмите "Дополнительно" → "Перенаправление портов"
  • Добавить правило: протокол TCP, хост-порт 8080, гостевой порт 8080 (оставить IP-адрес хоста и гостевой IP пустым)
  • Гость - ваш контейнер докеров, а хост - это ваша машина.

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

Ответ 3

После нескольких попыток это сработало для меня:

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

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

Ответ 4

TL;DR: если включен брандмауэр Windows, убедитесь, что существует исключение для "vpnkit" в частных сетях.

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

Однако я не хотел полностью отключать брандмауэр, чтобы получить доступ к моей службе контейнера. Это вызвало вопрос о том, какое "приложение" слушало от имени моей контейнерной службы. Найдя еще одну нить SO, которая научила меня использовать netstat -a -b чтобы обнаружить приложения за сокетами прослушивания на моей машине, я узнал, что это vpnkit.exe, у которого уже была запись в настройках брандмауэра Windows: частные сети "был отключен, и как только я включил его, я смог посетить мой контейнерный сервис с другого компьютера без полного отключения брандмауэра.

Ответ 5

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

Ответ 6

Это наиболее распространенная проблема, с которой сталкиваются пользователи Windows для запуска Docker Containers. ИМО - это "миллионный вопрос о Докере"; @"Rocco Smit" справедливо указал на "входящий трафик, поскольку он был отключен по умолчанию на моем брандмауэре хост-машины"; в моем случае, мое программное обеспечение McAfee Anti Virus. Я добавил дополнительные порты для разрешения входящего трафика с других компьютеров в той же Wifi LAN в настройках брандмауэра McAfee; то это было волшебство. Я боролся больше недели, просматривая по всему Интернету, SO, документацию Docker, учебные пособия после учебников, связанные с Networking of Docker, и множество иллюстраций "не поддерживаются в Windows" для "macvlan", "ipvlan", "user" определенный мост "и даже тот же самый SO поток пару раз. Я даже начал просматривать Google с помощью "любого, кто использует Docker in Production?" (Да, я знаю, что Linux более популярен для рабочих нагрузок Prod по сравнению с серверами Windows), поскольку я не смог получить доступ (с моего мобильного телефона в том же домашнем wifi) nginx приложение, развернутое в контейнере Docker в Windows. В конце концов, что хорошего, если вы не можете получить доступ к приложению (развернутому в контейнере Docker) с других компьютеров/устройств в той же локальной сети, по крайней мере; В конечном счете, в моем случае проблема заключалась в том, что брандмауэр блокировал входящий трафик;

Ответ 7

Установите инструменты Docker для Windows (https://download.docker.com/win/stable/DockerToolbox.exe). Запустите необходимые докер-контейнеры. Затем откройте ссылку Kitematic (Alpha) на настольной панели Windows. В столбце " Containers выберите нужный контейнер и нажмите круговую кнопку с названием " EXEC. После этого откроется Windows PowerShell с командной строкой. И тогда вы можете запустить команды для этого контейнера. Это работает для Windows 10 (не знаю о win7,8).