Не удается загрузить изображения 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:
Сделайте так, чтобы ваш прокси-сервер слушал
0.0.0.0
вместо127.0.0.1
, Внимание: вам потребуется правильная настройка брандмауэра, чтобы предотвратить злонамеренный доступ к нему.Добавьте псевдоним петли к
lo0
интерфейс, например10.200.10.1/24
:sudo ifconfig lo0 alias 10.200.10.1/24
Установите 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
Протокол.)