No se pueden descargar imágenes de Docker detrás de un proxy

330

Instalé Docker en mi Ubuntu 13.10 (Saucy Salamander) y cuando escribo en mi consola:

sudo docker pull busybox

Obtuve el siguiente error:

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

Versión de 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

Estoy detrás de un servidor proxy sin autenticación, y este es mi /etc/apt/apt.confarchivo:

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é estoy haciendo mal?

rpayanm
fuente
66
Para los usuarios de Windows y boot2docker, consulte stackoverflow.com/a/29303930/6309
VonC
1
Un detalle menor: apt no es compatible con servidores proxy SOCKS en absoluto. Acquire::socks::proxysignifica establecer el proxy para todas las URL que comienzan con un socksesquema. Como su sources.listno tiene ninguna socks://URL, esa línea se ignora por completo.
Hans-Christoph Steiner
¿Qué hay de docker-compose?
Mohammad Masoumi

Respuestas:

797

Aquí hay un enlace a la documentación oficial de Docker para el proxy HTTP: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Un resumen rápido:

Primero, cree un directorio desplegable systemd para el servicio Docker:

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

Ahora cree un archivo llamado /etc/systemd/system/docker.service.d/http-proxy.confque agregue la HTTP_PROXYvariable de entorno:

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

Si tiene registros internos de Docker con los que necesita ponerse en contacto sin proxy, puede especificarlos a través de la NO_PROXYvariable de entorno:

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

Cambios de color:

$ sudo systemctl daemon-reload

Verifique que la configuración se haya cargado:

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

Reiniciar Docker:

$ sudo systemctl restart docker
Alexandre Mélard
fuente
3
Esto funciona para Debian Jessie con Docker 1.6.2. De alguna manera, la edición /etc/default/dockerno funciona. Tal vez debería eliminar exportcomo el documentado para Centos.
neurita
2
Para SysV anteriores, edite / etc / sysconfig / docker como en docs.oracle.com/cd/E37670_01/E37355/html/… - Oracle Linux 6.7
SidJ
2
NB: asumí que 'daemon-reload' sería suficiente para aplicar cambios a la ventana acoplable, pero en realidad sudo systemctl restart dockeres estrictamente necesario para que funcione.
Jose Alban
44
Para ubuntu 14.04, consulte la respuesta de @ n3o, ya systemctl que no está disponible para ubuntu 14.04, se utiliza upstartpara mostrar los servicios.
chinmay
44
Ahora está devolviendo "Se requiere autenticación de proxy" ... ¿cómo configurar el nombre de usuario y contraseña?
pinei
88

Su configuración de proxy APT no está relacionada con Docker.

Docker usa la variable de entorno HTTP_PROXY, si está presente. Por ejemplo:

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

Pero en cambio, le sugiero que eche un vistazo a su /etc/default/dockerarchivo de configuración: debe tener una línea para descomentar (y tal vez ajustar) para que la configuración de su proxy se aplique automáticamente. Luego reinicie el servidor Docker:

service docker restart
mbarthelemy
fuente
8
En mi caso, / etc / default / docker contenía un ejemplo en minúsculas (http_proxy), pero para que todo funcionara tuve que agregar la configuración en mayúsculas (HTTP_PROXY) allí.
Mekk
no debe configurar HTTP_PROXY para el cliente de
Docker
3
No funciona con Docker 1.9.1, en cambio, vea esta respuesta a continuación
Peter Dotchev,
1
Esto funciona para Ubuntu 14.04 cuando se instala docker desde apt.dockerproject.org.
Michael Kopp
1
Esto no funciona en Debian 8.8, y necesita configurar http_proxy en /etc/systemd/system/docker.service.d como se muestra en la respuesta aceptada
Roman Mik
60

En CentOS, el archivo de configuración para Docker está en:

/etc/sysconfig/docker

Agregar la siguiente línea me ayudó a hacer que el demonio Docker funcionara detrás de un servidor proxy:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="http://<proxy_host>:<proxy_port>"
Arun Y
fuente
77
export HTTP_PROXY = "http: // <username>: <password> @ <proxy_host>: <proxy_port>" para quienes están detrás de proxies corporativos
Nicolas Mommaerts
para mí esto funcionó SOLO sin el export. ¿Estas seguro que esto es correcto?
Frans
44
Para mí exportsolo funciona en CentOS6 y sin CentOS7
user2363318
1
En Centos7 tampoco tuve que usar la exportación
Banjocat
2
export HTTP_PROXY=...es un Bashismo, para los shells que no son Bash (como lo que puede ser / bin / sh), use dos líneas HTTP_PROXY=...y luego export HTTP_PROXY Dicho eso, no necesitaba exportnada.
Cameron Kerr
42

Si está utilizando el nuevo Docker para Mac (o Docker para Windows ), simplemente haga clic con el botón derecho en el icono de la bandeja de Docker y seleccione Preferencias (Windows: Configuración), luego vaya a Avanzado y, en Proxies, especifique allí la configuración de su proxy. Haga clic en Aplicar y reiniciar y espere hasta que Docker se reinicie.

Pedro Madrid
fuente
En caso de que alguien use un proxy vinculado localmente (por ejemplo, 127.0.0.1:8787 ) en macOS como yo, aquí está la guía de configuración más detallada: ¿Por qué un proxy vinculado localmente no funciona
Rockallite
He configurado mis servidores proxy a través de Windows: configuración, pero estos
servidores
Para mí solo necesitaba poner mi servidor DNS y funcionó entonces. Gracias.
richin
32

En Ubuntu, debe configurar el http_proxy para el demonio Docker, no el proceso del cliente. Esto se hace en /etc/default/docker(ver aquí ).

gkephorus
fuente
dice que no tengo permiso para acceder a su grupo. En el enlace
Azizbro
No creo que esto funcione para Ubuntu 18.04 y superior.
zslim
27

Para extender la respuesta de Arun , para que esto funcione en CentOS 7, tuve que eliminar los comandos "exportar". Entonces edita

/etc/sysconfig/docker

Y añadir:

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

Luego reinicie Docker:

sudo service docker restart

La fuente es esta publicación de blog .

zummed
fuente
2
Solo se requiere HTTP_PROXY (probado en Fedora 20).
sheldonh
Perfecto para Suse 12!
Dean Meehan
14

¿Por qué un proxy enlazado localmente no funciona?

El problema

Si está ejecutando un proxy enlazado localmente , por ejemplo, escuchando 127.0.0.1:8989, NO FUNCIONARÁ en Docker para Mac . De la documentación de Docker :

Quiero conectarme desde un contenedor a un servicio en el host

La Mac tiene una dirección IP cambiante (o ninguna si no tiene acceso a la red). Nuestra recomendación actual es adjuntar una IP no utilizada a la lo0interfaz en la Mac; por ejemplo: sudo ifconfig lo0 alias 10.200.10.1/24y asegúrese de que su servicio esté escuchando en esta dirección o 0.0.0.0(es decir, no 127.0.0.1). Entonces los contenedores pueden conectarse a esta dirección.

Lo mismo es para el lado del servidor Docker. (Para comprender el lado del servidor y el lado del cliente de Docker, intente ejecutar docker version). Y el lado del servidor se ejecuta en una capa de virtualización que tiene la suya localhost. Por lo tanto, no se conectará al servidor proxy en el localhostsistema operativo host.

La solución

Entonces, si está usando un proxy vinculado localmente como yo, básicamente tendría que hacer lo siguiente para que funcione con Docker para Mac:

  1. Haga que su servidor proxy escuche en 0.0.0.0lugar de 127.0.0.1. Precaución: necesitará una configuración de firewall adecuada para evitar el acceso malicioso.

  2. Agregue un alias de bucle invertido a la lo0interfaz, por ejemplo 10.200.10.1/24:

     sudo ifconfig lo0 alias 10.200.10.1/24
    
  3. Establecer HTTP y / o HTTPS proxy para 10.200.10.1:8989de Preferencias de menú de la bandeja acoplable (Suponga que el servidor proxy está escuchando en el puerto 8989).

Después de eso, pruebe la configuración del proxy ejecutando un comando en un nuevo contenedor desde una imagen que no se descarga:

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

Aviso: el alias de bucle invertido establecido porifconfigno se conserva después de un reinicio. Hacerlo persistente es otro tema. Consulte esta publicación de blog en japonés (el Traductor de Google puede ayudar).

Rockallita
fuente
Gracias por esto, he estado tratando de encontrar una solución durante el último año más o menos para obtener SquidMan en la Mac al intentar acceder a la red tanto laboral como externa a través del proxy de la compañía. Obtuve esto para seguir conectándolo a launchd para configurarlo en el inicio. developer.apple.com/library/content/documentation/MacOSX/…
Proctor
Gracias hombre. ¡Finalmente encontré tu publicación! Funciona. Si está utilizando cntlm, no olvide agregar el enlace 0.0.0.0 a su configuración. Ej. Escuchar 0.0.0.0: 8989
Felix
También estoy usando cntlm y lo cambio al modo de puerta de enlace
Lee Gary
10

Esta es la solución que funcionó para mí: Ubuntu, versión Docker: 1.6.2

En el archivo /etc/default/docker, agregue la línea:

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

Reiniciar Docker

sudo service docker restart
n3o
fuente
Trabajando en Docker v1.12.1 en Ubuntu 14.04 y Mint 17.3
wmarbut
1
Funciona para 14.04.4 + Docker versión 17.03.1-ce, compilación c6d412e
okwap
8

Para configurar Docker para que funcione con un proxy, debe agregar la variable de entorno HTTPS_PROXY / HTTP_PROXY al archivo sysconfig de Docker ( /etc/sysconfig/docker).

Dependiendo de si usa init.do la herramienta de servicios, necesita agregar la declaración "exportar" (debido a los registros de informes de errores de Debian - # 767441. Los ejemplos en / etc / default / docker son engañosos con respecto a la sintaxis compatible ):

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

El repositorio de Docker (Docker Hub) solo es compatible con HTTPS. Para que Docker funcione con proxies de interceptación SSL, debe agregar el certificado raíz del proxy al almacén de confianza del sistema.

Para CentOS, copie el archivo /etc/pki/ca-trust/source/anchors/y actualice el almacén de confianza de CA y reinicie el servicio Docker.

Si su proxy usa la autenticación NTLMv2, debe usar proxies intermedios como Cntlm para cerrar la autenticación. Esta publicación de blog lo explica en detalle .

Marcel Friedmann
fuente
5

En la nueva versión de Docker, docker-engine , en una distribución basada en systemd , debe agregar la línea de variable de entorno a /lib/systemd/system/docker.service , como lo mencionan otros:

Environment="HTTP_PROXY=http://hostname_or_ip:port/"
Mehdi Hamidi
fuente
Esto era necesario en RHEL7.
dbalakirev
agregue la línea a la sección [Servicio]
volkit
5

Después de instalar Docker, haga lo siguiente:

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

Luego, puede tirar o hacer cualquier cosa:

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
fuente
3

Como todavía no puedo comentar:

Para CentOS 7, necesitaba activar el EnvironmentFile dentro de "docker.service" como se describe aquí: controlar y configurar Docker con systemd .

Editar: estoy agregando mi solución como lo indicó Nilesh. Necesitaba abrir "/etc/systemd/system/docker.service" y tuve que agregar dentro de la sección

[Servicio]

EnvironmentFile = - / etc / sysconfig / docker

Solo entonces se cargó el archivo "etc / sysconfig / docker" en mi sistema.

Maximilian Wollnik
fuente
3

Para resolver el problema con curl en Docker build, agregué lo siguiente dentro del Dockerfile:

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

Tenga en cuenta que la declaración ENV es ANTES de la declaración EJECUTAR.

Y para que el demonio Docker pueda acceder a Internet (uso Kitematic con boot2docker), agregué lo siguiente en /var/lib/boot2docker/profile:

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

Luego reinicié Docker con sudo /etc/init.d/docker restart.

Bruno Negrão Zica
fuente
3

Si uso el proxy socks5, aquí está mi prueba con Docker 17.03.1-ce con la configuración "all_proxy", y funcionó:

# 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
fuente
3

La solución completa para Windows, para configurar los ajustes del proxy.

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

Puede configurarlo directamente haciendo clic derecho en la configuración, en el icono de Docker y luego en Proxies.

Allí puede configurar la dirección proxy, el puerto, el nombre de usuario y la contraseña.

En este formato:

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

Ejemplo:

"geronimous:[email protected]:8080"

Nada más que esto.

usuario2280949
fuente
2

Simplemente establecer variables de entorno proxy no me ayudó en la versión 1.0.1 ... Tuve que actualizar el /etc/default/docker.ioarchivo con el valor correcto para la variable "http_proxy".

Richil
fuente
2

Si está en Ubuntu, ejecute estos comandos para agregar su proxy.

sudo nano /etc/default/docker

Y descomentar las líneas que especifica

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

Y reemplácelo con su servidor proxy apropiado y nombre de usuario.

Luego reinicie Docker usando:

service docker restart

Ahora puede ejecutar comandos Docker detrás del proxy:

docker search ubuntu
Gary Mendonca
fuente
2

Tal vez necesite configurar variables en minúsculas. En mi caso, mi archivo /etc/systemd/system/docker.service.d/http-proxy.conf tiene este aspecto:

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

¡Buena suerte! :)

Lawrence Ferreira
fuente
2

También estaba enfrentando el mismo problema detrás de un firewall. Siga los pasos a continuación:

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

No use ni elimine el archivo https_prxoy.conf.

Vuelva a cargar y reinicie su contenedor 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
pantalón abhishek
fuente
1

Si está en Ubuntu, debe ejecutar este comando:

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

Y vuelva a cargar Docker con:

service docker.io restart

O ve /etc/docker.iocon nano ...

koff75
fuente
1

En Ubuntu 14.04 (Trusty Tahr) con Docker 1.9.1, simplemente descomenté la http_proxylínea, actualicé el valor y luego reinicié el servicio Docker.

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

y entonces

service docker restart
Neo
fuente
0

En RHEL6.6 solo esto funciona (tenga en cuenta el uso de export):

/ etc / sysconfig / docker

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

NOTA: Ambos pueden usar el httpprotocolo).

Gracias a https://crondev.com/running-docker-behind-proxy/

vaughan
fuente
0

En mi red, Ubuntu funciona detrás de un servidor proxy ISA corporativo. Y requiere autenticación. Probé todas las soluciones mencionadas anteriormente y nada me ayudó. Lo que realmente ayudó fue escribir una línea proxy en el archivo /etc/systemd/system/docker.service.d/https-proxy.confsin un nombre de dominio.

En vez de

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

o

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

y algún otro reemplazo como @ -> %40o \ -> \\intenté usar

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

Y funciona ahora.

Dmitry Polyakov
fuente
0

Prueba esto:

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

Esto no responde exactamente la pregunta, pero podría ayudar, especialmente si no desea tratar con archivos de servicio.

En caso de que usted sea el que aloja la imagen, una forma es convertir la imagen como un archivo tar en su lugar, usando algo como lo siguiente en el servidor .

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

Simplemente descargue el archivo y vuelva a convertirlo en una imagen.

docker load <archive-name>.tar
fragmentos
fuente