Проблема
С точки зрения контейнера, 127.0.0.1
является IP-адресом самого себя - не хост-ОС .Это означает, что вы не должны устанавливать 127.0.0.1:8080
как HTTP_PROXY
и HTTPS_PROXY
, потому что ваш контейнер будет вызывать сам себя, чтобы он не достигал Интернета.Вот почему ваш npm install
не работает.
Аналогично, ваше основное приложение за прокси-сервером node.js не должно использовать
...
ENV HTTP_PROXY "http://127.0.0.1:8446"
ENV HTTPS_PROXY "https://127.0.0.1:8446"
...
, потому что это будет вызывать себя в порту8446
, а не 8446 хост-ОС (которую вы намеревались направить в другой контейнер, на котором работает прокси-сервер node.js, но это никогда не будет работать).
Решение
Вы должны использовать что-то вроде docker compose или docker swarm, чтобы связать сеть двух контейнеров.Обратитесь к следующему примеру docker-compose.yml
:
version: "3.7"
services:
proxy:
image: myproxy
port:
- 8080:8080
app:
image: myapp
Кроме того, удалите следующие строки из dockerfile прокси-сервера и перестройте образ.
ENV HTTP_PROXY "http://127.0.0.1:8080"
ENV HTTPS_PROXY "https://127.0.0.1:8080"
Аналогичным образом измените файл docker основного приложения изэто
ENV HTTP_PROXY "http://127.0.0.1:8446"
ENV HTTPS_PROXY "https://127.0.0.1:8446"
до
ENV HTTP_PROXY "http://proxy:8446"
ENV HTTPS_PROXY "https://proxy:8446"
Теперь запустите docker-compose up
с этой конфигурацией, и ваш основной app
сможет достичь proxy
контейнера по имени хоста proxy
вместо 127.0.0.1
.Это означает, что вы будете использовать proxy:8080
для использования прокси-сервера, работающего на порте 8080.
PS: вы можете маршрутизировать контейнеры / службы Docker через их имя службы, поскольку у Docker есть механизм обнаружения служб, который он поддерживает.внутренне, и это будет динамически разрешать IP-адрес этих соединений.Это важно для контейнеров, потому что контейнеры могут быть уничтожены и воссозданы в любое время, что означает, что IP-адреса могут измениться в любое время.Для решения этой проблемы docker поддерживает хранилище значений ключей, которое сопоставляет имена служб / хостов с IP-адресами этих контейнеров и разрешает их для контейнеров, которые пытаются связаться с другими контейнерами.Обязательно измените все IP-адреса в вашем приложении, чтобы использовать имена хостов / сервисов вместо статических IP-адресов, если они должны перенаправляться на другие контейнеры / сервисы Docker.