# Configuración de proxy para el demonio


<a name="httphttps-proxy"><!-- included for deep-links to old section --></a>

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](/engine/cli/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](/desktop/settings-and-maintenance/settings/#proxies).

Existen dos formas de configurar estos parámetros:

- [Configurar el demonio](#configuracion-del-demonio) a través de un archivo de configuración o mediante opciones de la CLI.
- Establecer [variables de entorno](#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`.

```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:

```console
$ 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](/engine/security/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.

**Instalación normal**



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

   ```console
   $ 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`:

   ```systemd
   [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`:

   ```systemd
   [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:

   ```systemd
   [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:
   >
   > ```systemd
   > [Service]
   > Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com: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:

   ```systemd
   [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:

   ```console
   $ 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:

   ```console
   $ 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
   ```

**Modo rootless**



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

   ```console
   $ 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`:

   ```systemd
   [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`:

   ```systemd
   [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:

   ```systemd
   [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:
   >
   > ```systemd
   > [Service]
   > Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com: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:

   ```systemd
   [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:

   ```console
   $ 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:

   ```console
   $ 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
   ```



