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


330

Я установил 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/";

Что я делаю не так?


6
Для пользователей Windows , и boot2docker см stackoverflow.com/a/29303930/6309
— VonC

1
Одна небольшая деталь: apt вообще не поддерживает SOCKS прокси. Acquire::socks::proxyозначает установить прокси для всех URL, начиная со socksсхемы. Поскольку у вас sources.listнет socks://URL, эта строка полностью игнорируется.
— Ганс-Кристоф Штайнер

Как насчет docker-compose?
— Мохаммад Масуми

Ответы:


797

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

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

Сначала создайте системный каталог для службы 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

3
Это работает для Debian Jessie под управлением Docker 1.6.2. Как-то редактирование /etc/default/dockerне работает. Может быть, я должен удалить, exportкак тот, который задокументирован для Centos.
— неврит

2
Для более старых версий SysV отредактируйте / etc / sysconfig / docker, как в docs.oracle.com/cd/E37670_01/E37355/html/… - Oracle Linux 6.7
— SidJ

2
NB: Я предполагал, что 'daemon-reload' будет достаточно, чтобы применить изменения к Docker, но на самом деле sudo systemctl restart dockerэто строго необходимо для его работы.
— Хосе Албан

4
Для Ubuntu 14.04 см. Ответ @ n3o, поскольку systemctl он недоступен для Ubuntu 14.04, он использует upstartдля вызова сервисов.
— Чинмай

4
Теперь он возвращает «Требуется проверка подлинности прокси» ... как настроить имя пользователя и пароль?
— Pinei

88

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

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

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

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

service docker restart

8
В моем случае / etc / default / docker содержал пример в нижнем регистре (http_proxy), но чтобы все работало, мне нужно было добавить параметр в верхнем регистре (HTTP_PROXY).
— Мекк

Вы не должны устанавливать HTTP_PROXY для клиента докера
— thomas.han

3
Не работает с докером 1.9.1, вместо этого посмотрите этот ответ ниже
— Петр Дотчев

1
Это работает для Ubuntu 14.04 при установке docker с apt.dockerproject.org.
— Майкл Копп

1
Это не работает в Debian 8.8, и вам нужно установить http_proxy в /etc/systemd/system/docker.service.d, как показано в принятом ответе
— Роман Мик,

60

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

/etc/sysconfig/docker

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

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

7
export HTTP_PROXY = "http: // <имя пользователя>: <пароль> @ <proxy_host>: <proxy_port>" для тех, кто стоит за корпоративными прокси-серверами
— Николас Момэртс

для меня это работало ТОЛЬКО без export. Вы уверены, что это правильно?
— Франс

4
У меня exportработает только на CentOS6 и без CentOS7
— user2363318

1
На Centos7 мне также пришлось не использовать экспорт
— Banjocat

2
export HTTP_PROXY=...это Bashism, для не-Bash-оболочек (например, что может быть / bin / sh), используйте две строки, HTTP_PROXY=...а затем export HTTP_PROXY сказал, что мне вообще не нужно export.
— Кэмерон Керр

42

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


В случае, если кто-то использует локально-связанный прокси (например, 127.0.0.1:8787 ) в macOS, как я, вот более подробное руководство по установке: Почему локально-связанный прокси не работает
— Rockallite,

Я установил свои прокси через windows: настройки, но эти прокси не распространяются на мои контейнеры stackoverflow.com/questions/48272933/…
— amique

Мне нужно было только вставить свой DNS-сервер, и он работал тогда. Спасибо.
— Ричин

32

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


там написано, что у меня нет разрешения на доступ к вашей группе. По ссылке.
— Азизбро

Я не думаю, что это работает для Ubuntu 18.04 и выше.
— zslim

27

Чтобы расширить ответ Аруна , чтобы это работало в 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

Источник этого блога .


2
Требуется только HTTP_PROXY (протестировано на Fedora 20).
— Шелдон

Идеально подходит для Suse 12!
— Дин Михан,

14

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

Эта проблема

Если вы используете локально связанный прокси - сервер, например, слушаете 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из Preferences в меню Докер лотка (предположим , что прокси - сервер прослушивает порт 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 может помочь).


Спасибо за это, я пытался найти решение за последний год или около того, чтобы получить SquidMan на Mac при попытке получить доступ как к работе, так и к внешней сети через прокси-сервер компании. Я заставил это остаться, подключив его к launchd для настройки при запуске. developer.apple.com/library/content/documentation/MacOSX/…
— Проктор

Спасибо чувак. Я наконец нашел ваш пост! Оно работает. Если вы используете cntlm, не забудьте добавить привязку 0.0.0.0 в вашу конфигурацию. например, прослушать 0.0.0.0: 8989
— Феликс

я тоже использую cntlm и переключаю его в режим шлюза
— Lee Gary

10

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

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

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

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

sudo service docker restart

Работа над Docker v1.12.1 на Ubuntu 14.04 и Mint 17.3
— wmarbut

1
Работает на 14.04.4 + Docker версия 17.03.1-ce, сборка c6d412e
— okwap

8

Чтобы настроить 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, чтобы соединить аутентификацию. Этот пост в блоге объясняет это подробно .


5

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

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

Это было необходимо на RHEL7.
— дбалакирев

добавить строку в раздел [Service]
— volkit

5

После установки 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)

3

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

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

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

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

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

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


3

Чтобы решить проблему с 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.


3

Если вы используете прокси 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

3

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

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

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

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

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

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

Пример:

"geronimous:mypassword@192.168.44.55:8080"

Ничего больше, чем это.


2

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


2

Если вы находитесь в 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

2

Возможно, вам нужно настроить строчные переменные. В моем случае мой файл /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>/"

Удачи! :)


2

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

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

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

Перезагрузите и перезапустите контейнер Docker:

$ 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

1

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

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

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

service docker.io restart

Или пойти /etc/docker.ioс нано ...


1

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

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

а потом

service docker restart

0

На 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/


0

В моей сети 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"

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



0

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

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

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

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

docker load <archive-name>.tar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.