Docker componiendo redes de puentes

Docker componiendo redes de puentes
Docker Compose es una manera fácil de implementar aplicaciones de contenedores múltiples. Automatiza gran parte del mantenimiento de reservas, redes y gestión de recursos de aplicaciones en un solo Docker-Compose.archivo YML. Puede obtener la aplicación ejecutando Docker-Compose hacia arriba y volver a bajarla usando Docker-Compose Down.

Se agrega mucho a nuestro entorno Docker, que se pasa por alto y luego se elimina con el último comando. Uno de los objetos más importantes es una red de puentes. Esto es en lo que nos centraremos. Más precisamente, redes de puentes.

Docker Bridge Network

Docker tiene muchos controladores relacionados con las redes. Dos de los más importantes son el controlador de redes de puentes y la superposición uno. Este último se usa para el modo de enjambre de Docker, donde los contenedores que se ejecutan en diferentes nodos pueden haber sido parte de una subred abstractora única. La red de puentes, sin embargo, es la que nos interesa aquí.

Para crear una nueva red Docker llamada My-Network e inspeccionarla, ejecute:

$ Docker Network Create -d Bridge My -Network
$ Docker Inspeccione My-Network

Verá, entre otras cosas, una máscara de subred y una puerta de enlace predeterminada.


"Config": [

"Subred": "172.18.0.6/16 ",
"Gateway": "172.18.0.1 "

Cualquier contenedor que se conecte a esta red obtenga una IP en el rango de 172.18.0.2 a 172.18.255.254. Intentemos crear un par de contenedores en esta red:

$ Docker Run -dit - -Name Container1 -Network My -Network Ubuntu: Último
$ Docker Run -dit - -Name Container2 -Network My -Network Ubuntu: Último

Si ahora se ejecuta, inspeccione My-Network, notará que los contenedores individuales con su nombre propio y las direcciones IP correspondientes aparecen en el campo de contenedores de la salida JSON.

$ Docker Inspeccione My-Network

"Contenedores":
"8CE5CD67E6AED180B5D0B6B0FCD597175D6154C9208DAA9DE304AEC94757E99B":
"Nombre": "Container1",
"EndpointID": "93D020D22172D6C98A0B88E78A7A01F6D1A3D44B983E7454FBA7C1F1BE5FAE9D",
"Macaddress": "02: 42: AC: 12: 00: 02",
"Ipv4address": "172.18.0.2/16 ",
"IPv6Address": ""
,
"AF1434DF6F86D2DF96ACA1D7348DD6C815A4989EC07FB0F3CFEA95D4A38B4F74":
"Nombre": "Container2",
"EndpointID": "3A5F57639C71685A10584FD392C20ABC5AE693684860BEF486404D26B332395AA",
"Macaddress": "02: 42: AC: 12: 00: 03",
"Ipv4address": "172.18.0.3/16 ",
"IPv6Address": ""

Si crea otra red My-NetWork2, tendrá una máscara de subred diferente como 172.19.0.6/16 y los contenedores se aislarán de contenedores en otras redes. Entonces, idealmente, desea una red por aplicación, por lo que cada aplicación está segura y aislada entre sí.

Cómo compone crea una red

Docker Compose comprende la idea detrás de la ejecución de servicios para una aplicación en una red. Cuando implementa una aplicación usando el archivo Docker Compose, incluso cuando no se menciona parámetros de redes específicos, Docker Compose creará una nueva red de puentes e implementará el contenedor a través de esa red.

Si el Docker-Compose.YML está en el directorio my-app, el nombre del directorio se utilizará para nombrar la red y los contenedores montados sobre ella. Por ejemplo, si creo un directorio:

$ mkdir my-app
$ CD my-app
$ Vim Docker-Compose.YML

Y agregue el siguiente contenido al Docker-Compose.Archivo YML:

Versión: '3'
servicios:
my-nginx:
Imagen: Nginx: Último

Observe cómo no exponimos ningún puerto. Implementemos esta aplicación:

$ Docker -Compose Up -d

Esto crea una nueva red llamada my-app_default usando el controlador de red de puente que discutimos antes.Puede enumerar todas las redes en su configuración personal utilizando Docker Network LS y luego elegir la interfaz de red que coincida con el nombre de su directorio. Una vez que tenga el nombre de la red, puede inspeccionar Docker para ver todos los contenedores que forman parte de esa red junto con sus direcciones IP individuales y su máscara de subred.

Si creamos otro contenedor, utilizando directamente la CLI (esto no se recomienda para casos de uso del mundo real) en esta red, en realidad podemos hablar con nuestro servicio My-Nginx.

$ Docker Run -dit - -Name Container4 - -Network My -App_Default Ubuntu: Último
$ Docker Exec -it Container4 Bash
root@A32ACDF15A97:/# curl http: // my-ap.my-nginx_1

Esto imprimirá un archivo HTML con fragmentos familiares como "Bienvenido a Nginx" visible en él. El servidor web NGINX se puede acceder desde la red sin que tengamos que publicar ningún puerto! Más importante aún, ni siquiera tiene que comunicarse con ella usando su IP privada, simplemente puede llamarlo por su nombre de host (ese es el nombre del contenedor como se muestra en Docker PS).

Al ejecutar una base de datos y conectarla a la frontend, no tendrá que publicar el puerto de la base de datos en absoluto. En su lugar, puede comunicarse con el DB desde el servidor web simplemente llamando a su nombre de host predecible. Incluso cuando Docker Compose se ejecuta en otro lugar donde y la IP y la subred ahora pueden diferir, los contenedores aún podrán hablar entre sí.

Por supuesto, para publicar un puerto al mundo exterior, escribiríamos algo como lo siguiente:

Versión: '3'
servicios:
my-nginx:
Imagen: Nginx: Último
puerto:
- "8080: 80"

Ahora las personas pueden acceder al servidor web desde el puerto 8080 en la IP de su host de Docker. Esto puede ser, por ejemplo, la IP pública de su VPS o simplemente localhost si está ejecutando Docker en su escritorio. Una vez más, énfasis, no tiene que exponer ningún puerto para el contenedor de su base de datos, porque el servidor web puede hablar con él directamente y, por lo tanto, esto reduce el riesgo de bases de datos expuestas a Internet.

Cuando derriba su aplicación, usando:

$ Docker-Compose Down

Esta red de puentes personalizadas junto con todos los contenedores efímeros que se crearon y se unieron encima, utilizando Docker-Compose.El archivo YML se eliminará. Dejando su entorno Docker en un estado limpio.

Definiendo su propia red

Compose le permite definir su propia definición de red. Esto incluiría opciones para máscara de subred, direcciones IPv6, entre otras cosas. La forma en que se hace es que tenemos una red de nivel superior al igual que los servicios o la versión son claves de nivel superior. Esta clave no tiene indignación. Según la clave de las redes, ahora podemos definir varios atributos de la red, por ahora la mantendremos simple y solo mencionaremos que debería usar el controlador de puente.

Versión: '3'
Redes:
mi red:
Conductor: puente

Ahora cada contenedor puede conectarse a múltiples redes, por lo que en la sección Servicios mencionamos el nombre de esta red personalizada. La clave de las redes aquí espera una lista de redes.

Versión: '3'
servicios:
my-nginx:
Imagen: Nginx: Último
Redes:
- mi red
- alguna otra red # Esta es otra red que podría haber creado.

Por último, el orden en que se define la red y luego se usa dentro de una definición de servicio es relevante. Entonces, todo el archivo YML se verá así:

Versión: '3'
servicios:
my-nginx:
Imagen: Nginx: Último
Redes:
- mi red
Redes:
mi red:
Conductor: puente

Más información

Mientras escribe sus propias definiciones de red, es posible que desee consultar la documentación oficial. Para un vistazo rápido a las redes de nivel superior, la clave visite este enlace y para la tecla de redes de nivel de servicio aquí está la referencia.

También puede intentar especificar subredes en la definición de redes de nivel superior para que los servicios puedan tener un rango predeterminado de direcciones IP.