Link Search Menu Expand Document

Redes con docker-compose

Como hemos indicado anteriormente, cuando creamos un escenario con docker-compose se crea una nueva red definida por el usuario donde se conectan los contenedores, por lo tanto, obtenemos resolución por dns que resuelve tanto el nombre del contenedor, como el nombre del servicio.

Sin embargo en el fichero docker-compose.yaml podemos definir y configurar las redes que necesitemos en nuestro escenario, así como la conexión de los distintos contenedores a dichas redes.

Veamos un ejemplo:

version: '3.1'
services:
  app:
    container_name: servidor_web
    image: httpd:2.4
    restart: always
    ports:
      - 8080:80
    networks:
      red_web:
        ipv4_address: 192.168.10.10
      red_interna:
        ipv4_address: 192.168.20.10
    hostname: servidor_web

  db:
    container_name: servidor_mariadb
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: asdasd
    restart: always
    networks:
      red_interna:
        ipv4_address: 192.168.20.20
    hostname: servidor_mariadb
networks:
    red_web:
        ipam:
            config:
              - subnet: 192.168.10.0/24
    red_interna:
        ipam:
            config:
              - subnet: 192.168.20.0/24

Iniciamos el escenario:

$ docker-compose up -d
Creating network "docker-compose_red_web" with the default driver
Creating network "docker-compose_red_interna" with the default driver
Creating servidor_mariadb ... done
Creating servidor_web     ... done

Comprobamos que los dos contenedores se están ejecutando:

$ docker-compose ps
      Name                   Command             State                  Ports                
---------------------------------------------------------------------------------------------
servidor_mariadb   docker-entrypoint.sh mysqld   Up      3306/tcp                            
servidor_web       httpd-foreground              Up      0.0.0.0:8080->80/tcp,:::8080->80/tcp

Accedemos al servidor web e instalamos los paquetes necesarios para hacer las comprobaciones de configuración de la red:

$ docker-compose exec app bash
root@servidor_web::/usr/local/apache2# apt-get update && apt-get install -y inetutils-ping \
   iproute2 \
   dnsutils

Comprobamos que el hostname se ha configurado de manera adecuada:

root@servidor_web:/usr/local/apache2# cat /etc/hostname
servidor_web

Comprobamos que el contenedor está conectado a las dos redes y tiene las direcciones que hemos indicado:

root@servidor_web:/usr/local/apache2# ip a
...
401: eth0@if402: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc 
...
    inet 192.168.20.10/24 brd 192.168.20.255 scope global eth0
...
403: eth1@if404: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc 
...
    inet 192.168.10.10/24 brd 192.168.10.255 scope global eth1

Comprobamos que tenemos resolución DNS tanto con el nombre del servicio como con el nombre del contenedor:

root@servidor_web:/usr/local/apache2# dig servidor_mariadb

...
;; ANSWER SECTION:
servidor_mariadb.	600	IN	A	192.168.20.20
...

root@servidor_web:/usr/local/apache2# dig db

...
;; ANSWER SECTION:
db.			600	IN	A	192.168.20.20
...

Y por últimos comprobamos que hay conectividad:

root@servidor_web:/usr/local/apache2# ping servidor_mariadb
PING servidor_mariadb (192.168.20.20): 56 data bytes
64 bytes from 192.168.20.20: icmp_seq=0 ttl=64 time=0.195 ms
...