tl; dr Краткое описание проблемы:
- Приложение успешно запускается в контейнере, привязывается к 127.0.0.1:8080 в контейнере и успешно обслуживает веб-запросы, но только в контейнере
- docker ps -a подтверждает, что открыт порт 8080
- Я не могу связаться с приложением с хоста, используя фактический IP-адрес контейнера, когда я запрашиваю http://[Container IP-адрес]: 8080
- Хост работает под управлением Windows 10
- Брандмауэр Windows полностью отключен для устранения неполадок
Для устранения неполадок я создал самое простое приложение для запуска в контейнере докеров, приложение F # / Suave, например:
open Suave
[<EntryPoint>]
let main args =
startWebServer defaultConfig (Successful.OK "Hello World!")
0
, которое отлично работает, возвращая простой "Hello World!"когда я запускаю его локально.
Чтобы контейнировать приложение, я следовал инструкциям в « Dockerize .NET Core application », который инструктирует мне запускать контейнер как
$ docker run -d -p 8080:80 --name myapp aspnetapp
Я не могу подключиться к «сайту» по адресу http://localhost:80 и http://localhost:8080,, что, по-видимому, является распространенной проблемой для пользователей Docker, работающих под Windows. Однако решение, которое, похоже, устранило эту проблему для всех остальных пользователей Windows в Интернете, запустив
docker inspect myapp
и затем нажав получившийся IP-адрес, также не работает. Я получаю:
Удар по обоим http://172.17.0.2:80 и http://172.17.0.2:8080 в Chrome дает мне «Сайт может»не может быть достигнут. "
Также стоит отметить, когда я запускаю
docker logs myapp
Единственная строка -
[17:43:21 INF] Smooth! Suave listener started in 73.476ms with binding 127.0.0.1:8080
Как я догадался, я также пытался
ipconfig
, а затем по IP-адресу адаптера Docker NAT, но это также приводит к недоступности сайта.
ОБНОВЛЕНИЕ :
Еще одно замечание, которое может иметь или не иметь значение: во многих онлайн-руководствах предлагается, чтобы в Windows вам было необходимо напрямую подключиться к IP-адресу контейнера и получить этот IP-адрес с помощьюработает
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" myapp
, что для меня всегда дает:
Когда я запускаю ваниль
Docker проверяет myapp
, полученный JSON не структурирован точно так же, как рекомендуемый запрос.Я получаю узел bridge , но не узел nat :