Порт запуска Docker не подключен, хост Windows 10, контейнер Linux - PullRequest
0 голосов
/ 14 декабря 2018

Я следую за https://app.pluralsight.com/library/courses/docker-web-development/table-of-contents, который использует более старый microsoft / aspnetcore-build образ, но я использую ядро ​​2.1, поэтому я использую microsoft / dotnet: 2.1-sdk вместо.

Моя команда:

docker run -it -p 8080: 5001 -v $ {pwd}: / app -w"/ app" microsoft / dotnet: 2.1-sdk

и затем, попав в TTY, я запускаю dotnet, который выдает мне следующий вывод:

Использование настроек запускаиз /app/Properties/launchSettings.json...

info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager [0]

Доступен профиль пользователя.Использование «/root/.aspnet/DataProtection-Keys» в качестве хранилища ключей;ключи не будут зашифрованы в состоянии покоя.

информация: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager [58]

Создание ключа {5445e854-c1d9-4261-82f4-0fc3a7543e0a} с датой создания2018-12-14 10: 41: 13Z, дата активации 2018-12-14 10: 41: 13Z и дата окончания срока действия 2019-03-14 10: 41: 13Z.

предупреждение: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager [35]

Не настроен шифровщик XML.Ключ {5445e854-c1d9-4261-82f4-0fc3a7543e0a} может быть сохранен в хранилище в незашифрованном виде.

info: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository [39]

Запись данных вфайл '/root/.aspnet/DataProtection-Keys/key-5445e854-c1d9-4261-82f4-0fc3a7543e0a.xml'.

предупреждает: Microsoft.AspNetCore.Server.Kestrel [0]

Невозможно связать с https://localhost:5001 в интерфейсе обратной связи IPv6: «Невозможно назначить запрошенный адрес».

предупреждение: Microsoft.AspNetCore.Server.Kestrel [0]

Невозможно выполнитьпривязка к http://localhost:5000 в интерфейсе обратной связи IPv6: «Невозможно назначить запрошенный адрес».

Среда размещения: разработка

Корневой путь к содержимому: / app

Сейчаспрослушивание: https://localhost:5001

Сейчас прослушивание: http://localhost:5000

Приложение запущено.Нажмите Ctrl + C, чтобы завершить работу.

Затем, когда я открываю браузер на своем хосте и перехожу на http://localhost:8080, я получаю сообщение "Эта страница не работает" "localhost didn 't отправлять какие-либо данные "" ERR_EMPTY_RESPONSE "

Я также пробовал пару разных комбинаций портов с одинаковым результатом.

Может кто-нибудь определить, где я ошибся?Или есть какие-нибудь идеи / предложения?

1 Ответ

0 голосов
/ 14 февраля 2019

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

docker run --rm -it -p 8080:90 -v ${pwd}:/app -w "/app" microsoft/dotnet /bin/bash

И после этого я получил интерактивную оболочку bash, а при наборе dotnet run я получил такой же вывод, как и вы, и не могу добраться до моего сайта в контейнеречерез localhost:8080.

Я решил это, используя метод UseUrls или --urls аргумент командной строки.Они (метод UseUrls или --urls аргумент командной строки) указывают IP-адреса или адреса хостов с портами и протоколами, которые сервер должен прослушивать для запросов.Ниже описания решений, которые работали для меня:

  1. Редактировать CreateWebHostBuilder метод в Program.cs , как показано ниже:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                   .UseUrls("http://+:90") //for your case you should use 5000 instead of 90
                    .UseStartup<Startup>();

Вы можетепри необходимости укажите несколько портов, используя следующий синтаксис .UseUrls("http://+:90;http://+:5000")
. При таком подходе вы просто набрали dotnet run в оболочке bash, и тогда ваш контейнер будет доступен с помощью localhost:8080.

Но с помощью предыдущего подхода вы изменяете поведение исходного кода по умолчанию, которое вы можете забыть, а затем, возможно, следует отладить и исправить в будущем.
Поэтому я предпочитаю 2-й подход без изменения исходного кода.После ввода команды docker и получения интерактивной оболочки bash вместо dotnet run введите ее с аргументом --urls, как показано ниже (в вашем случае используйте порт 5000 вместо 90):

dotnet run --urls="http://+:90"

В документации также существует третий подход, в котором вы можете использовать ASPNETCORE_URLS переменную окружения, но этот подход мне не помог.Я использовал следующую команду (с переключателем -e ):

docker run --rm -it -p 8080:90 -v ${pwd}:/app -w "/app" -e "ASPNETCORE_URLS=http://+:90" microsoft/dotnet /bin/bash

Если вы наберете printenv inbash вы увидите, что переменная окружения ASPNETCORE_URLS передана контейнеру, но по какой-то причине dotnet run игнорирует ее.

...