Compartir comentarios
Las respuestas se generan en base a la documentación.

Configuración de proxy para el demonio

Si tu organización utiliza un servidor proxy para conectarse a Internet, es posible que debas configurar el demonio de Docker para que utilice dicho servidor proxy. El demonio utiliza un servidor proxy para acceder a las imágenes almacenadas en Docker Hub y otros registros, y para comunicarse con otros nodos en un Docker Swarm.

Esta página describe cómo configurar un proxy para el demonio de Docker. Para obtener instrucciones sobre cómo configurar los parámetros del proxy para la CLI de Docker, consulta Configurar la CLI de Docker para usar un servidor proxy.

Important

Las configuraciones de proxy especificadas en daemon.json son ignoradas por Docker Desktop. Si utilizas Docker Desktop, puedes configurar los proxies a través de la configuración de Docker Desktop.

Existen dos formas de configurar estos parámetros:

Configurar el demonio directamente tiene prioridad sobre las variables de entorno.

Configuración del demonio

Puedes configurar el comportamiento del proxy para el demonio en el archivo daemon.json, o utilizando las opciones de la CLI --http-proxy o --https-proxy para el comando dockerd. Se recomienda realizar la configuración a través de daemon.json.

{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "http://proxy.example.com:3128",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}

Después de cambiar el archivo de configuración, reinicia el demonio para que la configuración del proxy surta efecto:

$ sudo systemctl restart docker

Variables de entorno

El demonio de Docker comprueba las siguientes variables de entorno en su entorno de inicio para configurar el comportamiento del proxy HTTP o HTTPS:

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • NO_PROXY
  • no_proxy

Archivo de unidad de systemd

Si ejecutas el demonio de Docker como un servicio de systemd, puedes crear un archivo de personalización (drop-in) de systemd que establezca las variables para el servicio docker.

Nota para el modo rootless

La ubicación de los archivos de configuración de systemd es diferente cuando ejecutas Docker en modo rootless. Al ejecutar en modo rootless, Docker se inicia como un servicio de systemd en modo usuario y utiliza los archivos almacenados en el directorio principal de cada usuario en ~/.config/systemd/user/docker.service.d/. Además, systemctl debe ejecutarse sin sudo y con la opción --user. Selecciona la pestaña "Modo rootless" si estás ejecutando Docker en modo rootless.

  1. Crea un directorio de personalización de systemd para el servicio docker:

    $ sudo mkdir -p /etc/systemd/system/docker.service.d
    
  2. Crea un archivo llamado /etc/systemd/system/docker.service.d/http-proxy.conf que añada la variable de entorno HTTP_PROXY:

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

    Para redirigir las solicitudes HTTPS a través del proxy, establece la variable de entorno HTTPS_PROXY:

    [Service]
    Environment="HTTPS_PROXY=http://proxy.example.com:3128"

    Se pueden definir múltiples variables de entorno; para configurar tanto un proxy HTTP como uno HTTPS:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=http://proxy.example.com:3128"
    Note

    Los caracteres especiales en el valor del proxy, como #?!()[]{}, deben escaparse doblemente utilizando %%. Por ejemplo:

    [Service]
    Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%[email protected]:3128/"
  3. Si tienes registros (registries) de Docker internos con los que necesitas comunicarte sin pasar por el proxy, puedes especificarlos a través de la variable de entorno NO_PROXY.

    La variable NO_PROXY especifica una cadena que contiene valores separados por comas para los hosts que deben excluirse del proxy. Estas son las opciones que puedes especificar para excluir hosts:

    • Prefijo de dirección IP (1.2.3.4)
    • Nombre de dominio, o una etiqueta especial de DNS (*)
    • Un nombre de dominio coincide con ese nombre y todos sus subdominios. Un nombre de dominio que comience con un punto "." coincide únicamente con los subdominios. Por ejemplo, dados los dominios foo.example.com y example.com:
      • example.com coincide con example.com y foo.example.com, y
      • .example.com coincide únicamente con foo.example.com
    • Un solo asterisco (*) indica que no se debe utilizar proxy en absoluto
    • Se aceptan números de puerto literales tanto en prefijos de dirección IP (1.2.3.4:80) como en nombres de dominio (foo.example.com:80)

    Ejemplo:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=http://proxy.example.com:3128"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
  4. Aplica los cambios y reinicia Docker:

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker
    
  5. Verifica que la configuración se haya cargado y coincida con los cambios que realizaste, por ejemplo:

    $ sudo systemctl show --property=Environment docker
    
    Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=http://proxy.example.com:3128 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
    
  1. Crea un directorio de personalización de systemd para el servicio docker:

    $ mkdir -p ~/.config/systemd/user/docker.service.d
    
  2. Crea un archivo llamado ~/.config/systemd/user/docker.service.d/http-proxy.conf que añada la variable de entorno HTTP_PROXY:

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

    Para redirigir las solicitudes HTTPS a través del proxy, establece la variable de entorno HTTPS_PROXY:

    [Service]
    Environment="HTTPS_PROXY=http://proxy.example.com:3128"

    Se pueden definir múltiples variables de entorno; para configurar tanto un proxy HTTP como uno HTTPS:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=http://proxy.example.com:3128"
    Note

    Los caracteres especiales en el valor del proxy, como #?!()[]{}, deben escaparse doblemente utilizando %%. Por ejemplo:

    [Service]
    Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%[email protected]:3128/"
  3. Si tienes registros de Docker internos con los que necesitas comunicarte sin pasar por el proxy, puedes especificarlos a través de la variable de entorno NO_PROXY.

    La variable NO_PROXY especifica una cadena que contiene valores separados por comas para los hosts que deben excluirse del proxy. Estas son las opciones que puedes especificar para excluir hosts:

    • Prefijo de dirección IP (1.2.3.4)
    • Nombre de dominio, o una etiqueta especial de DNS (*)
    • Un nombre de dominio coincide con ese nombre y todos sus subdominios. Un nombre de dominio que comience con un punto "." coincide únicamente con los subdominios. Por ejemplo, dados los dominios foo.example.com y example.com:
      • example.com coincide con example.com y foo.example.com, y
      • .example.com coincide únicamente con foo.example.com
    • Un solo asterisco (*) indica que no se debe utilizar proxy en absoluto
    • Se aceptan números de puerto literales tanto en prefijos de dirección IP (1.2.3.4:80) como en nombres de dominio (foo.example.com:80)

    Ejemplo:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:3128"
    Environment="HTTPS_PROXY=http://proxy.example.com:3128"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
  4. Aplica los cambios y reinicia Docker:

    $ systemctl --user daemon-reload
    $ systemctl --user restart docker
    
  5. Verifica que la configuración se haya cargado y coincida con los cambios que realizaste, por ejemplo:

    $ systemctl --user show --property=Environment docker
    
    Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=http://proxy.example.com:3128 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp