Creación de redes en Docker.

Redes de DockerCuando se instala Docker, se crean tres redes: Bridge, none y host. Bridge es la red predeterminada a la que se conecta un contenedor. Si se desea asociar el contenedor con cualquier otra red, hay que especificar la información de la red utilizando el parámetro de línea de comando “–network”: “docker run –network=none ubuntu” o “docker run –network=host ubuntu”

La red “bridge” es una red interna privada creada por Docker en el host. Todos los contenedores se conectan a esta red de forma predeterminada y obtienen una dirección IP interna,  generalmente en el rango 172.17.0.*. Los contenedores pueden acceder entre sí utilizando esta IP interna. Para acceder a cualquiera de estos contenedores desde el mundo exterior hay que mapear los puertos de estos contenedores a los puertos de nuestro host tal como vimos en Opciones del comando run de Docker

Otra forma de acceder a los contenedores externamente es asociar el contenedor a la red “host”. Esto elimina cualquier aislamiento de red entre el host de Docker y el contenedor de Docker. Es decir, si tuviera que ejecutar un servidor web en el Puerto 5000 en un contenedor web, es automáticamente accesible en el mismo puerto externamente sin requerir ninguna asignación de puertos, ya que el contenedor web utiliza la red “host”. Esto también significaría que, a diferencia de antes, ahora no podrá ejecutar varios contenedores web en el mismo host en el mismo puerto, ya que los puertos ahora son comunes a todos los contenedores en la red host con ninguna red. Con la red “none” los contenedores no se asocian a ninguna red y no tienen acceso a la red externa u otros contenedores. Se ejecutan en una red aislada. 

Aislamiento de redes

Acabamos de ver que la red “bridge” es la predeterminada y usa el rango 172.17. 0.*, por lo tanto, todos los contenedores asociados a esta red predeterminada podrán  comunicarse entre sí. Pero, ¿qué sucede si deseamos aislar los contenedores dentro del host de Docker, por ejemplo, los dos primeros contenedores web en la red interna 172 y otros contenedores en una red interna diferente como 182. Por defecto Docker solo crea una red “bridge” interna, pero podríamos crear nuestra propia red interna usando el comando “docker network create” y especificar que el controlador es “bridge”, la subred  y el nombre personalizado de la red aislada: “docker network create –driver bridge –subnet 182.18.0.0/16 mi-red-aislada”. Con el comando “docker network ls” para enumerar todas las redes. 

Información

¿cómo podemos ver la configuración de red y la dirección IP asignada a un contenedor existente? con el comando “docker inspect <nombre del contenedor>” para ver una sección sobre la configuración de la red. Allí puede ver el tipo de red que el contenedor está conectado, su dirección IP interna, la dirección MAC y otros… 

Los contenedores pueden comunicarse entre sí utilizando sus nombres. Por ejemplo, en caso de tener un servidor web y un contenedor de base de datos MySQL ejecutándose en el mismo nodo, ¿cómo puedo hacer que mi servidor web acceda a la base de datos en el contenedor de la base de datos? Una cosa que podría hacer es usar la dirección IP interna asignada al contenedor MySQL que podría ser la 172.17.0.3, pero eso no es muy bueno porque no se garantiza que el contenedor obtenga la misma IP cuando el sistema se reinicie. La forma correcta de hacerlo es usar el nombre del contenedor.

Todos los contenedores en un host Docker pueden resolverse entre sí con el nombre del contenedor. Docker tiene un servidor DNS incorporado que ayuda a los contenedores a resolverse entre sí utilizando el nombre del contenedor. Hay que tener en cuenta que el servidor DNS incorporado siempre se ejecuta en la dirección 127.0.0.11

Entonces, ¿cómo implementa Docker las redes? ¿Cuál es la tecnología detrás de esto? ¿Cómo se aislan los contenedores dentro de la red de usuarios de Docker host?

Docker usa Nombre de espacios de red. Eso crea un espacio de nombres separado para cada contenedor. Luego usa pares virtuales de Ethernet para conectar contenedores. Pero eso es para un uso avanzado.

En la página de Docker se puede encontrar más información: https://docs.docker.com/network/