Docker puede asignar direcciones IPv6 a los contenedores conectados a una red bridge. Para probar la conectividad entre el host y los contenedores basta una red local; para exponer un contenedor a otros equipos hacen falta además un prefijo adecuado, rutas y reglas de firewall. Esta guía usa una red bridge definida por el usuario y separa ambos casos [1][2].
Importante: no copies a la configuración una dirección IPv6 pública de otro servidor. Usa un prefijo ULA para una red privada o el prefijo global que tu proveedor haya delegado para tu red de contenedores.
IPv6 privado o enrutable
Una dirección ULA pertenece al espacio privado fd00::/8: sirve para comunicación interna y no se enruta por Internet. Una dirección global debe proceder del prefijo que el proveedor o administrador de red haya asignado y requiere una ruta hacia la red bridge. Activar IPv6 en Docker, por sí solo, no crea esa ruta [1][2].
Docker puede asignar direcciones ULA automáticamente cuando IPv6 está habilitado y no se especifica otro pool. Para un ejemplo controlado, crearemos explícitamente una red IPv6 de usuario [1]:
docker network create \
--ipv6 \
--subnet fd42:62ab:9e12:1::/64 \
red-ipv6
El prefijo ULA del ejemplo es ilustrativo. En una red propia, genera un prefijo ULA único para evitar solapamientos con otras redes conectadas.
Ejecutar un contenedor y comprobar la red
Publica el servicio de prueba solo en el loopback IPv6 del host. Así se puede comprobar desde el propio host sin abrirlo a otros equipos:
docker run -d \
--name web-prueba-ipv6 \
--network red-ipv6 \
-p '[::1]:8080:80' \
nginx:alpine
Consulta la dirección asignada y comprueba la respuesta local:
docker network inspect red-ipv6
curl -g -6 'http://[::1]:8080'
En Docker Engine anterior a la versión 28 hay una salvedad: otros equipos del mismo segmento de capa 2 podrían alcanzar puertos publicados en loopback. No uses este método como único control de acceso en esas versiones [2].
Para retirar el contenedor y la red de prueba:
docker rm -f web-prueba-ipv6
docker network rm red-ipv6
Publicar un servicio con IPv6 global
Para acceso desde otras redes, sustituye el prefijo del ejemplo por el prefijo global que tu proveedor haya delegado y crea una red configurada para enrutamiento directo IPv6 [1][2]:
docker network create \
--ipv6 \
--subnet 2001:db8:1::/64 \
-o com.docker.network.bridge.gateway_mode_ipv6=routed \
red-ipv6-publica
2001:db8:1::/64 está reservado para documentación y no es enrutable en Internet. Debes reemplazarlo por el prefijo real asignado a tu red; no uses un prefijo ULA para este caso.
Publica el puerto del contenedor para IPv6 y comprueba su dirección con docker network inspect:
docker run -d \
--name web-publica-ipv6 \
--network red-ipv6-publica \
-p '[::]::80' \
nginx:alpine
En modo routed, los clientes acceden al puerto 80 de la dirección IPv6 del contenedor; no se crea una traducción al puerto 8080 del host. Para que funcione desde fuera, la red externa debe tener una ruta hacia el prefijo de los contenedores y el firewall debe permitir el tráfico previsto [2].
Diagnóstico básico
Si no hay conectividad, revisa los puntos siguientes antes de cambiar la configuración del host:
- Comprueba que el daemon de Docker admite IPv6 y que la red se creó con
--ipv6. - Consulta
docker network inspect red-ipv6para verificar el prefijo y la dirección del contenedor. - Comprueba que el puerto publicado corresponde al modo de red elegido. Con modo
nat, Docker publica el puerto en el host; con modorouted, el cliente remoto necesita una ruta hasta la dirección del contenedor [2]. - Revisa el firewall del host y las rutas del router. Docker gestiona reglas de filtrado para sus redes; una regla añadida a una cadena equivocada puede no filtrar el tráfico como se esperaba [3].
- Si se modifica
/etc/docker/daemon.json, valida el JSON y planifica el reinicio de Docker: reiniciar el daemon afecta a los contenedores en ejecución [1].
No desactives ip6tables para intentar resolver un problema de conectividad: Docker lo usa para el aislamiento y el mapeo de puertos en redes bridge [1][3].
En resumen
- Una red bridge definida por el usuario puede asignar direcciones IPv6 a los contenedores.
- Las direcciones ULA permiten comunicación interna; para acceso externo se necesita un prefijo global y una ruta.
-ppublica puertos y puede hacerlos accesibles desde fuera del host. Limita la publicación cuando el servicio no deba ser público.- En modo
routed, el tráfico llega a la dirección del contenedor y requiere enrutamiento y reglas de firewall correctas.
📚 Fuentes consultadas
- Use IPv6 networking — Docker Docs
- Port publishing and mapping — Docker Docs
- Docker with iptables — Docker Docs