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.
ImportantLas configuraciones de proxy especificadas en
daemon.jsonson 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 a través de un archivo de configuración o mediante opciones de la CLI.
- Establecer variables de entorno en el sistema.
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_PROXYhttp_proxyHTTPS_PROXYhttps_proxyNO_PROXYno_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,systemctldebe ejecutarse sinsudoy con la opción--user. Selecciona la pestaña "Modo rootless" si estás ejecutando Docker en modo rootless.
Crea un directorio de personalización de systemd para el servicio
docker:$ sudo mkdir -p /etc/systemd/system/docker.service.dCrea un archivo llamado
/etc/systemd/system/docker.service.d/http-proxy.confque añada la variable de entornoHTTP_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"NoteLos 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/"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_PROXYespecifica 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.comyexample.com:example.comcoincide conexample.comyfoo.example.com, y.example.comcoincide únicamente confoo.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"- Prefijo de dirección IP (
Aplica los cambios y reinicia Docker:
$ sudo systemctl daemon-reload $ sudo systemctl restart dockerVerifica 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
Crea un directorio de personalización de systemd para el servicio
docker:$ mkdir -p ~/.config/systemd/user/docker.service.dCrea un archivo llamado
~/.config/systemd/user/docker.service.d/http-proxy.confque añada la variable de entornoHTTP_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"NoteLos 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/"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_PROXYespecifica 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.comyexample.com:example.comcoincide conexample.comyfoo.example.com, y.example.comcoincide únicamente confoo.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"- Prefijo de dirección IP (
Aplica los cambios y reinicia Docker:
$ systemctl --user daemon-reload $ systemctl --user restart dockerVerifica 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