Настройка мобильного прокси в Docker
Пошаговое руководство по настройке мобильного прокси в Docker. Настройте загрузку демонов, многоэтапную сборку, среды выполнения контейнеров и Docker Compose с использованием реальных IP-адресов операторов 4G/5G.
- Четкая граница между слоями — настройте прокси-переменные для загрузки образов демона Docker, этапов сборки или среды выполнения контейнеров независимо друг от друга.
- Оркестрация с помощью Docker Compose — передача настроек HTTP_PROXY и NO_PROXY конкретным микросервисам без нарушения сетевой инфраструктуры хоста.
- Чистый обход внутренней сети — обеспечьте прямой доступ к базам данных и службам localhost при соблюдении строгих правил NO_PROXY.
- Предотвращение утечки учетных данных из кэша — передавайте учетные данные прокси через аргументы сборки или секреты Docker, чтобы избежать записи паролей в слои образа.
Среда прокси-сервера Docker
Настройка прокси в Docker часто вызывает недопонимание, поскольку Docker работает в рамках трёх изолированных сетевых границ: демон Docker (dockerd), процесс сборки (docker build) и запущенные экземпляры контейнеров (docker run). Настройка прокси на одном уровне не распространяется на остальные. Понимание этих трёх отдельных областей применения имеет решающее значение для построения надёжных контейнерных прокси-конвейеров.
| Уровень области применения | Что он контролирует | Местоположение конфигурации |
|---|---|---|
| Область действия демона | Загрузка образов с Docker Hub / реестров | /etc/systemd/system/docker.service.d/http-proxy.conf |
| Объем работ | Установка пакетов (apt-get, pip, npm) в файле Dockerfile | --build-arg HTTP_PROXY=... |
| Среда выполнения контейнеров | Исходящий трафик от запущенных приложений | docker run -e HTTP_PROXY=... or docker-compose.yml |
Настройка прокси-сервера для контейнеров
Чтобы направлять исходящий трафик из контейнера через выделенный мобильный прокси-сервер, необходимо во время выполнения задать стандартные переменные среды прокси. Большинство контейнерных сред выполнения (Python, Go, Node.js, cURL) автоматически считывают эти переменные при инициализации.
docker run --rm \ -e HTTP_PROXY="http://user123:secret456@proxy.pxm2.io:8000" \ -e HTTPS_PROXY="http://user123:secret456@proxy.pxm2.io:8000" \ -e NO_PROXY="localhost,127.0.0.1,host.docker.internal" \ curlimages/curl:latest https://ipinfo.io/json
В качестве альтернативы вы можете настроить файл конфигурации клиента Docker CLI (~/.docker/config.json) таким образом, чтобы настройки прокси автоматически вставлялись во все вновь запускаемые контейнеры без необходимости повторного указания флагов -e.
{
"proxies": {
"default": {
"httpProxy": "http://user123:secret456@proxy.pxm2.io:8000",
"httpsProxy": "http://user123:secret456@proxy.pxm2.io:8000",
"noProxy": "localhost,127.0.0.1,.internal"
}
}
}
Настройка прокси в Docker Compose
В стеках из нескольких контейнеров Docker Compose позволяет точно контролировать, какие сервисы используют мобильные прокси, а какие взаимодействуют напрямую через локальные сети. Например, рабочие экземпляры, занимающиеся сбором данных, могут подключаться через выделенные модемы 4G/5G, в то время как сервисы баз данных и кэша Redis остаются полностью локальными.
version: '3.8'
services:
scraper-worker:
image: my-scraper:latest
environment:
- HTTP_PROXY=http://user123:secret456@proxy.pxm2.io:8000
- HTTPS_PROXY=http://user123:secret456@proxy.pxm2.io:8000
- NO_PROXY=localhost,127.0.0.1,postgres,redis
depends_on:
- postgres
- redis
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: scraper_data
POSTGRES_PASSWORD: secretpassword
redis:
image: redis:7-alpine
Прокси на уровне сети
Некоторые контейнерные инструменты не учитывают переменные среды или не поддерживают прокси в своём коде. В таких случаях маршрутизация на сетевом уровне или использование прокси-моделей типа «сайдкар» позволяют перенаправлять весь трафик контейнера без изменения исходного кода приложения.
Запустив контейнер-сайдкара с RedSocks или шлюз WireGuard, подключённый к хосту мобильного прокси, вы сможете перенаправлять все исходящие TCP-потоки из других контейнеров, использующих тот же сетевой пространство имён.
# Service sharing the sidecar proxy network
services:
proxy-gateway:
image: custom-redsocks-gateway
cap_add:
- NET_ADMIN
environment:
- PROXY_SERVER=proxy.pxm2.io
- PROXY_PORT=1080
legacy-app:
image: my-app:latest
network_mode: "service:proxy-gateway"
Устранение неполадок с прокси Docker
Распространённые проблемы при настройке мобильных прокси в контейнерах Docker и способы их решения:
| Проблема | Основная причина | Исправить |
|---|---|---|
| Превышение времени ожидания при подключении к базе данных | В NO_PROXY отсутствуют имена служб контейнеров. | Добавьте имена хостов баз данных (например, postgres, redis) в переменную среды NO_PROXY. |
| Ошибка при сборке Docker с кодом 407 | В этапах сборки отсутствуют учетные данные прокси. | Передайте аргумент --build-arg HTTP_PROXY во время сборки или воспользуйтесь функцией монтирования секретных данных BuildKit. |
| host.docker.internal недоступен | Разрешение локального хоста перенаправлено на мобильный модем. | Добавьте host.docker.internal в NO_PROXY. |
| Истечение времени ожидания при выполнении команды `docker pull` | Отсутствует конфигурация прокси-демона. | Настройте параметр HTTP_PROXY в файле systemd docker.service.d/http-proxy.conf и перезапустите демон. |
Великобритания
Испания
Индия
Часто задаваемые вопросы
В чём заключается разница между прокси-демоном и контейнерным прокси?
Настройки прокси-сервера демона Docker (в systemd или в файле ~/.docker/config.json) определяют, как dockerd загружает образы из реестров, таких как Docker Hub. В свою очередь, переменные прокси-сервера контейнера (HTTP_PROXY и HTTPS_PROXY) определяют исходящий сетевой трафик, генерируемый приложениями, запущенными внутри экземпляров контейнеров.
Как настроить прокси в Docker Compose?
Определите переменные среды в блоке service файла docker-compose.yml, указав значения для HTTP_PROXY, HTTPS_PROXY и NO_PROXY. Вы также можете использовать файл .env для централизованного управления настройками прокси-сервера и учетных данных для всех сервисов в проекте compose.
Почему контейнеры не могут подключаться к локальным базам данных, если установлен параметр HTTP_PROXY?
Если параметр NO_PROXY отсутствует или заполнен неполностью, запросы контейнера, адресованные localhost или именам в частной сети-мосту Docker, отправляются на мобильный прокси-сервер, который не может определить внутренние IP-адреса контейнеров. Всегда включайте в NO_PROXY адреса 127.0.0.1, localhost и подсети вашей внутренней сети.
Как передать прокси-сервер при сборке Docker без встраивания секретных данных в образы?
Передайте настройки прокси в качестве аргументов сборки: docker build --build-arg HTTP_PROXY="...". При использовании многоэтапной сборки аргументы сборки не сохраняются в слоях образа, что гарантирует, что пароли прокси не появятся в истории Docker.
Может ли Docker направлять весь трафик контейнеров через мобильный прокси SOCKS5?
Docker изначально не поддерживает системную маршрутизацию по протоколу SOCKS5 на уровне демона. Чтобы маршрутизировать весь трафик контейнеров через SOCKS5, используйте контейнер-сайдкар с запущенными программами redsocks или WireGuard либо настройте отдельные приложения внутри контейнеров на работу по протоколу SOCKS5.
Связанные руководства по мобильным прокси-серверам
Ознакомьтесь с руководствами по настройке сред разработки, скриптов автоматизации и конфигураций серверов.
Руководства для разработчиков и по автоматизации
Платформы и операционные системы
Масштабирование контейнерных рабочих нагрузок на реальном мобильном оборудовании
Интегрируйте специализированные мобильные модемы 4G/5G непосредственно в поды Docker и Kubernetes, предназначенные для сбора данных. Неограниченная пропускная способность и надежные показатели доверия операторов связи.
Получить мобильный прокси