Почему демон Docker не может получить доступ к адресу локального хоста?

#docker #containers #daemon

#docker #контейнеры #демон

Вопрос:

В настоящее время я работаю с API Docker Engine и пытаюсь создать простой образ. У меня Windows 10 с WSL2, я могу вызвать API через сокет unix ( /var/run/docker.sock ) или через открытый демон на TCP-порту 2375.

Конечная точка, которую я вызываю, — это конечная точка /build . Я использую параметр remote запроса, поэтому демон попытается извлечь содержимое этого удаленного адреса и использовать его для построения образа. Я также создал крошечный сервер NodeJS, который обслуживает текстовый файл (Dockerfile), а его конечная точка onyl будет удаленным адресом для моей сборки Docker.

Сначала я запускал сервер узла на своем хост-компьютере с помощью простой команды запуска npm. Затем я предоставил адрес локальной конечной точки (что-то вроде http://localhost:4000/Dockerfile ) для конечной точки /build, но это не удалось по какой-либо причине:

 {
    "message": "error downloading remote context http://localhost:4000/Dockerfile: Get http://localhost:4000/Dockerfile: dial tcp localhost:4000: connect: connection refused"
}
 

Затем я также попробовал то же самое с докеризованной версией сервера узла (просто создал образ из моего кода и предоставил его тому же порту хоста). На этот раз он работал отлично, с точно таким же удаленным параметром: http://localhost:4000/Dockerfile .

На данный момент меня устраивает мое решение, так как я все равно хотел запустить сервер узла внутри контейнера. Но я также хотел бы понять, что произошло и почему это произошло? Я вижу, что это было из-за какой-то сети. Я предполагаю, что после помещения моего сервера узла в контейнер он стал частью сети (я думаю, что это должна быть bridge сеть Docker по умолчанию), и после этого мой демон Docker мог получить к нему доступ, но я не уверен, поскольку не смог найти никакой информации об этом в Интернете. Или, может быть, демон Docker запущен в определенной сети, которая не может получить доступ к адресам на хост-машине?

Обновление # 1

Я добился минимального прогресса в расследовании. Я до сих пор не знаю, почему localhost адрес работал, когда я переключился на докеризированную версию сервера узла, но я нашел 2 альтернативы для удаленного адреса.

Ключевым моментом было то, что я обнаружил, что когда я запускаю свой сервер узлов npm start , я могу получить к нему доступ с двумя разными IP-адресами, в зависимости от того, на каком терминале я выполнил команду. У меня есть обычный терминал Windows с узлом, установленным в моей Windows, и у меня также есть терминал WSL с собственным установленным узлом.

Если я запускаю команды ipconfig / ifconfig внутри этих терминалов, я также получаю разные адреса Ethernet, что-то вроде: 192.168.1.110 для Windows и 192.168.106.100 для WSL. Когда я использовал эти IP-адреса (в зависимости от того, где я запустил свой сервер узлов), мой демон Docker мог достичь конечной точки. Но решение локального хоста по-прежнему не работает, если я не запускаю его из Docker.

Ответ №1:

На вашем локальном компьютере localhost указывает на ваш локальный компьютер (sic!). Но если вы запускаете приложение в контейнере Docker, адрес localhost указывает на среду контейнера.

Но для этого есть простое решение: просто используйте host.docker.internal . Docker сопоставляет этот адрес с вашим локальным компьютером.

Комментарии:

1. Спасибо за ваш комментарий, но, к сожалению, он не отвечает на мой вопрос. Позвольте мне немного перефразировать это. Я использовал тот же удаленный адрес ( http://localhost:4000/Dockerfile ), когда вызывал конечную точку /build API Docker Engine. Удаленный адрес обслуживается моим небольшим узловым приложением. В первый раз я запустил это приложение с помощью npm start на моем хост-компьютере, но, похоже, демон не смог получить доступ к этому адресу. Во второй раз я запустил свое приложение внутри контейнера Docker, и демон смог получить к нему доступ без каких-либо проблем (я использовал тот же удаленный адрес). В чем разница? Почему работает второе решение?