# Usar redes IPv6


IPv6 solo es compatible con los demonios de Docker que se ejecutan en hosts Linux.

## Crear una red IPv6

- Usando `docker network create`:

  ```console
  $ docker network create --ipv6 ip6net
  ```

- Usando `docker network create` y especificando una subred IPv6:

  ```console
  $ docker network create --ipv6 --subnet 2001:db8::/64 ip6net
  ```

- Usando un archivo de Docker Compose:

  ```yaml
   networks:
     ip6net:
       enable_ipv6: true
       ipam:
         config:
           - subnet: 2001:db8::/64
  ```

> [!NOTE]
>
> La dirección `2001:db8::/64` en estos ejemplos está [reservada para su uso en documentación][wikipedia-ipv6-reserved]. Reemplázala con una red IPv6 válida, por ejemplo, una subred de [Dirección Local Única (ULA)][wikipedia-ipv6-ula] dentro de `fd00::/8`.

Ahora puedes ejecutar contenedores que se conecten a la red `ip6net`.

```console
$ docker run --rm --network ip6net -p 80:80 traefik/whoami
```

Esto publica el puerto 80 tanto en IPv6 como en IPv4. Puedes verificar la conexión IPv6 ejecutando curl para conectarte al puerto 80 en la dirección de bucle de retorno (loopback) de IPv6:

```console
$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: 2001:db8::2
IP: fe80::42:acff:fe11:2
RemoteAddr: [2001:db8::1]:37574
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*
```

## Usar IPv6 para la red de puente (bridge) predeterminada

Los siguientes pasos te muestran cómo usar IPv6 en la red bridge predeterminada.

1. Edita el archivo de configuración del demonio de Docker, ubicado en `/etc/docker/daemon.json`. Configura los siguientes parámetros:

   ```json
   {
     "ipv6": true,
     "fixed-cidr-v6": "2001:db8:1::/64"
   }
   ```

   > [!NOTE]
   >
   > La dirección `2001:db8:1::/64` en este ejemplo está [reservada para su uso en documentación][wikipedia-ipv6-reserved]. Reemplázala con una red IPv6 válida, por ejemplo, una subred de [Dirección Local Única (ULA)][wikipedia-ipv6-ula] dentro de `fd00::/8`.

   - `ipv6` habilita las redes IPv6 en la red predeterminada.
   - `fixed-cidr-v6` asigna una subred a la red bridge predeterminada, habilitando la asignación dinámica de direcciones IPv6.
   - `ip6tables` habilita reglas adicionales de filtrado de paquetes IPv6, proporcionando aislamiento de red y mapeo de puertos. Está habilitado de forma predeterminada, pero se puede deshabilitar.

2. Guarda el archivo de configuración.
3. Reinicia el demonio de Docker para que los cambios surtan efecto.

   ```console
   $ sudo systemctl restart docker
   ```

Ahora puedes ejecutar contenedores en la red bridge predeterminada.

```console
$ docker run --rm -p 80:80 traefik/whoami
```

Esto publica el puerto 80 tanto en IPv6 como en IPv4. Puedes verificar la conexión IPv6 realizando una solicitud al puerto 80 en la dirección de bucle de retorno de IPv6:

```console
$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: 2001:db8:1::242:ac12:2
IP: fe80::42:acff:fe12:2
RemoteAddr: [2001:db8:1::1]:35558
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*
```

## Asignación dinámica de subredes IPv6

Si no configuras explícitamente las subredes para las redes definidas por el usuario utilizando `docker network create --subnet=<tu-subred>`, esas redes utilizarán los grupos de direcciones predeterminados del demonio como alternativa. Esto también se aplica a las redes creadas desde un archivo de Docker Compose con `enable_ipv6` establecido en `true`.

Si no se incluyen grupos de direcciones IPv6 en el parámetro `default-address-pools` de Docker Engine, y no se proporciona la opción `--subnet`, se utilizarán [Direcciones Locales Únicas (ULA)][wikipedia-ipv6-ula] cuando se habilite IPv6. Estas subredes `/64` incluyen un ID Global de 40 bits basado en el ID generado aleatoriamente por Docker Engine, para otorgar una alta probabilidad de unicidad.

La configuración integrada del grupo de direcciones predeterminado se muestra en [Asignación de subredes](/engine/network/#subnet-allocation). No incluye ningún grupo de direcciones IPv6.

Para utilizar diferentes grupos de subredes IPv6 para la asignación dinámica de direcciones, debes configurar manualmente los grupos de direcciones del demonio para incluir:

- Los grupos de direcciones IPv4 predeterminados
- Uno o más grupos de direcciones IPv6 propios

El siguiente ejemplo muestra una configuración válida con grupos de direcciones IPv4 e IPv6; ambos grupos proporcionan 256 subredes. Las subredes IPv4 con longitud de prefijo `/24` se asignarán a partir de un grupo `/16`. Las subredes IPv6 con longitud de prefijo `/64` se asignarán a partir de un grupo `/56`.

```json
{
  "default-address-pools": [
    { "base": "172.17.0.0/16", "size": 24 },
    { "base": "2001:db8::/56", "size": 64 }
  ]
}
```

> [!NOTE]
>
> La dirección `2001:db8::` en este ejemplo está [reservada para su uso en documentación][wikipedia-ipv6-reserved]. Reemplázala con una red IPv6 válida.
>
> Los grupos IPv4 predeterminados provienen del rango de direcciones privadas, de manera similar a las redes IPv6 [ULA][wikipedia-ipv6-ula] predeterminadas.

Consulta [Asignación de subredes](/engine/network/#subnet-allocation) para obtener más información sobre `default-address-pools`.

[wikipedia-ipv6-reserved]: https://en.wikipedia.org/wiki/Reserved_IP_addresses#IPv6
[wikipedia-ipv6-ula]: https://en.wikipedia.org/wiki/Unique_local_address

## Docker in Docker (Docker dentro de Docker)

En un host que utiliza `xtables` (`iptables` heredado) en lugar de `nftables`, el módulo del kernel `ip6_tables` debe cargarse antes de poder crear una red Docker IPv6. Normalmente se carga automáticamente cuando se inicia Docker.

Sin embargo, si ejecutas Docker dentro de Docker y no te basas en una versión reciente de la [imagen oficial de `docker`](https://hub.docker.com/_/docker), es posible que debas ejecutar `modprobe ip6_tables` en tu host. Alternativamente, utiliza la opción del demonio `--ip6tables=false` para deshabilitar `ip6tables` en el Docker Engine contenedorizado.

## Próximos pasos

- [Descripción general de las redes](/engine/network/)

