Docker dotnet run port не отображается, хост Windows 10, контейнер linux

Я следую 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 ...

информация: 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} может храниться в хранилище в незашифрованном виде.

информация: 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 не отправил никаких данных "" ERR_EMPTY_RESPONSE "

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

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


person Stark    schedule 14.12.2018    source источник
comment
вы пытались достичь конечной точки https: localhost: 8080?   -  person Michael    schedule 14.12.2018
comment
Вы сопоставляете 8080:5001, который является портом https, вам необходимо получить доступ к https в соответствии с предложением Майкла. Если не работает, не могли бы вы поделиться с нами подробными инструкциями по воспроизведению вашей проблемы? Похоже, это связано с ошибкой невозможности привязки к 5001. Вы запускали несколько приложений? Попробуйте сменить новый порт, например 5002.   -  person Edward    schedule 17.12.2018
comment
@Michael Да, я сделал - то же самое   -  person Stark    schedule 19.12.2018
comment
@TaoZhou Im фактически отображает как http (5000), так и http (5001). Пробовали как http, так и https, эффект немного другой, на этот раз получилось ERR_CONNECTION_CLOSED. Также пробовал на порту 8082   -  person Stark    schedule 19.12.2018
comment
Есть ли какие-либо демонстрационные и подробные инструкции по воспроизведению вашей проблемы?   -  person Edward    schedule 19.12.2018


Ответы (1)


Не уверен, что этот вопрос по-прежнему актуален для вас, но я также столкнулся с этой проблемой и оставил свое решение здесь для других. Я использовал 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. Измените CreateWebHostBuildermethod в 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.

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

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

  2. В документации есть это также третий подход, в котором вы можете использовать переменную среды 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 в bash, вы увидите, что ASPNETCORE_URLS переменная среды была передана в контейнер, но по какой-то причине dotnet run игнорирует ее.

person user2771704    schedule 14.02.2019