Не удается загрузить изображения Docker за прокси

Я установил Docker на свою Ubuntu 13.10 (Saucy Salamander) и когда я печатаю в своей консоли:

sudo docker pull busybox

Я получаю следующую ошибку:

Pulling repository busybox
2014/04/16 09:37:07 Get https://index.docker.io/v1/repositories/busybox/images: dial tcp: lookup index.docker.io on 127.0.1.1:53: no answer from server

Версия докера:

$ sudo docker version

Client version: 0.10.0
Client API version: 1.10
Go version (client): go1.2.1
Git commit (client): dc9c28f
Server version: 0.10.0
Server API version: 1.10
Git commit (server): dc9c28f
Go version (server): go1.2.1
Last stable version: 0.10.0

Я за прокси-сервером без аутентификации, и это мой /etc/apt/apt.conf файл:

Acquire::http::proxy "http://192.168.1.1:3128/";
Acquire::https::proxy "https://192.168.1.1:3128/";
Acquire::ftp::proxy "ftp://192.168.1.1:3128/";
Acquire::socks::proxy "socks://192.168.1.1:3128/";

Что я делаю неправильно?

28 ответов

Решение

Вот ссылка на официальную документацию Docker для прокси HTTP: https://docs.docker.com/config/daemon/systemd/

Быстрый набросок:

Сначала создайте системный каталог для службы Docker:

mkdir /etc/systemd/system/docker.service.d

Теперь создайте файл с именем /etc/systemd/system/docker.service.d/http-proxy.conf это добавляет HTTP_PROXY переменная окружения:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"

Если у вас есть внутренние реестры Docker, с которыми вам нужно связаться без прокси, вы можете указать их через NO_PROXY переменная окружения:

Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"

Флеш изменения:

$ sudo systemctl daemon-reload

Убедитесь, что конфигурация была загружена:

$ sudo systemctl show --property Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/

Перезапустите Docker:

$ sudo systemctl restart docker

Ваши настройки прокси APT не связаны с Docker.

Docker использует переменную среды HTTP_PROXY, если она есть, например:

sudo HTTP_PROXY=http://192.168.1.1:3128/ docker pull busybox

Но вместо этого я предлагаю вам взглянуть на ваш /etc/default/dockerфайл конфигурации: у вас должна быть строка, чтобы раскомментировать (и, возможно, настроить), чтобы ваши настройки прокси применялись автоматически. Затем перезапустите сервер Docker:

service docker restart

На CentOS файл конфигурации для Docker находится по адресу:

/etc/sysconfig/docker

Добавление строки ниже помогло мне заставить демона Docker работать за прокси-сервером:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="http://<proxy_host>:<proxy_port>"

Если вы используете новый Docker для Mac (или Docker для Windows), просто щелкните правой кнопкой мыши значок Docker на панели задач и выберите " Настройки" (Windows: Настройки), затем перейдите в "Дополнительно" и в разделе "Прокси" укажите настройки прокси-сервера. Нажмите Apply и Restart и дождитесь перезапуска Docker.

В Ubuntu вам нужно установить http_proxy для демона Docker, а не клиентский процесс. Это сделано в /etc/default/docker (см. здесь).

Чтобы расширить ответ Аруна выше, чтобы это работало в CentOS 7, мне пришлось удалить команды "export". Так редактировать

/etc/sysconfig/docker

И добавить:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="https://<proxy_host>:<proxy_port>"
http_proxy="${HTTP_PROXY}"
https_proxy="${HTTPS_PROXY}"

Затем перезапустите Docker:

sudo service docker restart

Источник - это сообщение в блоге.

Почему локально связанный прокси не работает

Эта проблема

Если вы используете локально связанный прокси, например, прослушивание 127.0.0.1:8989, это не будет работать в Docker для Mac. Из документации Docker:

Я хочу подключиться из контейнера к службе на хосте

У Mac есть изменяющийся IP-адрес (или его нет, если у вас нет доступа к сети). Наша текущая рекомендация - прикрепить неиспользуемый IP к lo0 интерфейс на Mac; например: sudo ifconfig lo0 alias 10.200.10.1/24 и убедитесь, что ваша служба прослушивает этот адрес или 0.0.0.0 (т.е. нет 127.0.0.1). Затем контейнеры могут подключиться к этому адресу.

Аналогично для серверной части Docker. (Чтобы понять серверную и клиентскую стороны Docker, попробуйте запустить docker version.) И серверная сторона работает на уровне виртуализации, который имеет свой собственный localhost, Поэтому он не будет подключаться к прокси-серверу на localhost хоста ОС.

Решение

Итак, если вы используете локально-связанный прокси-сервер, такой как я, вам, в принципе, придется сделать следующее, чтобы он работал с Docker для Mac:

  1. Сделайте так, чтобы ваш прокси-сервер слушал 0.0.0.0 вместо 127.0.0.1, Внимание: вам потребуется правильная настройка брандмауэра, чтобы предотвратить злонамеренный доступ к нему.

  2. Добавьте псевдоним петли к lo0 интерфейс, например 10.200.10.1/24:

    sudo ifconfig lo0 alias 10.200.10.1/24
    
  3. Установите HTTP и / или HTTPS прокси в 10.200.10.1:8989 из Предпочтения в меню панели задач (предположим, что прокси-сервер прослушивает порт 8989).

После этого проверьте настройки прокси, выполнив команду в новом контейнере из образа, который не загружен:

$ docker rmi -f hello-world
  ...

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

c04b14da8d14: Pull complete 
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
  ...

Обратите внимание: псевдоним петли, установленный ifconfig не сохраняет после перезагрузки. Чтобы сделать это постоянным, другая тема. Пожалуйста, проверьте эту запись в блоге на японском языке (Google Translate может помочь).

Это исправление, которое работало для меня: Ubuntu, версия Docker: 1.6.2

В файле /etc/default/docker, добавьте строку:

export http_proxy='http://<host>:<port>'

Перезапустите Docker

sudo service docker restart

Чтобы настроить Docker для работы с прокси-сервером, необходимо добавить переменную среды HTTPS_PROXY / HTTP_PROXY в файл sysconfig Docker (/etc/sysconfig/docker).

В зависимости от того, если вы используете init.d или сервисный инструмент, вам нужно добавить оператор "export" (из-за журналов отчетов об ошибках Debian - #767441. Примеры в /etc/default/docker вводят в заблуждение относительно поддерживаемого синтаксиса):

HTTPS_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
HTTP_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
export HTTP_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
export HTTPS_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"

Хранилище Docker (Docker Hub) поддерживает только HTTPS. Чтобы Docker работал с перехватчиками SSL, вам нужно добавить корневой сертификат прокси-сервера в хранилище доверенных сертификатов системы.

Для CentOS скопируйте файл в /etc/pki/ca-trust/source/anchors/ и обновите хранилище доверенных сертификатов CA и перезапустите сервис Docker.

Если ваш прокси использует аутентификацию NTLMv2 - вам нужно использовать промежуточные прокси, такие как Cntlm, чтобы соединить аутентификацию. Этот пост в блоге объясняет это подробно.

В новой версии Docker, docker-engine, в дистрибутиве, основанном на systemd, вы должны добавить строку переменной среды в /lib/systemd/system/docker.service, как упоминалось другими:

Environment="HTTP_PROXY=http://hostname_or_ip:port/"

После установки Docker сделайте следующее:

[mdesales@pppdc9prd1vq ~]$ sudo HTTP_PROXY=http://proxy02.ie.xyz.net:80 ./docker -d &
[2] 20880

Затем вы можете вытащить или сделать что-нибудь:

mdesales@pppdc9prd1vq ~]$ sudo docker pull base
2014/04/11 00:46:02 POST /v1.10/images/create?fromImage=base&tag=
[/var/lib/docker|aa088847] +job pull(base, )
Pulling repository base
b750fe79269d: Download complete
27cf78414709: Download complete
[/var/lib/docker|aa088847] -job pull(base, ) = OK (0)

Если используется прокси socks5, вот мой тест с Docker 17.03.1-ce с настройкой "all_proxy", и он работал:

# Set up socks5 proxy server
ssh sshUser@proxyServer -C -N -g -D \
     proxyServerIp:9999 \
     -o ExitOnForwardFailure=yes \
     -o ServerAliveInterval=60

# Configure dockerd and restart.
# NOTICE: using "all_proxy"
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="all_proxy=socks5://proxyServerIp:9999"
Environment="NO_PROXY=localhost,127.0.0.1,private.docker.registry.com"
EOF

systemctl daemon-reload
systemctl restart docker

# Test whether can pull images
docker run -it --rm alpine:3.5

Как я не могу комментировать пока:

Для CentOS 7 мне нужно было активировать EnvironmentFile в "docker.service", как описано здесь: Управление и настройка Docker с помощью systemd.

Изменить: я добавляю свое решение, как указано Nilesh. Мне нужно было открыть "/etc/systemd/system/docker.service", и я должен был добавить в разделе

[Обслуживание]

EnvironmentFile = - / и т.д. /sysconfig/ Докер

Только тогда в моей системе был загружен файл "etc /sysconfig/docker".

Чтобы решить проблему с curl в сборке Docker, я добавил следующее в Dockerfile:

ENV http_proxy=http://infoprx2:8080
ENV https_proxy=http://infoprx2:8080
RUN apt-get update && apt-get install -y curl vim

Обратите внимание, что оператором ENV является ПЕРЕД оператором RUN.

И чтобы демон Docker мог выходить в Интернет (я использую Kitematic с boot2docker), я добавил следующее в /var/lib/boot2docker/profile:

export HTTP_PROXY=http://infoprx2:8080
export HTTPS_PROXY=http://infoprx2:8080

Затем я перезапустил Docker с sudo /etc/init.d/docker restart,

Полное решение для Windows, для настройки параметров прокси.

< user>:< password>@< proxy-host>:< proxy-port>

Вы можете настроить его напрямую, щелкнув правой кнопкой мыши на настройках, в значке Docker, а затем в Прокси.

Здесь вы можете настроить адрес прокси, порт, имя пользователя и пароль.

В таком формате:

< user>:< password>@< proxy-host>:< proxy-port>

Пример:

"geronimous:mypassword@192.168.44.55:8080"

Не более того.

Я также столкнулся с той же проблемой за брандмауэром. Выполните следующие шаги:

$ sudo vim /etc/systemd/system/docker.service.d/http_proxy.conf
[Service]
Environment="HTTP_PROXY=http://username:password@IP:port/"

Не используйте и не удаляйте файл https_prxoy.conf.

перезагрузите и перезапустите докер

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557*********************************8
Status: Downloaded newer image for hello-world:latest

Если вы находитесь в Ubuntu, выполните эти команды, чтобы добавить свой прокси.

sudo nano /etc/default/docker

И раскомментируйте строки, которые указывают

#export http_proxy = http://username:password@10.0.1.150:8050

И замените его соответствующим прокси-сервером и именем пользователя.

Затем перезапустите Docker, используя:

service docker restart

Теперь вы можете запускать команды Docker за прокси:

docker search ubuntu

Простая установка переменных окружения прокси не помогла мне в версии 1.0.1... Мне пришлось обновить /etc/default/docker.io файл с правильным значением переменной http_proxy.

Возможно, вам нужно установить строчные переменные. В моем случае мой файл /etc/systemd/system/docker.service.d/http-proxy.conf выглядит так:

[Service]
Environment="ftp_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"
Environment="http_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"
Environment="https_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"

Удачи!:)

Если вы находитесь в Ubuntu, вы должны выполнить эту команду:

export https_proxy=http://your_name:password@ip_proxy:port docker 

И перезагрузите Docker с помощью:

service docker.io restart

Или перейдите к /etc/docker.io с нано...

На Ubuntu 14.04 (Trusty Tahr) с Docker 1.9.1 я просто раскомментировал http_proxy линии, обновил значение и перезапустил сервис Docker.

export http_proxy="http://proxy.server.com:80"

а потом

service docker restart

Удалить прокси из переменных среды

      unset http_proxy
unset https_proxy
unset no_proxy

а затем перезапустите докер

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

Для RHEL7 я настроил систему так:

зашел в каталог / etc / sysconfig / docker

      Environment=http_proxy="http://ip:port"
Environment=https_proxy="http://ip:port"
Environment=no_proxy="hostname"

затем сохраните файл и используйте команду:

sudo systemctl перезапустить докер

после этого настройте свой Dockerfile: сначала настройте структуру среды:

      ENV http_proxy http://ip:port
ENV https_proxy http://ip:port
ENV no_proxy "hostname"

это все! :)

В моей сети Ubuntu работает за корпоративным прокси-сервером ISA. И это требует аутентификации. Я перепробовал все решения, упомянутые выше, и ничего не помогло. Что действительно помогло, так это написать строку прокси в файле /etc/systemd/system/docker.service.d/https-proxy.conf без доменного имени.

Вместо

Environment="HTTP_PROXY=http://user@domain:password@proxy:8080"

или же

Environment="HTTP_PROXY=http://domain\user:password@proxy:8080"

и некоторые другие замены, такие как @ -> %40 или же \ -> \\ Я пытался использовать

Environment="HTTP_PROXY=http://user:password@proxy:8080"

И это работает сейчас.

Попробуй это:

sudo HTTP_PROXY=http://<IP address of proxy server:port> docker -d & 

Решили проблему, выполнив следующие действия:

Шаг 1: sudo systemctl start docker

Шаг 2: sudo systemctl включить докер

(Создана символическая ссылка из /etc/systemd/system/multi-user.target.wants/docker.service на /usr/lib/systemd/system/docker.service.)

Шаг 3: докер состояния sudo systemctl

шаг 4: sudo mkdir -p /etc/systemd/system/docker.service.d

шаг 5: sudo vi /etc/systemd/system/docker.service.d/proxy.conf

Установите прокси, как показано ниже

[Служба]

Environment="HTTP_PROXY=http://proxy.server.com:80"

Environment="HTTPS_PROXY=http://proxy.server.com:80"

Environment="NO_PROXY=.proxy.server.com,*.proxy.server.com,localhost,127.0.0.1,::1"

шаг 6: sudo systemctl daemon-reload

Шаг 7: sudo systemctl restart docker.service

шаг 8: vi / etc / environment и источник / etc / environment

http_proxy=http://proxy.server.com:80 https_proxy=http://proxy.server.com:80 ftp_proxy=http://proxy.server.com:80 no_proxy=127.0.0.1,10.0.0.0/8,3.0.0.0/8,localhost,*.abc.com

Это не совсем ответ на вопрос, но может помочь, особенно если вы не хотите иметь дело со служебными файлами.

В случае, если вы размещаете образ, один из способов - вместо этого преобразовать образ в tar-архив, используя на сервере что-то вроде следующего.

docker save <image-name> --output <archive-name>.tar

Просто скачайте архив и снова превратите его в образ.

docker load <archive-name>.tar

На RHEL6.6 только это работает (обратите внимание на использование export):

/ и т.д. /sysconfig/ Докер

export http_proxy="http://myproxy.example.com:8080"
export https_proxy="http://myproxy.example.com:8080"

ПРИМЕЧАНИЕ: оба могут использовать http Протокол.)

Благодаря https://crondev.com/running-docker-behind-proxy/

Другие вопросы по тегам