Impossible de télécharger des images Docker derrière un proxy
j'ai installé Docker sur mon Ubuntu 13.10 (Salamandre Sauteuse) 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 c'est mon fichier /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/";
Qu'est-ce que je fais de mal?
22 réponses
voici un lien vers la documentation officielle de Docker pour proxy HTTP: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
Un rapide aperçu:
tout d'abord, créez un répertoire d'accueil systemd pour le service Docker:
mkdir /etc/systemd/system/docker.service.d
maintenant créer un fichier appelé /etc/systemd/system/docker.service.d/http-proxy.conf
qui ajoute la HTTP_PROXY
variable d'environnement:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
si vous avez registres Dockers internes que vous devez contacter sans mandataire, vous pouvez les spécifier via la variable d'environnement NO_PROXY
:
Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"
vider les changements:
$ sudo systemctl daemon-reload
vérifier que la configuration a été chargée:
$ sudo systemctl show --property Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/
Redémarrer Docker:
$ sudo systemctl restart docker
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 regarder votre fichier de configuration /etc/default/docker
: vous devriez avoir une ligne à décommenter (et peut-être ajuster) pour obtenir vos paramètres de proxy appliqués automatiquement. Puis redémarrez le serveur Docker:
service docker restart
sur CentOS le fichier de configuration pour Docker est à:
/etc/sysconfig/docker
ajouter 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>"
si vous utilisez le nouveau Docker pour Mac (ou Docker pour Windows ), cliquez avec le bouton droit de la souris sur l'icône Docker tray et sélectionnez Preferences (Windows: Settings), puis allez à avancé, et sous Proxies spécifiez vos paramètres de proxy. Cliquez sur , appliquez et redémarrez et attendez que Docker redémarre.
pour étendre la réponse D'Arun ci-dessus, pour que cela fonctionne dans CentOS 7, j'ai dû supprimer les commandes" exporter". Modifier
/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}"
puis redémarrez Docker:
sudo service docker restart
Pourquoi localement lié proxy ne fonctionne pas
Le Problème
si vous utilisez un Local-bound proxy, p.ex. écoute sur 127.0.0.1:8989
, ça ne marchera pas dans Docker pour Mac . De 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 accès au réseau). Notre recommandation actuelle est de joindre une adresse IP non utilisée à l'interface
lo0
sur le Mac; par exemple:sudo ifconfig lo0 alias 10.200.10.1/24
, et de s'assurer que votre service est à l'écoute sur cette adresse ou0.0.0.0
(c'est-à-dire pas127.0.0.1
). Les conteneurs peuvent alors se connecter à cette adresse.
Le similaire est pour Côté Serveur Docker. (Pour comprendre le côté serveur et côté client de Docker, essayez de lancer docker version
.) Et le côté serveur tourne sur une couche de virtualisation qui a sa propre localhost
. Par conséquent, il ne se connectera pas au serveur proxy sur le localhost
de l'OS hôte.
la solution
donc, si vous utilisez un proxy local comme moi, vous devez faire les choses suivantes pour que ça fonctionne avec Docker pour Mac:
-
Faites votre serveur mandataire écoutez
0.0.0.0
au lieu de127.0.0.1
. attention: vous aurez besoin d'une configuration appropriée du pare-feu pour empêcher tout accès malveillant. -
Ajouter un alias loopback à l'interface
lo0
, p.ex.10.200.10.1/24
:sudo ifconfig lo0 alias 10.200.10.1/24
-
définir le proxy HTTP et/ou HTTPS à
10.200.10.1:8989
de Preferences dans le menu Docker tray (supposons que le serveur proxy écoute sur le port8989
).
après cela, testez les paramètres du proxy en lançant 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
...
avis: le nom d'emprunt défini par ifconfig
ne préserve pas après un redémarrage. Pour le rendre persistant est un autre sujet. Veuillez cocher ce blog en Japonais (Google Translate peut aider).
C'est la solution qui a fonctionné pour moi: Ubuntu, Docker version: 1.6.2
dans le fichier /etc/default/docker
, ajouter la ligne:
export http_proxy='http://<host>:<port>'
Redémarrer Docker
sudo service docker restart
pour configurer Docker pour qu'il fonctionne avec un proxy, vous devez ajouter la variable D'environnement HTTPS_PROXY / HTTP_PROXY au fichier sysconfig de Docker ( /etc/sysconfig/docker
).
selon que vous utilisez init.d
ou l'outil services, vous devez ajouter la déclaration" export "(due à ). Les exemples dans /etc/default/docker sont trompeurs en ce qui concerne la syntaxe supportée ):
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 dépôt Docker (Docker Hub) ne prend en charge que les HTTPS. Pour obtenir Docker travaillant avec des proxies d'interception SSL, vous devez ajouter le certificat racine de proxy à la librairie system trust.
pour CentOS, Copiez le fichier à /etc/pki/ca-trust/source/anchors/
et mettez à jour le magasin en fiducie de L'AC et redémarrez le service Docker.
si votre mandataire utilise l'authentification NTLMv2 - vous devez utiliser des mandataires intermédiaires comme Cntlm pour combler l'authentification. ce billet de blog l'explique en détail .
après avoir installé Docker, faites ce qui suit:
[mdesales@pppdc9prd1vq ~]$ sudo HTTP_PROXY=http://proxy02.ie.xyz.net:80 ./docker -d &
[2] 20880
alors, 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)
dans la nouvelle version de Docker, docker-engine , dans un systemd distribution basée, vous devez ajouter la ligne de variable d'environnement à /lib/systemd/system/docker.service , comme il est mentionné par d'autres:
Environment="HTTP_PROXY=http://hostname_or_ip:port/"
pour résoudre le problème avec curl in docker build, j'ai ajouté ce qui suit à L'intérieur du fichier 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 pour 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
puis j'ai redémarré Docker avec sudo /etc/init.d/docker restart
.
peut-être que vous avez besoin de configurer des variables en minuscules. Dans mon cas, mon /etc/systemd/system/docker.service.d / http-proxy.conf le fichier 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! :)
le simple fait de définir des variables d'environnement par procuration ne m'a pas aidé dans la version 1.0.1... J'ai dû mettre à jour le fichier /etc/default/docker.io
avec la valeur correcte pour la variable "http_proxy".
si vous utilisez SOCKS5 proxy, voici mon test avec le Docker 17.03.1-ce avec le paramètre "all_proxy", et il 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
si vous êtes dans Ubuntu, exécutez ces commandes pour ajouter votre proxy.
sudo nano /etc/default/docker
et désactiver les lignes qui spécifient
#export http_proxy = http://username:password@10.0.1.150:8050
et le remplacer par votre serveur mandataire approprié et votre nom d'utilisateur.
puis redémarrez Docker en utilisant:
service docker restart
Maintenant vous pouvez exécuter des commandes Docker derrière proxy:
docker search ubuntu
si vous êtes sur Ubuntu, vous devez exécuter cette commande:
export https_proxy=http://your_name:password@ip_proxy:port docker
et recharger Docker avec:
service docker.io restart
ou /etc/docker.io
avec nano...
car je n'ai pas encore le droit de commenter:
pour CentOS 7 j'avais besoin d'activer L'Environnementfile dans "docker.service "comme il est décrit ici: contrôler et configurer Docker avec systemd .
Edit: j'ajoute ma solution comme indiqué par Nilesh. J'avais besoin d'ouvrir "/etc/systemd/system/docker.service" et j'ai dû ajouter dans la section
[Service]
EnvironmentFile= - / etc/sysconfig/docker
était alors seulement le fichier" etc/sysconfig/docker " chargé sur mon système.
sur Ubuntu 14.04 (Trusty Tahr) avec Docker 1.9.1, je viens de décommenter la ligne http_proxy
, mis à jour la valeur et puis redémarré le service Docker.
export http_proxy="http://proxy.server.com:80"
et puis
service docker restart
sur RHEL6.6 seulement 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"
NOTE: les deux peuvent utiliser le protocole http
.)
sur mon réseau, Ubuntu travaille 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'est d'écrire une ligne de proxy dans le 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 @ -> %40
ou \ -> \
j'ai essayé d'utiliser
Environment="HTTP_PROXY=http://user:password@proxy:8080"
et ça marche maintenant.
essayez ceci:
sudo HTTP_PROXY=http://<IP address of proxy server:port> docker -d &