Skip to content
intermediate

Как маршрутизировать Docker-контейнеры через прокси ProxyScrape

Направляйте трафик контейнеров, загрузку образов и сервисы Compose через HTTP- или SOCKS5-эндпоинты ProxyScrape с помощью переменных окружения, конфигурации прокси клиента и демона, а также настроек на уровне приложения.

Linux SOCKS5 HTTP(S) Другое

Обзор

Docker-контейнеры изолированы от вашей хост-оболочки и ее настроек прокси, поэтому прокси, который работает в вашем терминале, не применяется автоматически внутри docker run или docker compose. Есть три практических места, куда можно вставить эндпоинт ProxyScrape: внутри контейнера в виде переменных окружения, на уровне клиента или демона Docker, чтобы загрузка образов и сборки использовали прокси, и в конфигурации приложения для инструментов, которые игнорируют переменные окружения или нуждаются в SOCKS5.

ProxyScrape предлагает резидентные, датацентровые и мобильные прокси через http и socks5, с оплатой по факту использования или фиксированным ежемесячным планом, так что вы можете подобрать пул и модель оплаты под рабочую нагрузку, которую контейнеризуете. Хост, порт и учетные данные эндпоинта перечислены в вашей панели управления ProxyScrape.

В этом руководстве рассматриваются все три уровня и показано, как убедиться, что трафик контейнера действительно выходит через прокси.

Что вам понадобится

  • Docker Engine 20.10 или новее, либо Docker Desktop
  • Docker Compose v2 (docker compose)
  • Подписка ProxyScrape, а также хост, порт, имя пользователя и пароль из вашей панели управления
  • Исходящий доступ к порту прокси в вашей сети

Выбор места применения прокси

Слой Применяется к Протоколы Примечания
Переменные окружения контейнера Клиенты, которые читают HTTP_PROXY (curl, pip, apt, многие SDK) http Быстрее всего настроить; URL-адреса SOCKS5 игнорируются большинством сред выполнения
Конфигурация клиента или демона Docker docker pull, docker build, docker push http Изменения на уровне демона требуют перезапуска службы
Конфигурация приложения или форвардер Инструменты с собственными настройками прокси или с потребностью только в SOCKS5 http, socks5 Наиболее надежно для нестандартных клиентов

Начните с переменных окружения и переходите к следующим строкам таблицы, только если инструмент их игнорирует.

Шаги

1. Храните учетные данные вне образа

Сформируйте URL прокси для протокола, который собираетесь использовать:

http://<username>:<password>@<host>:<port>
socks5h://<username>:<password>@<host>:<port>

Храните значения в файле, который никогда не попадает в контекст сборки или репозиторий Git.

mkdir -p ~/.config/proxyscrape
cat > ~/.config/proxyscrape/proxy.env <<'EOF'
PROXY_USER=your-username
PROXY_PASS=your-password
PROXY_HOST=proxy-host-from-dashboard
PROXY_PORT=proxy-port-from-dashboard
EOF
chmod 600 ~/.config/proxyscrape/proxy.env

Если пароль содержит @, :, / или #, закодируйте эти символы в процентах (percent-encode) перед вставкой в URL.

2. Проверьте эндпоинт с хоста

set -a; . ~/.config/proxyscrape/proxy.env; set +a

curl -sS -x "http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" https://api.ipify.org; echo
curl -sS -x "socks5h://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" https://api.ipify.org; echo

Используйте socks5h://, а не socks5://, чтобы разрешение имени хоста происходило на прокси, а не локально. Если успешно выполняется только одна из двух команд, используйте этот протокол для всей остальной настройки.

3. Передайте прокси одному контейнеру

docker run --rm \
  -e HTTP_PROXY="http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" \
  -e HTTPS_PROXY="http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" \
  -e http_proxy="http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" \
  -e https_proxy="http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" \
  -e NO_PROXY="localhost,127.0.0.1,::1" \
  curlimages/curl:latest -sS https://api.ipify.org; echo

Многие среды выполнения читают только имена в нижнем регистре, а некоторые — только в верхнем, поэтому задайте оба варианта. NO_PROXY исключает loopback- и внутренний трафик контейнера из прокси.

4. Управляйте прокси с помощью Docker Compose

Создайте файл .env в каталоге проекта Compose, чтобы Compose мог подставлять значения, и добавьте его в .gitignore.

PROXY_USER=your-username
PROXY_PASS=your-password
PROXY_HOST=proxy-host-from-dashboard
PROXY_PORT=proxy-port-from-dashboard
services:
  worker:
    image: python:3.12-slim
    environment:
      HTTP_PROXY: "http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}"
      HTTPS_PROXY: "http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}"
      http_proxy: "http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}"
      https_proxy: "http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}"
      NO_PROXY: "localhost,127.0.0.1,::1"
    command:
      - python
      - -c
      - "import urllib.request; print(urllib.request.urlopen('https://api.ipify.org').read().decode())"
docker compose up --build
docker compose logs worker

Обратите внимание, что значения, помещенные в env_file, внедряются в контейнер, но не используются для подстановки ${...}. Compose читает их из окружения оболочки или из файла .env проекта.

5. Направляйте загрузку образов и сборки через прокси

Для одного пользователя настройте клиент Docker так, чтобы сборки наследовали прокси. Сохраните это как ~/.docker/config.json:

{
  "proxies": {
    "default": {
      "httpProxy": "http://<username>:<password>@<host>:<port>",
      "httpsProxy": "http://<username>:<password>@<host>:<port>",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}

Конфигурация прокси клиента и демона Docker поддерживает только HTTP-прокси, поэтому используйте здесь эндпоинт http://, даже если внутри контейнеров вы используете SOCKS5.

На хостах Linux, где сам демон должен иметь доступ к реестру, вместо этого добавьте drop-in для systemd:

# /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://<username>:<password>@<host>:<port>"
Environment="HTTPS_PROXY=http://<username>:<password>@<host>:<port>"
Environment="NO_PROXY=localhost,127.0.0.1"
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info | grep -i proxy

6. Настройте инструменты, которые игнорируют переменные окружения

Некоторые менеджеры пакетов и среды выполнения требуют явных настроек.

apt внутри образа на основе Debian:

echo 'Acquire::http::Proxy "http://<username>:<password>@<host>:<port>";' \
  > /etc/apt/apt.conf.d/95proxy

pip:

pip install --proxy "http://<username>:<password>@<host>:<port>" requests

Для инструментов, работающих только через SOCKS5, proxychains-ng предоставляет обертку, которая принудительно направляет соединения через прокси:

# /etc/proxychains4.conf (фрагмент)
strict_chain
proxy_dns
[ProxyList]
socks5 <host> <port> <username> <password>
proxychains4 curl -sS https://api.ipify.org; echo

7. Проверьте исходящий трафик и следите за использованием

Убедитесь, какой адрес видит контейнер, затем сравните его с адресом, который вы получаете без заданных переменных прокси. Если они совпадают, прокси не используется.

docker run --rm \
  -e HTTPS_PROXY="http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" \
  curlimages/curl:latest -sS https://api.ipify.org; echo

Ротационные эндпоинты могут возвращать другой исходящий IP из пула при каждом запросе, что ожидаемо для задач сбора данных и мониторинга. Если ваш тариф ProxyScrape поддерживает сессионные или sticky-опции, добавьте идентификатор сессии в поле имени пользователя, как описано в вашей панели управления, и следите там за использованием, поскольку объем запросов тарифицируется.

Устранение неполадок

407 Требуется аутентификация прокси

Имя пользователя или пароль неверны, либо пароль содержит символы, которые не были закодированы в процентах. Скопируйте учетные данные из панели управления ProxyScrape и заново соберите URL.

На хосте работает, а в контейнере — нет

  • Убедитесь, что внутри контейнера заданы переменные прокси как в верхнем, так и в нижнем регистре.
  • Проверьте, что контейнер может разрешить имя хоста прокси: docker run --rm curlimages/curl:latest -sS -I http://<host>.
  • В Docker Desktop контейнеры выходят в интернет через виртуальную машину, поэтому убедитесь, что порт прокси не блокируется брандмауэром хоста.
  • Выведите переменные, чтобы исключить пустые значения: docker run --rm --env-file ~/.config/proxyscrape/proxy.env alpine env | grep -i proxy.

Соединения истекают по таймауту

  • Исходящий порт может блокироваться корпоративным брандмауэром или локальным VPN. Сначала проверьте с хоста.
  • Эндпоинты HTTP и SOCKS5 обычно слушают разные порты. Используйте порт, соответствующий настроенному протоколу.

URL-адреса SOCKS5 игнорируются

Большинство сред выполнения реализуют только переменные окружения HTTP-прокси. Используйте настройку на уровне приложения, например --proxy, обертку proxychains-ng или собственный аргумент прокси в библиотеке, вместо того чтобы полагаться на ALL_PROXY.

docker pull по-прежнему не работает после настройки демона

Выполните docker info | grep -i proxy, чтобы убедиться, что демон подхватил переменные, и помните, что ~/.docker/config.json применяется только к текущему пользователю. Проверьте список noProxy на записи, которые случайно охватывают имя хоста реестра.

Ошибки TLS или сертификата

Для HTTPS-целей прокси должен поддерживать метод CONNECT, который curl и клиент Docker используют автоматически. Если вы настроили URL HTTP-прокси, убедитесь, что целевой порт разрешен вашим эндпоинтом ProxyScrape.

Итоги

  • Контейнеры не наследуют настройки прокси хоста, поэтому явно передавайте учетные данные с помощью HTTP_PROXY, HTTPS_PROXY и их аналогов в нижнем регистре.
  • Используйте ~/.docker/config.json или drop-in для systemd, чтобы направлять загрузку образов и сборки, помня, что собственная конфигурация прокси Docker поддерживает только HTTP.
  • Некоторые инструменты, такие как apt, pip и клиенты только с SOCKS5, нуждаются в собственной конфигурации или обертке proxychains-ng.
  • Всегда проверяйте исходящий IP изнутри контейнера и храните учетные данные в файле, исключенном из системы контроля версий.
  • Резидентные, датацентровые и мобильные пулы ProxyScrape через http и socks5, с оплатой по факту использования или фиксированным ежемесячным платежом, дают вам варианты для каждой контейнеризированной рабочей нагрузки.