Nie można pobrać obrazów Dockera za proxy


330

Zainstalowałem Docker na moim Ubuntu 13.10 (Saucy Salamander) i kiedy piszę w konsoli:

sudo docker pull busybox

Otrzymuję następujący błąd:

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

Wersja Docker:

$ 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

Jestem za serwerem proxy bez uwierzytelnienia, a to jest mój /etc/apt/apt.confplik:

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/";

Co ja robię źle?


6
Użytkownicy systemu Windows i boot2docker patrz stackoverflow.com/a/29303930/6309
VonC

1
Jeden drobny szczegół: apt w ogóle nie obsługuje proxy SOCKS. Acquire::socks::proxyoznacza ustawienie proxy dla wszystkich adresów URL zaczynających się od socksschematu. Ponieważ twój sources.listnie ma żadnych socks://adresów URL, ten wiersz jest całkowicie ignorowany.
Hans-Christoph Steiner

Co docker-compose?
Mohammad Masoumi

Odpowiedzi:


796

Oto link do oficjalnej dokumentacji Dockera dla proxy HTTP: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Krótki zarys:

Najpierw utwórz systemowy katalog rozwijany dla usługi Docker:

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

Teraz utwórz plik o nazwie, /etc/systemd/system/docker.service.d/http-proxy.confktóry dodaje HTTP_PROXYzmienną środowiskową:

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

Jeśli masz wewnętrzne rejestry Docker, z którymi musisz się skontaktować bez pośrednictwa, możesz je określić za pomocą NO_PROXYzmiennej środowiskowej:

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

Zmiany spłukiwania:

$ sudo systemctl daemon-reload

Sprawdź, czy konfiguracja została załadowana:

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

Uruchom ponownie doker:

$ sudo systemctl restart docker

3
Działa to w przypadku Debian Jessie z systemem Docker 1.6.2. Jakoś edycja /etc/default/dockernie działa. Może powinienem usunąć exportjak ten udokumentowany dla Centos.
neuryt

2
Dla starszych SysV edytuj / etc / sysconfig / docker jak w docs.oracle.com/cd/E37670_01/E37355/html/… - Oracle Linux 6.7
SidJ

2
NB: Zakładałem, że „przeładowanie demona” wystarczyłoby, aby zastosować zmiany w oknie dokowanym, ale tak naprawdę sudo systemctl restart dockerjest to absolutnie wymagane, aby działało.
Jose Alban,

4
W przypadku Ubuntu 14.04 zapoznaj się z odpowiedzią @ n3o, ponieważ systemctl nie jest dostępna dla Ubuntu 14.04, używa upstartdo uruchomienia usług.
chinmay

4
Teraz zwraca „Wymagane uwierzytelnienie serwera proxy” ... jak skonfigurować nazwę użytkownika i hasło?
pinei

88

Twoje ustawienia proxy APT nie są powiązane z Dockerem.

Docker używa zmiennej środowiskowej HTTP_PROXY, jeśli jest dostępna. Na przykład:

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

Zamiast tego sugeruję zajrzeć do /etc/default/dockerpliku konfiguracyjnego: powinieneś mieć linię do odkomentowania (i być może dostosowania), aby ustawienia serwera proxy były stosowane automatycznie. Następnie uruchom ponownie serwer Docker:

service docker restart

8
W moim przypadku / etc / default / docker zawierał małe litery (http_proxy), ale aby wszystko działało, musiałem tam dodać ustawienie wielkich liter (HTTP_PROXY).
Mekk

nie powinieneś ustawiać HTTP_PROXY dla klienta
dokera

3
Nie działa z dokerem 1.9.1, zamiast tego zobacz tę odpowiedź poniżej
Peter Dotchev,

1
Działa to w przypadku Ubuntu 14.04 podczas instalacji dokera z apt.dockerproject.org.
Michael Kopp,

1
To nie działa w Debianie 8.8 i musisz ustawić http_proxy w /etc/systemd/system/docker.service.d, jak pokazano w zaakceptowanej odpowiedzi
Roman Mik

60

W CentOS plik konfiguracyjny Dockera znajduje się w:

/etc/sysconfig/docker

Dodanie poniższej linii pomogło mi uruchomić demona Docker za serwerem proxy:

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

7
eksport HTTP_PROXY = "http: // <nazwa użytkownika>: <hasło> @ <host_proxy>: <port_proxy>" dla osób stojących za korporacyjnymi serwerami proxy
Nicolas Mommaerts

dla mnie działało TYLKO bez export. Czy jesteś pewien, że to prawda?
frans

4
Dla mnie exportdziała tylko na CentOS6 i bez CentOS7
użytkownik2363318

1
Na Centos7 musiałem również nie korzystać z eksportu
Banjocat

2
export HTTP_PROXY=...jest Bashizmem, w przypadku powłok innych niż Bash (takich jak co / bin / sh może być), użyj dwóch linii, HTTP_PROXY=...a następnie export HTTP_PROXY To powiedziawszy, nie potrzebowałem exportwcale.
Cameron Kerr

42

Jeśli używasz nowego Dockera dla komputerów Mac (lub Dockera dla systemu Windows ), kliknij prawym przyciskiem myszy ikonę zasobnika Docker i wybierz Preferencje (Windows: Ustawienia), a następnie przejdź do Zaawansowane, a następnie w obszarze Proxy określ ustawienia proxy. Kliknij Zastosuj i uruchom ponownie i poczekaj, aż Docker uruchomi się ponownie.


W przypadku, gdy ktoś korzysta z lokalnego serwera proxy (np. 127.0.0.1:8787 ) w systemie macOS, takim jak ja, oto bardziej szczegółowy przewodnik konfiguracji: Dlaczego lokalnie związany serwer proxy nie działa
Rockallite


Dla mnie wystarczyło tylko zainstalować mój serwer DNS i wtedy zadziałało. Dzięki.
richin

32

W systemie Ubuntu należy ustawić http_proxy dla demona Docker, a nie procesu klienta. Odbywa się to w /etc/default/docker(patrz tutaj ).


mówi, że nie mam uprawnień dostępu do twojej grupy. W linku
Azizbro

Nie sądzę, że to działa w przypadku Ubuntu 18.04 i nowszych.
zslim

27

Aby rozszerzyć odpowiedź Aruna , aby działało to w CentOS 7, musiałem usunąć polecenia „eksportuj”. Więc edytuj

/etc/sysconfig/docker

I dodaj:

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

Następnie uruchom ponownie Docker:

sudo service docker restart

Źródłem jest tego blogu .


2
Wymagany jest tylko HTTP_PROXY (testowany na Fedorze 20).
sheldonh

Idealny dla Suse 12!
Dean Meehan,

14

Dlaczego lokalnie związany serwer proxy nie działa

Problem

Jeśli używasz lokalnego serwera proxy, np 127.0.0.1:8989. Nasłuchujesz, nie zadziała w Docker na Mac . Z dokumentacji dokera :

Chcę połączyć się z kontenera z usługą na hoście

Komputer Mac ma zmieniający się adres IP (lub żaden, jeśli nie masz dostępu do sieci). Naszym obecnym zaleceniem jest dołączenie nieużywanego adresu IP do lo0interfejsu na komputerze Mac; na przykład: sudo ifconfig lo0 alias 10.200.10.1/24i upewnij się, że twoja usługa nasłuchuje pod tym adresem lub 0.0.0.0(tj. nie 127.0.0.1). Następnie kontenery mogą połączyć się z tym adresem.

Podobnie jest po stronie serwera Docker. (Aby zrozumieć stronę Dockera po stronie serwera i klienta, spróbuj uruchomić docker version.) A strona serwera działa na warstwie wirtualizacji, która ma swoją własną localhost. Dlatego nie będzie łączyć się z serwerem proxy localhostw hoście systemu operacyjnego.

Rozwiązanie

Tak więc, jeśli używasz lokalnego serwera proxy takiego jak ja, w zasadzie musisz wykonać następujące czynności, aby działał on z Docker na Maca:

  1. Niech serwer proxy nasłuchuje 0.0.0.0zamiast 127.0.0.1. Uwaga: będziesz potrzebować odpowiedniej konfiguracji zapory, aby zapobiec złośliwemu dostępowi do niej.

  2. Dodaj do lo0interfejsu alias sprzężenia zwrotnego , np . 10.200.10.1/24:

    sudo ifconfig lo0 alias 10.200.10.1/24
    
  3. Ustaw HTTP i / lub HTTPS proxy, aby 10.200.10.1:8989z preferencji w menu paska Docker (zakładamy, że serwer proxy nasłuchuje na porcie 8989).

Następnie przetestuj ustawienia proxy, uruchamiając polecenie w nowym kontenerze z obrazu, który nie został pobrany:

$ 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
  ...

Uwaga: ustawiony przez nas alias pętli zwrotnejifconfignie zachowuje się po ponownym uruchomieniu. Utrwalenie to inny temat. Sprawdź ten post na blogu w języku japońskim (może pomóc Tłumacz Google).


Dzięki za to, próbowałem znaleźć rozwiązanie przez ostatni rok, aby uzyskać SquidMan na komputerze Mac, gdy próbuję uzyskać dostęp zarówno do sieci roboczej, jak i zewnętrznej za pośrednictwem firmowego serwera proxy. Mam ten problem, podpinając go w celu uruchomienia w celu skonfigurowania podczas uruchamiania. developer.apple.com/library/content/documentation/MacOSX/…
Proctor

Dzięki stary. W końcu znalazłem twój post! To działa. Jeśli używasz cntlm, nie zapomnij dodać powiązania 0.0.0.0 do konfiguracji. np. Listen 0.0.0.0: 8989
Felix

też używam cntlm i zmieniam go na tryb bramy
Lee Gary

10

Oto poprawka, która zadziałała dla mnie: Ubuntu, wersja Docker: 1.6.2

W pliku /etc/default/dockerdodaj wiersz:

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

Uruchom ponownie Docker

sudo service docker restart

Praca nad Docker v1.12.1 na Ubuntu 14.04 i Mint 17.3
wmarbut

1
Działa dla wersji 14.04.4 + Docker 17.03.1-ce, build c6d412e
okwap

8

Aby skonfigurować Docker do pracy z serwerem proxy, musisz dodać zmienną środowiskową HTTPS_PROXY / HTTP_PROXY do pliku sysconfig Dockera ( /etc/sysconfig/docker).

W zależności od tego, czy korzystasz init.dlub narzędzie serwisowe, musisz dodać instrukcję „eksport” (ze względu na dzienniki raportów błędów Debiana - # 767441. Przykłady w / etc / default / docker wprowadzają w błąd co do obsługiwanej składni ):

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>"

Repozytorium Docker (Docker Hub) obsługuje tylko HTTPS. Aby Docker mógł współpracować z serwerami proxy przechwytującymi SSL, musisz dodać certyfikat główny proxy do magazynu zaufanych systemów.

W przypadku systemu CentOS skopiuj plik /etc/pki/ca-trust/source/anchors/i zaktualizuj magazyn zaufania urzędu certyfikacji, a następnie uruchom ponownie usługę Docker.

Jeśli Twój serwer proxy używa uwierzytelniania NTLMv2 - musisz użyć pośrednich serwerów proxy, takich jak Cntlm, do mostkowania uwierzytelnienia. Ten post na blogu szczegółowo to wyjaśnia .


5

W nowej wersji Dockera , mechanizmu dokującego , w dystrybucji opartej na systemie należy dodać wiersz zmiennej środowiskowej do /lib/systemd/system/docker.service , jak wspominają inni:

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

Było to potrzebne na RHEL7.
dbalakirev

dodaj linię do sekcji [Service]
volkit

5

Po zainstalowaniu Dockera wykonaj następujące czynności:

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

Następnie możesz pociągnąć lub zrobić cokolwiek:

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

Ponieważ nie mogę jeszcze komentować:

W przypadku CentOS 7 musiałem aktywować plik EnvironmentFile w „docker.service”, tak jak to opisano tutaj: Kontroluj i konfiguruj Docker za pomocą systemd .

Edycja: Dodam moje rozwiązanie, jak podano przez Nilesha. Musiałem otworzyć „/etc/systemd/system/docker.service” i musiałem dodać w sekcji

[Usługa]

EnvironmentFile = - / etc / sysconfig / docker

Dopiero wtedy plik „etc / sysconfig / docker” został załadowany do mojego systemu.


3

Aby rozwiązać problem z zawijaniem się w kompilacji Dockera, dodałem następujące elementy w pliku Docker:

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

Zauważ, że instrukcja ENV jest PRZED instrukcją RUN.

Aby umożliwić demonowi Dockerowi dostęp do Internetu (korzystam z Kitematic z boot2docker), dodałem /var/lib/boot2docker/profile:

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

Następnie ponownie uruchomiłem Dockera za pomocą sudo /etc/init.d/docker restart.


3

Jeśli używasz proxy socks5, oto mój test z Dockerem 17.03.1-ce z ustawieniem „all_proxy” i zadziałało:

# 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

Kompletne rozwiązanie dla systemu Windows do konfiguracji ustawień proxy.

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

Możesz go skonfigurować bezpośrednio, klikając prawym przyciskiem myszy ustawienia, ikonę Docker, a następnie Serwery proxy.

Tam możesz skonfigurować adres serwera proxy, port, nazwę użytkownika i hasło.

W tym formacie:

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

Przykład:

"geronimous:mypassword@192.168.44.55:8080"

Nic więcej niż to.


2

Proste ustawienie zmiennych środowiskowych proxy nie pomogło mi w wersji 1.0.1 ... Musiałem zaktualizować /etc/default/docker.ioplik o poprawną wartość dla zmiennej „http_proxy”.


2

Jeśli korzystasz z systemu Ubuntu, wykonaj te polecenia, aby dodać serwer proxy.

sudo nano /etc/default/docker

I odkomentuj linie, które określają

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

I zastąp go odpowiednim serwerem proxy i nazwą użytkownika.

Następnie uruchom ponownie Docker, używając:

service docker restart

Teraz możesz uruchamiać polecenia Docker za serwerem proxy:

docker search ubuntu

2

Być może musisz skonfigurować małe litery zmiennych. W moim przypadku mój plik /etc/systemd/system/docker.service.d/http-proxy.conf wygląda następująco:

[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>/"

Powodzenia! :)


2

Miałem również ten sam problem za zaporą ogniową. Wykonaj poniższe kroki:

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

Nie używaj ani nie usuwaj pliku https_prxoy.conf.

Załaduj ponownie i uruchom ponownie kontener 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

Jeśli korzystasz z Ubuntu, powinieneś wykonać następujące polecenie:

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

I ponownie załaduj Docker:

service docker.io restart

Lub przejdź do /etc/docker.ionano ...


1

Na Ubuntu 14.04 (Trusty Tahr) z Dockerem 1.9.1 po prostu odkomentowałem http_proxylinię, zaktualizowałem wartość, a następnie ponownie uruchomiłem usługę Docker.

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

i wtedy

service docker restart


0

W mojej sieci Ubuntu działa za korporacyjnym serwerem proxy ISA. I wymaga uwierzytelnienia. Wypróbowałem wszystkie wyżej wymienione rozwiązania i nic nie pomogło. Naprawdę pomogło mi napisanie linii proxy w pliku /etc/systemd/system/docker.service.d/https-proxy.confbez nazwy domeny.

Zamiast

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

lub

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

i niektóre inne zamienniki, takie jak @ -> %40lub \ -> \\próbowałem użyć

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

I to działa teraz.



0

To nie do końca odpowiada na pytanie, ale może pomóc, zwłaszcza jeśli nie chcesz zajmować się plikami serwisowymi.

W przypadku, gdy to Ty hostujesz obraz, jednym ze sposobów jest konwersja obrazu jako archiwum tar, przy użyciu czegoś takiego jak na serwerze .

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

Wystarczy pobrać archiwum i przekształcić go z powrotem w obraz.

docker load <archive-name>.tar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.