Vista general de redes
La red de contenedores hace referencia a la capacidad de los contenedores para conectarse y comunicarse entre sí y con servicios de red que no pertenecen a Docker.
Los contenedores tienen la red habilitada de forma predeterminada y pueden realizar conexiones salientes. Un contenedor no tiene información sobre a qué tipo de red está conectado, ni si sus pares de red también son contenedores Docker. Un contenedor solo ve una interfaz de red con una dirección IP, una puerta de enlace, una tabla de enrutamiento, servicios DNS y otros detalles de red.
Esta página describe las redes desde el punto de vista del contenedor y los conceptos que las rodean.
Cuando Docker Engine en Linux se inicia por primera vez, tiene una única red integrada llamada la red "bridge predeterminada". Al ejecutar un contenedor sin la opción --network, este se conecta a la red bridge predeterminada.
Los contenedores conectados a la red bridge predeterminada tienen acceso a servicios de red fuera del host de Docker. Utilizan "enmascaramiento", lo que significa que si el host de Docker tiene acceso a Internet, no se necesita configuración adicional para que el contenedor también lo tenga.
Por ejemplo, para ejecutar un contenedor en la red bridge predeterminada y hacer que haga ping a un host de Internet:
$ docker run --rm -ti busybox ping -c1 docker.com
PING docker.com (23.185.0.4): 56 data bytes
64 bytes from 23.185.0.4: seq=0 ttl=62 time=6.564 ms
--- docker.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 6.564/6.564/6.564 ms
Redes definidas por el usuario
Con la configuración predeterminada, los contenedores conectados a la red bridge predeterminada tienen acceso de red sin restricciones entre sí mediante direcciones IP de contenedor. No pueden hacer referencia entre sí por nombre.
Puede ser de utilidad separar grupos de contenedores que deben tener acceso completo entre sí, pero un acceso restringido a contenedores en otros grupos.
Puedes crear redes personalizadas definidas por el usuario y conectar grupos de contenedores a la misma red. Una vez conectados a una red definida por el usuario, los contenedores pueden comunicarse entre sí utilizando direcciones IP o nombres de contenedor.
El siguiente ejemplo crea una red utilizando el controlador de red bridge y ejecuta un contenedor en esa red:
$ docker network create -d bridge mi-red
$ docker run --network=my-net -it busybox
Controladores
Docker Engine tiene varios controladores de red, además del "bridge" predeterminado. En Linux, están disponibles los siguientes controladores de red integrados:
| Controlador | Descripción |
|---|---|
| bridge | El controlador de red predeterminado. |
| host | Elimina el aislamiento de red entre el contenedor y el host de Docker. |
| none | Aísla completamente un contenedor del host y de otros contenedores. |
| overlay | Las redes Swarm Overlay conectan varios daemons de Docker entre sí. |
| ipvlan | Conecta contenedores a VLAN externas. |
| macvlan | Los contenedores aparecen como dispositivos en la red del host. |
Puedes encontrar más información en las páginas específicas de cada controlador de red, incluyendo sus opciones de configuración y detalles sobre su funcionamiento.
Los contenedores nativos de Windows tienen un conjunto diferente de controladores; consulta Controladores de red de contenedores de Windows.
Conexión a múltiples redes
Conectar un contenedor a una red se puede comparar con conectar un cable Ethernet a un host físico. Al igual que un host puede estar conectado a múltiples redes Ethernet, un contenedor puede estar conectado a múltiples redes de Docker.
Por ejemplo, un contenedor frontend puede estar conectado a una red bridge con acceso externo y a una red
--internal para comunicarse con contenedores que ejecutan servicios backend que no necesitan acceso a redes externas.
Un contenedor también puede estar conectado a diferentes tipos de red. Por ejemplo, una red ipvlan para proporcionar acceso a Internet y una red bridge para el acceso a servicios locales.
Los contenedores también pueden compartir pilas de red; consulta Redes de contenedores.
Al enviar paquetes, si el destino es una dirección en una red directamente conectada, los paquetes se envían a esa red. De lo contrario, los paquetes se envían a una puerta de enlace predeterminada para su enrutamiento hacia su destino. En el ejemplo anterior, la puerta de enlace de la red ipvlan debe ser la puerta de enlace predeterminada.
La puerta de enlace predeterminada es seleccionada por Docker y puede cambiar cada vez que cambien las conexiones de red de un contenedor. Para que Docker elija una puerta de enlace predeterminada específica al crear el contenedor o al conectar una nueva red, define una prioridad de puerta de enlace. Consulta la opción gw-priority para los comandos
docker run y
docker network connect.
La prioridad de puerta de enlace predeterminada gw-priority es 0 y la puerta de enlace en la red con la prioridad más alta es la puerta de enlace predeterminada. Por lo tanto, cuando una red deba ser siempre la puerta de enlace predeterminada, basta con establecer su gw-priority en 1.
$ docker run --network name=gwnet,gw-priority=1 --network anet1 --name myctr myimage
$ docker network connect anet2 myctr
Puertos publicados
Al crear o ejecutar un contenedor con docker create o docker run, todos los puertos de los contenedores en redes bridge son accesibles desde el host de Docker y desde otros contenedores conectados a la misma red. No se puede acceder a los puertos desde fuera del host o, con la configuración predeterminada, desde contenedores en otras redes.
Utiliza el flag --publish o -p para hacer que un puerto esté disponible fuera del host y para los contenedores en otras redes bridge.
Para obtener más información sobre el mapeo de puertos, incluyendo cómo deshabilitarlo y usar el enrutamiento directo a los contenedores, consulta Publicación de puertos.
Dirección IP y nombre de host
Al crear una red, la asignación de direcciones IPv4 está habilitada de forma predeterminada; se puede deshabilitar utilizando --ipv4=false. La asignación de direcciones IPv6 se puede habilitar utilizando --ipv6.
$ docker network create --ipv6 --ipv4=false red-v6
De forma predeterminada, el contenedor obtiene una dirección IP para cada red de Docker a la que se conecta. Un contenedor recibe una dirección IP del rango de la subred IP de la red. El daemon de Docker realiza la subred dinámica y la asignación de direcciones IP para los contenedores. Cada red tiene también una máscara de subred y una puerta de enlace predeterminadas.
Puedes conectar un contenedor en ejecución a múltiples redes, bien pasando el flag --network varias veces al crear el contenedor, o utilizando el comando docker network connect para contenedores que ya están en ejecución. En ambos casos, puedes utilizar los flags --ip o --ip6 para especificar la dirección IP del contenedor en esa red en particular.
De la misma manera, el nombre de host de un contenedor tiene como valor predeterminado el ID del contenedor en Docker. Puedes anular el nombre de host utilizando --hostname. Al conectarse a una red existente mediante docker network connect, puedes utilizar el flag --alias para especificar un alias de red adicional para el contenedor en esa red.
Asignación de subredes
Las redes de Docker pueden utilizar subredes configuradas explítransmitidamente o asignadas automáticamente de forma predeterminada a partir de los grupos predefinidos.
Configuración explícita de subredes
Puedes especificar subredes exactas al crear una red:
$ docker network create --ipv6 --subnet 192.0.2.0/24 --subnet 2001:db8::/64 mi-red
Asignación automática de subredes
Cuando no se proporciona una opción --subnet, Docker selecciona automáticamente una subred a partir de los "grupos de direcciones predeterminados" (default address pools). Estos grupos se pueden configurar en /etc/docker/daemon.json. El valor predeterminado integrado de Docker es equivalente a:
{
"default-address-pools": [
{ "base": "172.17.0.0/16", "size": 16 },
{ "base": "172.18.0.0/16", "size": 16 },
{ "base": "172.19.0.0/16", "size": 16 },
{ "base": "172.20.0.0/14", "size": 16 },
{ "base": "172.24.0.0/14", "size": 16 },
{ "base": "172.28.0.0/14", "size": 16 },
{ "base": "192.168.0.0/16", "size": 20 }
]
}base: La subred desde la cual se puede realizar la asignación.size: La longitud de prefijo utilizada para cada subred asignada.
Cuando se requiere una subred IPv6 y no hay direcciones IPv6 en default-address-pools, Docker asigna subredes a partir de un prefijo de Dirección Local Única (ULA). Para utilizar subredes IPv6 específicas en su lugar, añádelas a tu default-address-pools. Consulta Asignación dinámica de subredes IPv6 para obtener más información.
Docker intenta evitar los prefijos de direcciones que ya están en uso en el host. Sin embargo, es posible que debas personalizar default-address-pools para evitar conflictos de enrutamiento en algunos entornos de red.
Los grupos predeterminados utilizan subredes grandes, lo que limita la cantidad de redes que puedes crear. Puedes dividir las subredes base en grupos más pequeños para admitir más redes.
Por ejemplo, esta configuración permite a Docker crear 256 redes a partir de 172.17.0.0/16. Docker asignará las subredes 172.17.0.0/24, 172.17.1.0/24, y así sucesivamente, hasta 172.17.255.0/24:
{
"default-address-pools": [{ "base": "172.17.0.0/16", "size": 24 }]
}También puedes solicitar una subred con una longitud de prefijo específica de los grupos predeterminados utilizando direcciones no especificadas en la opción --subnet:
$ docker network create --ipv6 --subnet ::/56 --subnet 0.0.0.0/24 mi-red
6686a6746b17228f5052528113ddad0e6d68e2e3905d648e336b33409f2d3b64
$ docker network inspect mi-red -f '{{json .IPAM.Config}}' | jq .
[
{
"Subnet": "172.19.0.0/24",
"Gateway": "172.19.0.1"
},
{
"Subnet": "fdd3:6f80:972c::/56",
"Gateway": "fdd3:6f80:972c::1"
}
]
NoteEl soporte para direcciones no especificadas en
--subnetse introdujo en Docker 29.0.0. Si Docker se degrada a una versión anterior, las redes creadas de esta forma dejarán de ser utilizables. Se pueden eliminar y volver a crear, o volverán a funcionar si el daemon se restaura a la versión 29.0.0 o posterior.
Servicios DNS
Los contenedores utilizan los mismos servidores DNS que el host de forma predeterminada, pero puedes invalidar esto con --dns.
De forma predeterminada, los contenedores heredan la configuración de DNS definida en el archivo de configuración /etc/resolv.conf. Los contenedores que se conectan a la red bridge predeterminada reciben una copia de este archivo. Los contenedores que se conectan a una red personalizada utilizan el servidor DNS integrado de Docker. El servidor DNS integrado reenvía las búsquedas de DNS externas a los servidores DNS configurados en el host. La dirección del servidor DNS integrado es 127.0.0.11. No hay equivalente en IPv6; la dirección IPv4 funciona incluso en contenedores exclusivos de IPv6. Si una aplicación requiere una dirección de servidor DNS explícita, utiliza 127.0.0.11.
Puedes configurar la resolución de DNS por contenedor utilizando los flags del comando docker run o docker create empleado para iniciar el contenedor. La siguiente tabla describe los flags disponibles de docker run relacionados con la configuración de DNS.
| Flag | Descripción |
|---|---|
--dns | La dirección IP de un servidor DNS. Para especificar varios servidores DNS, utiliza varios flags --dns. Las solicitudes DNS se reenviarán desde el espacio de nombres de red del contenedor, por lo que, por ejemplo, --dns=127.0.0.1 hace referencia a la propia dirección loopback del contenedor. |
--dns-search | Un dominio de búsqueda DNS para buscar nombres de host que no están completamente calificados. Para especificar múltiples prefijos de búsqueda DNS, utiliza varios flags --dns-search. |
--dns-opt | Un par clave-valor que representa una opción de DNS y su valor. Consulta la documentación de resolv.conf de tu sistema operativo para conocer las opciones válidas. |
--hostname | El nombre de host que un contenedor utiliza para sí mismo. Si no se especifica, toma como valor predeterminado el ID del contenedor. |
Hosts personalizados
Tu contenedor tendrá líneas en /etc/hosts que definen el nombre de host del propio contenedor, así como localhost y algunos otros elementos comunes. Los hosts personalizados, definidos en /etc/hosts en la máquina host, no son heredados por los contenedores. Para pasar hosts adicionales a un contenedor, consulta
añadir entradas al archivo hosts del contenedor en la documentación de referencia de docker run.
Redes de contenedores
Además de las redes definidas por el usuario, puedes conectar un contenedor directamente a la pila de red de otro contenedor utilizando el formato de flag --network container:<nombre|id>.
Los siguientes flags no son compatibles con los contenedores que utilizan el modo de red container::
--add-host--hostname--dns--dns-search--dns-option--mac-address--publish--publish-all--expose
El siguiente ejemplo ejecuta un contenedor Redis, vinculando Redis a la dirección 127.0.0.1, y luego ejecuta el comando redis-cli conectándose al servidor Redis a través de 127.0.0.1.
$ docker run -d --name redis redis --bind 127.0.0.1
$ docker run --rm -it --network container:redis redis redis-cli -h 127.0.0.1