#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, и демон смог получить к нему доступ без каких-либо проблем (я использовал тот же удаленный адрес). В чем разница? Почему работает второе решение?