Docker-Images können nicht hinter einem Proxy heruntergeladen werden

329

Ich habe Docker auf meinem Ubuntu 13.10 (Saucy Salamander) installiert und wenn ich meine Konsole eingebe:

sudo docker pull busybox

Ich erhalte folgende Fehlermeldung:

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

Docker-Version:

$ 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

Ich bin hinter einem Proxyserver ohne Authentifizierung und dies ist meine /etc/apt/apt.confDatei:

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

Was mache ich falsch?

rpayanm
quelle
6
Informationen für Windows-Benutzer und boot2docker finden Sie unter stackoverflow.com/a/29303930/6309
VonC
1
Ein kleines Detail: apt unterstützt überhaupt keine SOCKS-Proxys. Acquire::socks::proxybedeutet, den Proxy für alle URLs festzulegen, die mit einem socksSchema beginnen. Da Sie sources.listkeine socks://URLs haben, wird diese Zeile vollständig ignoriert.
Hans-Christoph Steiner
Was ist mit docker-compose?
Mohammad Masoumi

Antworten:

795

Hier ist ein Link zur offiziellen Docker-Dokumentation für Proxy-HTTP: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Ein kurzer Überblick:

Erstellen Sie zunächst ein System-Dropdown-Verzeichnis für den Docker-Dienst:

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

Erstellen Sie nun eine Datei mit dem Namen /etc/systemd/system/docker.service.d/http-proxy.conf, die die HTTP_PROXYUmgebungsvariable hinzufügt :

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

Wenn Sie interne Docker-Registrierungen haben, die Sie ohne Proxy kontaktieren müssen, können Sie diese über die NO_PROXYUmgebungsvariable angeben :

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

Spüländerungen:

$ sudo systemctl daemon-reload

Stellen Sie sicher, dass die Konfiguration geladen wurde:

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

Starten Sie Docker neu:

$ sudo systemctl restart docker
Alexandre Mélard
quelle
3
Dies funktioniert für Debian Jessie unter Docker 1.6.2. Irgendwie /etc/default/dockerfunktioniert die Bearbeitung nicht. Vielleicht sollte ich entfernen, exportwie für Centos dokumentiert.
Neurit
2
Für ältere SysV bearbeiten Sie / etc / sysconfig / docker wie in docs.oracle.com/cd/E37670_01/E37355/html/… - Oracle Linux 6.7
SidJ
2
NB: Ich ging davon aus, dass 'Daemon-Reload' ausreichen würde, um Änderungen an Docker vorzunehmen, aber tatsächlich sudo systemctl restart dockerist dies unbedingt erforderlich, damit es funktioniert.
Jose Alban
4
Informationen systemctl zu Ubuntu 14.04 finden Sie upstartin der Antwort von @ n3o: Da Ubuntu 14.04 nicht verfügbar ist , werden die Dienste aufgerufen .
Chinmay
4
Jetzt wird "Proxy-Authentifizierung erforderlich" zurückgegeben. Wie konfiguriere ich Benutzername und Passwort?
Pinei
88

Ihre APT-Proxy-Einstellungen beziehen sich nicht auf Docker.

Docker verwendet die Umgebungsvariable HTTP_PROXY, falls vorhanden. Zum Beispiel:

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

Stattdessen schlage ich vor, dass Sie sich Ihre /etc/default/dockerKonfigurationsdatei ansehen : Sie sollten eine Zeile zum Kommentieren (und möglicherweise Anpassen) haben, damit Ihre Proxy-Einstellungen automatisch angewendet werden. Starten Sie dann den Docker-Server neu:

service docker restart
mbarthelemy
quelle
8
In meinem Fall enthielt / etc / default / docker ein Beispiel in Kleinbuchstaben (http_proxy), aber damit die Dinge funktionieren, musste ich dort eine Einstellung in Großbuchstaben (HTTP_PROXY) hinzufügen.
Mekk
Sie sollten HTTP_PROXY nicht für den Docker-Client
festlegen
3
Funktioniert nicht mit Docker 1.9.1, stattdessen sehen Sie diese Antwort unten
Peter Dotchev
1
Dies funktioniert für Ubuntu 14.04, wenn Docker von apt.dockerproject.org installiert wird.
Michael Kopp
1
Dies funktioniert nicht unter Debian 8.8, und Sie müssen http_proxy in /etc/systemd/system/docker.service.d festlegen, wie in der akzeptierten Antwort gezeigt
Roman Mik
60

Unter CentOS befindet sich die Konfigurationsdatei für Docker unter:

/etc/sysconfig/docker

Durch Hinzufügen der folgenden Zeile konnte ich den Docker-Daemon hinter einem Proxyserver zum Laufen bringen:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="http://<proxy_host>:<proxy_port>"
Arun Y.
quelle
7
export HTTP_PROXY = "http: // <Benutzername>: <Kennwort> @ <proxy_host>: <proxy_port>" für diejenigen, die hinter Unternehmens-Proxys stehen
Nicolas Mommaerts
bei mir hat das NUR ohne das geklappt export. Bist du sicher, dass das richtig ist?
Frans
4
Für mich exportfunktioniert nur unter CentOS6 und ohne unter CentOS7
user2363318
1
Auf Centos7 musste ich auch nicht exportieren
Banjocat
2
export HTTP_PROXY=...ist ein Bashismus, für Nicht-Bash-Shells (wie zum Beispiel was / bin / sh sein kann) verwenden Sie zwei Zeilen HTTP_PROXY=...und export HTTP_PROXY das heißt, ich brauchte das exportüberhaupt nicht.
Cameron Kerr
42

Wenn Sie den neuen Docker für Mac (oder Docker für Windows ) verwenden, klicken Sie einfach mit der rechten Maustaste auf das Docker-Taskleistensymbol und wählen Sie Einstellungen (Windows: Einstellungen). Gehen Sie dann zu Erweitert und geben Sie dort unter Proxies Ihre Proxy-Einstellungen an. Klicken Sie auf Übernehmen und neu starten und warten Sie, bis Docker neu gestartet wird.

Pedro Madrid
quelle
Falls jemand wie ich einen lokal gebundenen Proxy (z. B. 127.0.0.1:8787 ) unter macOS verwendet, finden Sie hier die detailliertere Installationsanleitung: Warum ein lokal gebundener Proxy nicht funktioniert
Rockallite
Ich habe meine Proxys über Windows: Einstellungen festgelegt, aber diese Proxys werden nicht an meine Container weitergegeben. Stackoverflow.com/questions/48272933/…
amique
Für mich musste ich nur meinen DNS-Server einbauen und es funktionierte dann. Vielen Dank.
Richin
32

Unter Ubuntu müssen Sie den http_proxy für den Docker-Daemon festlegen, nicht den Client-Prozess. Dies geschieht in /etc/default/docker(siehe hier ).

Gkephorus
quelle
Es heißt, dass ich keine Berechtigung habe, auf Ihre Gruppe zuzugreifen. Im Link.
Azizbro
Ich denke nicht, dass dies für Ubuntu 18.04 und höher funktioniert.
zslim
27

Um Aruns Antwort zu erweitern , musste ich die "Export" -Befehle entfernen, damit dies in CentOS 7 funktioniert. Also bearbeiten

/etc/sysconfig/docker

Und füge hinzu:

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

Starten Sie dann Docker neu:

sudo service docker restart

Die Quelle ist dieser Blog-Beitrag .

zummed
quelle
2
Es ist nur HTTP_PROXY erforderlich (getestet auf Fedora 20).
Sheldonh
Perfekt für Suse 12!
Dean Meehan
14

Warum ein lokal gebundener Proxy nicht funktioniert

Das Problem

Wenn Sie einen lokal gebundenen Proxy ausführen, z. B. abhören 127.0.0.1:8989, funktioniert dieser in Docker für Mac NICHT . Aus der Docker-Dokumentation :

Ich möchte eine Verbindung von einem Container zu einem Dienst auf dem Host herstellen

Der Mac hat eine sich ändernde IP-Adresse (oder keine, wenn Sie keinen Netzwerkzugriff haben). Wir empfehlen derzeit, eine nicht verwendete IP-Adresse an die lo0Benutzeroberfläche des Mac anzuhängen . Beispiel: sudo ifconfig lo0 alias 10.200.10.1/24und stellen Sie sicher, dass Ihr Dienst diese Adresse abhört oder 0.0.0.0(dh nicht 127.0.0.1). Dann können Container eine Verbindung zu dieser Adresse herstellen.

Ähnliches gilt für die Docker-Serverseite. (Um die Server- und Clientseite von Docker zu verstehen, versuchen Sie, sie auszuführen docker version.) Die Serverseite wird auf einer eigenen Virtualisierungsebene ausgeführt localhost. Daher wird keine Verbindung zum Proxyserver auf dem hergestelltlocalhost dem Host-Betriebssystem hergestellt.

Die Lösung

Wenn Sie also einen lokal gebundenen Proxy wie mich verwenden, müssen Sie im Grunde die folgenden Schritte ausführen, damit er mit Docker für Mac funktioniert:

  1. Lassen Sie Ihren Proxyserver abhören 0.0.0.0statt 127.0.0.1. Achtung: Sie benötigen eine ordnungsgemäße Firewall-Konfiguration, um böswilligen Zugriff darauf zu verhindern.

  2. Fügen Sie der lo0Schnittstelle einen Loopback-Alias ​​hinzu , z 10.200.10.1/24.

    sudo ifconfig lo0 alias 10.200.10.1/24
    
  3. Stellen Sie HTTP und / oder HTTPS - Proxy 10.200.10.1:8989von Einstellungen in Docker Traymenü ( unter der Annahme , dass der Proxy - Server auf Port hört 8989).

Testen Sie anschließend die Proxy-Einstellungen, indem Sie einen Befehl in einem neuen Container von einem Image ausführen, das nicht heruntergeladen wurde:

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

Hinweis: Der von festgelegte Loopback-Aliasifconfigbleibt nach einem Neustart nicht erhalten. Es dauerhaft zu machen, ist ein anderes Thema. Bitte überprüfen Sie diesen Blog-Beitrag auf Japanisch (Google Translate kann helfen).

Rockallite
quelle
Vielen Dank dafür. Ich habe im letzten Jahr versucht, eine Lösung zu finden, um SquidMan auf den Mac zu bringen, wenn ich versuche, über den Firmen-Proxy sowohl auf die Arbeit als auch auf das externe Netzwerk zuzugreifen. Ich habe dies durch Verbinden mit launchd erhalten, um es beim Start zu konfigurieren. developer.apple.com/library/content/documentation/MacOSX/…
Proctor
Danke, Mann. Ich habe endlich deinen Beitrag gefunden! Es klappt. Wenn Sie cntlm verwenden, vergessen Sie nicht, die Bindung 0.0.0.0 zu Ihrer Konfiguration hinzuzufügen. zB Listen 0.0.0.0: 8989
Felix
Ich benutze auch cntlm und ändere es in den Gateway-Modus
Lee Gary
10

Dies ist der Fix, der für mich funktioniert hat: Ubuntu, Docker-Version: 1.6.2

Fügen Sie in der Datei /etc/default/dockerdie folgende Zeile hinzu:

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

Starten Sie Docker neu

sudo service docker restart
n3o
quelle
Arbeiten an Docker v1.12.1 unter Ubuntu 14.04 und Mint 17.3
wmarbut
1
Funktioniert für 14.04.4 + Docker Version 17.03.1-ce, Build c6d412e
okwap
8

Um Docker für die Arbeit mit einem Proxy zu konfigurieren, müssen Sie die Umgebungsvariable HTTPS_PROXY / HTTP_PROXY zur Docker-Datei sysconfig ( /etc/sysconfig/docker) hinzufügen .

Abhängig davon, ob Sie init.doder das Servicetool verwenden, müssen Sie die Anweisung "export" hinzufügen (aufgrund von Debian-Fehlerberichtsprotokolle - # 767441. Beispiele in / etc / default / docker sind hinsichtlich der unterstützten Syntax irreführend ):

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

Das Docker-Repository (Docker Hub) unterstützt nur HTTPS. Damit Docker mit SSL-Intercepting-Proxys arbeitet, müssen Sie das Proxy-Stammzertifikat zum Trust Trust des Systems hinzufügen.

Kopieren Sie für CentOS die Datei nach /etc/pki/ca-trust/source/anchors/ den CA Trust Store, aktualisieren Sie ihn und starten Sie den Docker-Dienst neu.

Wenn Ihr Proxy die NTLMv2-Authentifizierung verwendet, müssen Sie Zwischenproxys wie Cntlm verwenden , um die Authentifizierung zu überbrücken. Dieser Blog-Beitrag erklärt es im Detail .

Marcel Friedmann
quelle
5

In der neuen Version von Docker, Docker-Engine , sollten Sie in einer systemd- basierten Distribution die Umgebungsvariablenzeile zu /lib/systemd/system/docker.service hinzufügen , wie von anderen erwähnt:

Environment="HTTP_PROXY=http://hostname_or_ip:port/"
Mehdi Hamidi
quelle
Dies wurde auf RHEL7 benötigt.
Dbalakirev
Fügen
5

Gehen Sie nach der Installation von Docker wie folgt vor:

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

Dann können Sie ziehen oder alles tun:

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)
Marcello de Sales
quelle
3

Da ich noch keinen Kommentar abgeben darf:

Für CentOS 7 musste ich die Umgebungsdatei in "docker.service" wie hier beschrieben aktivieren: Steuern und konfigurieren Sie Docker mit systemd .

Bearbeiten: Ich füge meine Lösung hinzu, wie von Nilesh angegeben. Ich musste "/etc/systemd/system/docker.service" öffnen und innerhalb des Abschnitts hinzufügen

[Bedienung]

EnvironmentFile = - / etc / sysconfig / docker

Erst dann wurde die Datei "etc / sysconfig / docker" auf mein System geladen.

Maximilian Wollnik
quelle
3

Um das Problem mit Curl im Docker-Build zu lösen, habe ich Folgendes in die Docker-Datei eingefügt:

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

Beachten Sie, dass die ENV-Anweisung VOR der RUN-Anweisung lautet.

Und damit der Docker-Daemon auf das Internet zugreifen kann (ich verwende Kitematic mit boot2docker), habe ich Folgendes hinzugefügt /var/lib/boot2docker/profile:

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

Dann habe ich Docker mit neu gestartet sudo /etc/init.d/docker restart.

Bruno Negrão Zica
quelle
3

Wenn Sie einen socks5-Proxy verwenden, ist hier mein Test mit Docker 17.03.1-ce mit der Einstellung "all_proxy", und es hat funktioniert:

# 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
btpka3
quelle
3

Die Komplettlösung für Windows zum Konfigurieren der Proxy-Einstellungen.

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

Sie können es direkt konfigurieren, indem Sie mit der rechten Maustaste auf Einstellungen im Docker-Symbol und dann auf Proxies klicken.

Dort können Sie die Proxy-Adresse, den Port, den Benutzernamen und das Passwort konfigurieren.

In diesem Format:

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

Beispiel:

"geronimous:[email protected]:8080"

Nichts weiter als das.

user2280949
quelle
2

Das einfache Festlegen von Proxy-Umgebungsvariablen hat mir in Version 1.0.1 nicht geholfen ... Ich musste die /etc/default/docker.ioDatei mit dem richtigen Wert für die Variable "http_proxy" aktualisieren.

Richil
quelle
2

Wenn Sie sich in Ubuntu befinden, führen Sie diese Befehle aus, um Ihren Proxy hinzuzufügen.

sudo nano /etc/default/docker

Und kommentieren Sie die angegebenen Zeilen aus

#export http_proxy = http://username:[email protected]:8050

Und ersetzen Sie es durch Ihren entsprechenden Proxyserver und Benutzernamen.

Starten Sie Docker anschließend neu mit:

service docker restart

Jetzt können Sie Docker-Befehle hinter dem Proxy ausführen:

docker search ubuntu
Gary Mendonca
quelle
2

Möglicherweise müssen Sie Kleinbuchstabenvariablen einrichten. In meinem Fall sieht meine Datei /etc/systemd/system/docker.service.d/http-proxy.conf folgendermaßen aus:

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

Viel Glück! :) :)

Lawrence Ferreira
quelle
2

Ich hatte auch das gleiche Problem hinter einer Firewall. Befolgen Sie die folgenden Schritte:

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

Verwenden oder entfernen Sie die Datei https_prxoy.conf nicht.

Laden Sie Ihren Docker-Container neu und starten Sie ihn neu:

$ 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
Abhishek Hose
quelle
1

Wenn Sie unter Ubuntu arbeiten, sollten Sie diesen Befehl ausführen:

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

Und laden Sie Docker neu mit:

service docker.io restart

Oder geh /etc/docker.iomit Nano ...

koff75
quelle
1

Unter Ubuntu 14.04 (Trusty Tahr) mit Docker 1.9.1 habe ich die http_proxyZeile einfach auskommentiert, den Wert aktualisiert und dann den Docker-Dienst neu gestartet.

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

und dann

service docker restart
Neo
quelle
0

Unter RHEL6.6 funktioniert nur dies (beachten Sie die Verwendung von export):

/ etc / sysconfig / docker

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

HINWEIS: Beide können die verwenden http Protokoll verwenden.)

Vielen Dank an https://crondev.com/running-docker-behind-proxy/

Vaughan
quelle
0

In meinem Netzwerk arbeitet Ubuntu hinter einem ISA-Proxyserver eines Unternehmens. Und es erfordert eine Authentifizierung. Ich habe alle oben genannten Lösungen ausprobiert und nichts hat geholfen. Was wirklich geholfen hat, war das Schreiben einer Proxy-Zeile in eine Datei/etc/systemd/system/docker.service.d/https-proxy.conf ohne Domain-Namen .

Anstatt

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

oder

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

und ein anderer Ersatz wie @ -> %40oder \ -> \\ich versuchte zu verwenden

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

Und es funktioniert jetzt.

Dmitry Polyakov
quelle
0

Versuche dies:

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

Dies beantwortet die Frage nicht genau, kann aber hilfreich sein, insbesondere wenn Sie sich nicht mit Servicedateien befassen möchten.

Wenn Sie derjenige sind, der das Image hostet, besteht eine Möglichkeit darin, das Image stattdessen als Teerarchiv zu konvertieren, indem Sie auf dem Server Folgendes verwenden .

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

Laden Sie einfach das Archiv herunter und verwandeln Sie es wieder in ein Bild.

docker load <archive-name>.tar
Scherben
quelle