Docker за прокси: демон, сборка и compose
Docker требует прокси в трёх разных местах: демон, тянущий образы, сборка, выполняющая команды, и сами контейнеры. Настроите не то — и pull всё равно будет падать. Разбираем каждое с правильной областью действия.
Три уровня — три конфигурации
Жалоба «я выставил http_proxy, а docker pull всё равно падает» так распространена потому, что у Docker три независимых сетевых контекста, а переменные окружения вашей оболочки трогают только один из них. Первый: образы из реестра тянет демон (dockerd) — он работает как системная служба и берёт прокси из собственного конфига, а не из вашей оболочки. Второй: при сборке каждый шаг RUN выполняется во временном контейнере, которому нужен свой прокси, чтобы добраться до сети. Третий: запущенному контейнеру прокси нужен, если приложение внутри само ходит наружу.
Все три используют HTTP-эндпоинт s4m на порту 3128 с аутентификацией USER:PASS. Современный способ настроить сборку и запуск — конфиг клиента Docker ~/.docker/config.json: он автоматически подставляет настройки прокси в сборку и в docker run; сам демон настраивается через systemd drop-in или настройки Docker Desktop. Смотрите страницу прокси; естественное дополнение — руководства по npm/yarn и pip/conda для того, что работает внутри ваших образов.
Настройте все три уровня
Демон — через systemd drop-in, сборка и запуск — через docker config.json, плюс запасной вариант для compose. Замените USER:PASS.
# --- 1) DAEMON (image pulls): systemd drop-in on Linux --- sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf >/dev/null <<'CONF' [Service] Environment="HTTP_PROXY=http://USER:[email protected]:3128" Environment="HTTPS_PROXY=http://USER:[email protected]:3128" Environment="NO_PROXY=localhost,127.0.0.1,.internal" CONF sudo systemctl daemon-reload && sudo systemctl restart docker # --- 2) BUILDS + RUNS: ~/.docker/config.json (injected automatically) --- cat > ~/.docker/config.json <<'JSON' { "proxies": { "default": { "httpProxy": "http://USER:[email protected]:3128", "httpsProxy": "http://USER:[email protected]:3128", "noProxy": "localhost,127.0.0.1,.internal" } } } JSON # --- 3) docker-compose fallback (per-service build args) --- # services: # app: # build: # context: . # args: # HTTP_PROXY: http://USER:[email protected]:3128 # HTTPS_PROXY: http://USER:[email protected]:3128
Чтобы docker pull и build заработали
Чините уровни в том порядке, в каком обычно появляются сбои.
Сначала почините демона
Если docker pull падает, демон не достаёт до реестра. Добавьте systemd drop-in с HTTP_PROXY/HTTPS_PROXY, сделайте daemon-reload и перезапустите docker. В Docker Desktop прокси задаётся в Settings.
Настройте клиент для сборки
Добавьте блок proxies в ~/.docker/config.json, чтобы docker build и docker run сами подставляли прокси в каждый шаг и каждый контейнер — Dockerfile править не придётся.
Везде пропишите NO_PROXY
Внесите localhost, 127.0.0.1 и все внутренние реестры и сервисы в NO_PROXY на каждом уровне, чтобы внутренний трафик зря не уходил наружу через прокси.
Проверьте каждый уровень
Проверяйте так: docker pull hello-world (демон), сборка с apt-get или pip (build) и контейнер, который curl'ом стучится в эндпоинт, отдающий IP (runtime).
Границы, секреты и честность
Два предостережения. Первое: не оставляйте учётные данные прокси в слоях образа. Переменные окружения с прокси, заданные в Dockerfile через ENV, запекаются в образ; берите вместо этого build args или подстановку из клиентского config.json, чтобы учётные данные оставались на машине сборки. Второе: будьте точны с NO_PROXY — забытая запись для внутреннего реестра означает, что Docker полезет к нему через внешний прокси и упадёт так, что причину сразу не поймёшь.
HTTP-прокси s4m — это датацентровый эндпоинт с аутентификацией и оплатой за фактический трафик, хорошо подходящий CI-сборщикам и DevOps-машинам, которым нужно тянуть образы и пакеты из-за контролируемого выхода в сеть. Он не резидентный, и это forward-прокси, а не зеркало и не кеш реестра: если нужно кеширование, поднимите рядом зеркало реестра. Когда вашему парку сборщиков нужен один исходящий IP для белого списка, добавьте выделенный персональный IP. 407 в любом месте означает неверные учётные данные прокси — смотрите руководство по 407. Проверить эндпоинт можно инструментами.
Ответы на вопросы
Почему docker pull падает, хотя я выставил http_proxy в оболочке?
Потому что образы тянет демон, а не ваша оболочка. Пропишите прокси для dockerd через systemd drop-in (или в настройках Docker Desktop) с переменными HTTP_PROXY/HTTPS_PROXY, затем daemon-reload и перезапуск docker.
Как пустить docker build и docker run через прокси, не трогая Dockerfile?
Добавьте блок proxies в ~/.docker/config.json. Клиент Docker сам подставляет httpProxy/httpsProxy в каждый шаг сборки и в каждый контейнер, так что править Dockerfile не нужно.
Как не занести учётные данные прокси в образ?
Не задавайте их через ENV в Dockerfile — так они запекаются в слои. Используйте build args или подстановку из клиентского config.json, чтобы учётные данные оставались на машине сборки, а не в готовом образе.
Даёт ли s4m зеркало или кеш реестра?
Нет. s4m — это forward-прокси в дата-центре для исходящего трафика, а не кеш реестра. Чтобы кешировать образы, поднимите зеркало реестра и при необходимости пустите его через прокси.
Тяните образы и собирайте через прокси
Пустите демон Docker, сборки и контейнеры через HTTP-эндпоинт с аутентификацией на proxy.s4m.online:3128. Оплата за фактический трафик, выделенный IP для белых списков в CI.
Эту страницу нашли по запросу
- Docker за прокси
- как использовать прокси в Scrapy
- Docker за прокси инструкция
- Docker за прокси настройки
- как проверить, рабочий ли прокси (с готовым скриптом)
- как работает socks5 прокси
- как работает wireguard
- безопасен ли авторизация прокси
- ip адрес
- сколько живут бесплатные прокси
- авторизация прокси
Реальные поисковые фразы, на которые отвечает эта страница — по ссылкам откроются материалы, раскрывающие тему глубже.