Гайд по Docker · 1 мин чтения

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.

bash
# --- 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. Проверить эндпоинт можно инструментами.

FAQ

Ответы на вопросы

Почему 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.

Эту страницу нашли по запросу

Реальные поисковые фразы, на которые отвечает эта страница — по ссылкам откроются материалы, раскрывающие тему глубже.