localhost не работает докер windows 10
Я использую поддержку докера VS2017. VS создал для меня DockerFile, и когда я собираю файл docker-compose, он создает контейнер и запускает приложение по IP-адресу 172.xxx. Но я хочу запустить свое приложение на localhost.
Я сделал много вещей, но ничего не получалось. Следовал за документооборотом документооборота в качестве начального и строительного примера приложения для Microsoft. Вторая ссылка работает отлично, но я получаю HTTP-ошибку 404, когда попробовал первый подход ссылки.
Любая помощь приветствуется.
5 ответов
Чтобы получить доступ к примеру, опубликованному в Docker Docs, который вы указали как не работающий, выполните следующие действия:
1 - список всех запущенных докер-контейнеров
docker ps -a
После выполнения этой команды вы сможете увидеть все ваши контейнеры Docker, которые работают в данный момент, и вы должны увидеть контейнер с именем webserver
там, если вы правильно следовали примеру с докером.
2 - Получить IP-адрес, где ваш webserver
Контейнер работает. Для этого выполните следующую команду.
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" webserver
Теперь вы должны получить IP-адрес, который webserver
Контейнер запущен, надеюсь, вы знакомы с этим шагом, так как он даже был доступен в примере приложения Microsoft, который вы приложили к вопросу.
Получите доступ к IP-адресу, который вы получите, выполнив указанную выше команду, и вы увидите желаемый результат.
Отвечая на ваш первый вопрос (доступ к контейнеру Docker с помощью localhost в Docker для Windows), на хосте Windows вы не можете получить доступ к контейнеру с помощью localhost из-за ограничения сетевого стека NAT по умолчанию. Более подробное объяснение этой проблемы можно получить, перейдя по этой ссылке. Похоже, докерская документация еще не обновлена, но эта проблема существует только на хостах Windows.
Для этого также существует проблема - перейдите по этой ссылке, чтобы увидеть это.
Надеюсь, что это помогает вам.
РЕДАКТИРОВАТЬ
Решение этой проблемы, похоже, появится в будущем выпуске Windows. Тем не менее, этот релиз выходит, это ограничение доступно в хосте Windows. Перейдите по этой ссылке -> https://github.com/MicrosoftDocs/Virtualization-Documentation/issues/181
Скорее всего, другое приложение уже работает на порту 80. Вам нужно будет перенаправить ваш веб-сайт на другой порт, например:
docker run -d -p 5000:80 --name myapp myasp
И укажите ваш браузер на http://localhost:5000
,
Когда вы запускаете контейнер, вы указываете, какие внутренние порты будут отображаться как порты на хосте через -p
вариант. -p 80:80
выставляет внутренний порт 80
используется веб-сайтами для порта 80 хоста.
Однако Docker не будет жаловаться, если другое приложение уже прослушивает порт 80, например IIS, другое веб-приложение или любой инструмент с веб-интерфейсом, который по умолчанию работает на 80.
Решение состоит в том, чтобы:
- Убедитесь, что больше ничего не работает на порту 80 или
- Переслать в другой порт.
Переадресация в другой порт намного проще.
Чтобы убедиться, что вы можете подключиться к порту, используйте команду telnet, например:
telnet localhost 5000
Если вы сразу получаете пустое окно, это означает, что сервер запущен и работает на этом порту. Если через некоторое время вы получаете сообщение и время ожидания, это означает, что никто не работает. Вы также используете это, чтобы проверить наличие свободных портов и убедиться, что можете подключиться к своему веб-приложению-контейнеру.
PS Я столкнулся с этим всего неделю назад, когда пытался настроить контейнер SQL Server для тестов. Я запускаю 1 по умолчанию и 2 именованных экземпляра, и docker
совсем не жаловался, когда пытался создать контейнер. Мне потребовалось время, чтобы понять, что случилось.
Для тех, кто столкнулся с этой проблемой в 2022 году, изменение
localhost
к
127.0.0.1
решил проблему для меня.
Ответ заключается в том, чтобы переместить-p
аргумент на передовую, послеrun
. Порядок аргументов имеет значение..
Так что это не сработает:
docker run --rm example/app -p 5000:80
И это будет работать:
docker run -p 5000:80 --rm example/app
Есть и другая проблема. У вас должен быть правильный порядок с параметрами.
Это не верно
docker run container:latest -p 5001:80
Эта последовательность запускает контейнер, но параметр -p игнорируется, поэтому контейнер не имеет сопоставления портов.
Это хорошо
docker run -p 5001:80 container:latest