Не удается загрузить изображения 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.