Impossible de télécharger des images Docker derrière un proxy

330

J'ai installé Docker sur mon Ubuntu 13.10 (Saucy Salamander) et quand je tape dans ma console:

sudo docker pull busybox

J'obtiens l'erreur suivante:

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

Version 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

Je suis derrière un serveur proxy sans authentification, et voici mon /etc/apt/apt.conffichier:

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

Qu'est-ce que je fais mal?

rpayanm
la source
6
Pour les utilisateurs Windows et boot2docker, voir stackoverflow.com/a/29303930/6309
VonC
1
Un détail mineur: apt ne prend pas du tout en charge les proxys SOCKS. Acquire::socks::proxysignifie définir le proxy pour toutes les URL commençant par un socksschéma. Étant donné que votre sources.listn'a pas d' socks://URL, cette ligne est entièrement ignorée.
Hans-Christoph Steiner
Et alors docker-compose?
Mohammad Masoumi

Réponses:

797

Voici un lien vers la documentation Docker officielle pour le proxy HTTP: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Un bref aperçu:

Créez d'abord un répertoire de dépôt systemd pour le service Docker:

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

Créez maintenant un fichier appelé /etc/systemd/system/docker.service.d/http-proxy.confqui ajoute la HTTP_PROXYvariable d'environnement:

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

Si vous avez des registres Docker internes que vous devez contacter sans proxy, vous pouvez les spécifier via la NO_PROXYvariable d'environnement:

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

Changements de vidage:

$ sudo systemctl daemon-reload

Vérifiez que la configuration a été chargée:

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

Redémarrez Docker:

$ sudo systemctl restart docker
Alexandre Mélard
la source
3
Cela fonctionne pour Debian Jessie exécutant Docker 1.6.2. D'une manière ou d'une autre, l'édition /etc/default/dockerne fonctionne pas. Peut-être que je devrais supprimer exportcomme celui documenté pour Centos.
neurite
2
Pour les anciens SysV, modifiez / etc / sysconfig / docker comme dans docs.oracle.com/cd/E37670_01/E37355/html/… - Oracle Linux 6.7
SidJ
2
NB: J'ai supposé que 'daemon-reload' suffirait pour appliquer les changements à docker, mais sudo systemctl restart dockerest en fait strictement requis pour qu'il fonctionne.
Jose Alban
4
Pour ubuntu 14.04, reportez-vous à la réponse de @ n3o, Étant donné qu'il systemctl n'est pas disponible pour ubuntu 14.04, il utilise upstartpour afficher les services.
chinmay
4
Maintenant, il renvoie "Authentification proxy requise" ... comment configurer le nom d'utilisateur et le mot de passe?
pinei
88

Vos paramètres de proxy APT ne sont pas liés à Docker.

Docker utilise la variable d'environnement HTTP_PROXY, si elle est présente. Par exemple:

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

Mais à la place, je vous suggère de jeter un œil à votre /etc/default/dockerfichier de configuration: vous devriez avoir une ligne pour décommenter (et peut-être ajuster) pour que vos paramètres de proxy soient appliqués automatiquement. Redémarrez ensuite le serveur Docker:

service docker restart
mbarthelemy
la source
8
Dans mon cas, / etc / default / docker contenait un exemple en minuscule (http_proxy), mais pour que les choses fonctionnent, j'ai dû y ajouter un paramètre en majuscule (HTTP_PROXY).
Mekk
vous ne devez pas définir le HTTP_PROXY pour le client docker
thomas.han
3
Ne fonctionne pas avec docker 1.9.1, voir plutôt cette réponse ci
Peter Dotchev
1
Cela fonctionne pour Ubuntu 14.04 lors de l'installation de docker depuis apt.dockerproject.org.
Michael Kopp
1
Cela ne fonctionne pas sur Debian 8.8, et vous devez définir http_proxy dans /etc/systemd/system/docker.service.d comme indiqué dans la réponse acceptée
Roman Mik
60

Sur CentOS, le fichier de configuration de Docker se trouve à:

/etc/sysconfig/docker

L'ajout de la ligne ci-dessous m'a aidé à faire fonctionner le démon Docker derrière un serveur proxy:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="http://<proxy_host>:<proxy_port>"
Arun Y
la source
7
export HTTP_PROXY = "http: // <username>: <password> @ <proxy_host>: <proxy_port>" pour ceux derrière les mandataires d'entreprise
Nicolas Mommaerts
pour moi, cela a fonctionné UNIQUEMENT sans export. Êtes-vous sûr que c'est correct?
2015 à 7h28
4
Pour moi exportne fonctionne que sur CentOS6 et sans CentOS7
user2363318
1
Sur Centos7, je devais également ne pas utiliser l'exportation
Banjocat
2
export HTTP_PROXY=...est un bashisme, pour les shells non-bash (comme ce que / bin / sh peut être), utilisez deux lignes HTTP_PROXY=..., puis export HTTP_PROXY cela dit, je n'en avais pas du tout besoin export.
Cameron Kerr
42

Si vous utilisez le nouveau Docker pour Mac (ou Docker pour Windows ), cliquez simplement avec le bouton droit sur l'icône de la barre d'état Docker et sélectionnez Préférences (Windows: Paramètres), puis accédez à Avancé, et sous Proxy, spécifiez vos paramètres de proxy à cet endroit. Cliquez sur Appliquer et redémarrer et attendez que Docker redémarre.

Pedro Madrid
la source
Dans le cas où quelqu'un utilise un proxy lié localement (par exemple 127.0.0.1:8787 ) sur macOS comme moi, voici le guide de configuration plus détaillé: Pourquoi un proxy lié localement ne fonctionne pas
Rockallite
J'ai défini mes proxys via Windows: paramètres mais ces proxies ne se propagent pas à mes conteneurs stackoverflow.com/questions/48272933/…
amique
Pour moi, je n'avais besoin que de mettre mon serveur DNS et cela a fonctionné ensuite. Merci.
richin
32

Sur Ubuntu, vous devez définir le http_proxy pour le démon Docker, pas le processus client. Cela se fait en /etc/default/docker(voir ici ).

gkephorus
la source
il indique que je n'ai pas la permission d'accéder à votre groupe. Dans le lien.
Azizbro
Je ne pense pas que cela fonctionne pour Ubuntu 18.04 et supérieur.
zslim
27

Pour étendre la réponse d'Arun , pour que cela fonctionne dans CentOS 7, j'ai dû supprimer les commandes "d'exportation". Alors éditez

/etc/sysconfig/docker

Et ajouter:

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

Redémarrez ensuite Docker:

sudo service docker restart

La source est ce billet de blog .

zummed
la source
2
Seul HTTP_PROXY est requis (testé sur Fedora 20).
sheldonh
Parfait pour Suse 12!
Dean Meehan
14

Pourquoi un proxy lié localement ne fonctionne pas

Le problème

Si vous exécutez un proxy lié localement , par exemple en écoutant 127.0.0.1:8989, il NE FONCTIONNERA PAS dans Docker pour Mac . Dans la documentation Docker :

Je veux me connecter d'un conteneur à un service sur l'hôte

Le Mac a une adresse IP changeante (ou aucune si vous n'avez pas d'accès au réseau). Notre recommandation actuelle consiste à attacher une adresse IP inutilisée à l' lo0interface sur le Mac; par exemple:sudo ifconfig lo0 alias 10.200.10.1/24 et assurez-vous que votre service écoute sur cette adresse ou 0.0.0.0(c'est-à-dire pas 127.0.0.1). Les conteneurs peuvent alors se connecter à cette adresse.

Il en va de même pour le serveur Docker. (Pour comprendre le côté serveur et le côté client de Docker, essayez d'exécuterdocker version .) Et le côté serveur s'exécute sur une couche de virtualisation qui possède la sienne localhost. Par conséquent, il ne se connectera pas au serveur proxy sur lelocalhost le système d'exploitation hôte.

La solution

Donc, si vous utilisez un proxy lié localement comme moi, vous devez essentiellement faire les choses suivantes pour le faire fonctionner avec Docker pour Mac:

  1. Faites écouter votre serveur proxy au 0.0.0.0lieu de 127.0.0.1. Attention: vous aurez besoin d'une configuration de pare-feu appropriée pour empêcher tout accès malveillant.

  2. Ajoutez un alias de bouclage à l' lo0interface, par exemple 10.200.10.1/24:

     sudo ifconfig lo0 alias 10.200.10.1/24
    
  3. Définissez le proxy HTTP et / ou HTTPS à 10.200.10.1:8989partir de Préférences dans le menu du plateau Docker (supposons que le serveur proxy écoute sur le port 8989).

Après cela, testez les paramètres du proxy en exécutant une commande dans un nouveau conteneur à partir d'une image qui n'est pas téléchargée:

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

Remarque: l'alias de bouclage défini parifconfigne se conserve pas après un redémarrage. La rendre persistante est un autre sujet. Veuillez consulter cet article de blog en japonais (Google Translate peut vous aider).

Rockallite
la source
Merci pour cela, j'ai essayé de trouver une solution au cours de la dernière année pour obtenir SquidMan sur Mac lorsque vous essayez d'accéder à la fois au travail et au réseau extérieur via le proxy de la société. J'ai obtenu cela pour rester en le branchant dans launchd pour être configuré au démarrage. developer.apple.com/library/content/documentation/MacOSX/…
Proctor
Merci mec. J'ai enfin trouvé votre message! Ça marche. Si vous utilisez cntlm, n'oubliez pas d'ajouter la liaison 0.0.0.0 à votre configuration. Par exemple Listen 0.0.0.0: 8989
Felix
j'utilise aussi cntlm, et le change en mode passerelle
Lee Gary
10

C'est le correctif qui a fonctionné pour moi: Ubuntu, version Docker: 1.6.2

Dans le fichier /etc/default/docker, ajoutez la ligne:

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

Redémarrez Docker

sudo service docker restart
n3o
la source
Travailler sur Docker v1.12.1 sur Ubuntu 14.04 et Mint 17.3
wmarbut
1
Fonctionne pour 14.04.4 + Docker version 17.03.1-ce, build c6d412e
okwap
8

Pour configurer Docker pour fonctionner avec un proxy, vous devez ajouter la variable d'environnement HTTPS_PROXY / HTTP_PROXY au fichier sysconfig Docker ( /etc/sysconfig/docker).

Selon si vous utilisez init.dou l'outil de services, vous devez ajouter l'instruction "export" (en raison des journaux de rapport de bogue Debian - # 767441. Les exemples dans / etc / default / docker sont trompeurs concernant la syntaxe prise en charge ):

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

Le référentiel Docker (Docker Hub) prend uniquement en charge HTTPS. Pour que Docker fonctionne avec des proxy d'interception SSL, vous devez ajouter le certificat racine proxy au magasin de clés de confiance des systèmes.

Pour CentOS, copiez le fichier /etc/pki/ca-trust/source/anchors/et mettez à jour le magasin de clés de confiance CA et redémarrez le service Docker.

Si votre proxy utilise l'authentification NTLMv2 - vous devez utiliser des proxy intermédiaires comme Cntlm pour relier l'authentification. Ce billet de blog l'explique en détail .

Marcel Friedmann
la source
5

Dans la nouvelle version de Docker, docker-engine , dans une distribution basée sur systemd , vous devez ajouter la ligne de variable d'environnement à /lib/systemd/system/docker.service , comme cela est mentionné par d'autres:

Environment="HTTP_PROXY=http://hostname_or_ip:port/"
Mehdi Hamidi
la source
Cela était nécessaire sur RHEL7.
dbalakirev
ajouter la ligne à la section [Service]
volkit
5

Après avoir installé Docker, procédez comme suit:

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

Ensuite, vous pouvez tirer ou faire n'importe quoi:

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
la source
3

Comme je ne suis pas encore autorisé à commenter:

Pour CentOS 7, j'avais besoin d'activer le EnvironmentFile dans "docker.service" comme il est décrit ici: Contrôlez et configurez Docker avec systemd .

Edit: J'ajoute ma solution comme indiqué par Nilesh. Je devais ouvrir "/etc/systemd/system/docker.service" et j'ai dû ajouter dans la section

[Un service]

EnvironmentFile = - / etc / sysconfig / docker

Ce n'est qu'à ce moment que le fichier "etc / sysconfig / docker" a été chargé sur mon système.

Maximilian Wollnik
la source
3

Pour résoudre le problème avec curl dans la construction Docker, j'ai ajouté ce qui suit dans le Dockerfile:

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

Notez que l'instruction ENV est AVANT l'instruction RUN.

Et afin de permettre au démon Docker d'accéder à Internet (j'utilise Kitematic avec boot2docker), j'ai ajouté ce qui suit dans /var/lib/boot2docker/profile:

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

J'ai ensuite redémarré Docker avec sudo /etc/init.d/docker restart.

Bruno Negrão Zica
la source
3

Si vous utilisez le proxy socks5, voici mon test avec Docker 17.03.1-ce avec le paramètre "all_proxy", et cela a fonctionné:

# 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
la source
3

La solution complète pour Windows, pour configurer les paramètres du proxy.

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

Vous pouvez le configurer directement en cliquant avec le bouton droit sur les paramètres, dans l'icône Docker, puis sur Proxies.

Vous pouvez y configurer l'adresse proxy, le port, le nom d'utilisateur et le mot de passe.

Dans ce format:

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

Exemple:

"geronimous:[email protected]:8080"

Rien de plus que ça.

user2280949
la source
2

La simple définition de variables d'environnement proxy ne m'a pas aidé dans la version 1.0.1 ... J'ai dû mettre à jour le /etc/default/docker.iofichier avec la valeur correcte pour la variable "http_proxy".

Richil
la source
2

Si vous êtes dans Ubuntu, exécutez ces commandes pour ajouter votre proxy.

sudo nano /etc/default/docker

Et décommentez les lignes qui spécifient

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

Et remplacez-le par votre serveur proxy et votre nom d'utilisateur appropriés.

Redémarrez ensuite Docker en utilisant:

service docker restart

Vous pouvez maintenant exécuter les commandes Docker derrière le proxy:

docker search ubuntu
Gary Mendonca
la source
2

Vous devrez peut-être configurer des variables en minuscules. Dans mon cas, mon fichier /etc/systemd/system/docker.service.d/http-proxy.conf ressemble à ceci:

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

Bonne chance! :)

Lawrence Ferreira
la source
2

J'étais également confronté au même problème derrière un pare-feu. Suivez les étapes ci-dessous:

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

N'utilisez pas et ne supprimez pas le fichier https_prxoy.conf.

Rechargez et redémarrez votre conteneur 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
pantalon abhishek
la source
1

Si vous êtes sur Ubuntu, vous devez exécuter cette commande:

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

Et rechargez Docker avec:

service docker.io restart

Ou allez /etc/docker.ioavec nano ...

koff75
la source
1

Sur Ubuntu 14.04 (Trusty Tahr) avec Docker 1.9.1, je viens de décommenter la http_proxyligne, de mettre à jour la valeur puis de redémarrer le service Docker.

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

puis

service docker restart
Néo
la source
0

Sur RHEL6.6 uniquement, cela fonctionne (notez l'utilisation de export):

/ etc / sysconfig / docker

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

REMARQUE: les deux peuvent utiliser le httpprotocole.)

Merci à https://crondev.com/running-docker-behind-proxy/

Vaughan
la source
0

Dans mon réseau, Ubuntu fonctionne derrière un serveur proxy ISA d'entreprise. Et cela nécessite une authentification. J'ai essayé toutes les solutions mentionnées ci-dessus et rien n'a aidé. Ce qui a vraiment aidé, c'était d'écrire une ligne proxy dans un fichier/etc/systemd/system/docker.service.d/https-proxy.conf sans nom de domaine.

Au lieu de

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

ou

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

et un autre remplacement tel que @ -> %40ou \ -> \\j'ai essayé d'utiliser

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

Et ça marche maintenant.

Dmitry Polyakov
la source
0

Essaye ça:

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

Cela ne répond pas exactement à la question, mais pourrait aider, surtout si vous ne souhaitez pas traiter les fichiers de service.

Dans le cas où vous êtes celui qui héberge l'image, une façon consiste à convertir l'image en tant qu'archive tar à la place, en utilisant quelque chose comme ce qui suit sur le serveur .

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

Téléchargez simplement l'archive et reconvertissez-la en image.

docker load <archive-name>.tar
fragments
la source