Configuración de red (Networking) en Dockers
Hoy os quiero mostrar la parte más compleja, a mi parecer más por concepto que por dificultad en sí, en este mundo de los dockers. En las tecnologías tradicionales de virtualización VMware, Microsoft o Citrix (asociadas al IAAS), colocar una IP a una máquina virtual resulta relativamente sencillo, ya que los conceptos se asemejan bastante a la informática más tradicional.
En los dockers hay que dar otra vuelta de tuerca a esta parte, ya que los contenedores se abstraen casi por completo del hardware que los está lanzando. Lo que puede llevar a liarnos en varias momentos, si no tienen el esquema claro en la cabeza de como trabajan. Vamos a intentar un poco de luz a los conceptos, desde mi propia perspectiva.
Partimos de una máquina virtual Centos 7 con Docker ya instalado. Hacemos un ifconfig con esto revisamos la red de nuestro Host que va a lanzar los Dockers. Como podéis ver, tenemos una IP de nuestra red local (en mi caso es un Workstation, así que ando rizando el rizo) y un interfaz docker0 que se genera en la instalación con configuración por defecto 172.17.0.1 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@localhost /]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:56ff:fe35:93f prefixlen 64 scopeid 0x20<link> ether 02:42:56:35:09:3f txqueuelen 0 (Ethernet) RX packets 11206 bytes 457540 (446.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 17695 bytes 34427783 (32.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.48.128 netmask 255.255.255.0 broadcast 192.168.48.255 inet6 fe80::20c:29ff:fe1a:36b0 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:1a:36:b0 txqueuelen 1000 (Ethernet) RX packets 2740975 bytes 1827011450 (1.7 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1784170 bytes 1644014862 (1.5 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
A su vez al instalar Docker en el Host se generan también 3 redes (bridge, host y none), que podremos asociar al crear un Docker:
1 2 3 4 5 |
[root@localhost /]# docker network ls NETWORK ID NAME DRIVER SCOPE 2487f6785163 bridge bridge local c8ccf7ce3c9e host host local 430d3d36c198 none null local |
Os explico un poco para qué sirve cada red:
- Bridge: Es la red por defecto, esta configuración la tendrán todos los dockers salvo que indiquemos lo contrario en su creación (luego os enseño como). Es un puente al interfaz docker0.
- Host: Como su propio nombre indica se refiere a los interfaces del host, y todas los interfaces tendrán acceso.
- None: Serán dockers aislados, sin interfaz de red.
CONFIGURACION RED DOCKERS EN MODO BRIDGE
Configuramos el interfaz bridge que viene por defecto. Si miramos lo que tenemos ahora mismo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[root@localhost /]# docker network inspect bridge [ { "Name": "bridge", "Id": "2487f67851634020d91957b3b8048dfe2375d0af1e309a787dc77e631f19245a", "Created": "2017-04-11T15:54:19.941755532+02:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16" } ] }, "Internal": false, "Attachable": false, "Containers": {}, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ] |
Como ya tenía una imagen centos bajada, la utilizo para generar un docker con nombre centos1. Se asignará la máscara y el gateway automáticamente:
1 2 |
[root@localhost /]# docker run -itd --name=centos1 centos 952f14dd0d6fc51f90e5054ee23db9270f3bce015d39f31c76e2d28d7465cd0b |
Ahora volvemos a revisar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
[root@localhost /]# docker network inspect bridge [ { "Name": "bridge", "Id": "2487f67851634020d91957b3b8048dfe2375d0af1e309a787dc77e631f19245a", "Created": "2017-04-11T15:54:19.941755532+02:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16" } ] }, "Internal": false, "Attachable": false, "Containers": { "952f14dd0d6fc51f90e5054ee23db9270f3bce015d39f31c76e2d28d7465cd0b": { "Name": "centos1", "EndpointID": "039c4f78afd126c007509938784db39f53985cbf92d2d89bd764ea8bb56b8a42" , "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ] |
Podemos revisarlo atacando al docker:
1 |
[root@localhost /]# docker attach centos1 |
Y haciendo un simple ping al interfaz del host:
1 2 3 4 |
[root@952f14dd0d6f /]# ping 172.17.0.1 PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data. 64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.032 ms 64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.076 ms |
O al docker mismamente:
1 2 3 4 |
[root@952f14dd0d6f /]# ping 952f14dd0d6f PING 952f14dd0d6f (172.17.0.2) 56(84) bytes of data. 64 bytes from 952f14dd0d6f (172.17.0.2): icmp_seq=1 ttl=64 time=0.080 ms 64 bytes from 952f14dd0d6f (172.17.0.2): icmp_seq=2 ttl=64 time=0.052 ms |
Como podéis observar nuestro docker ya tiene una IP asignada automáticamente, si sucesivamente vamos generando dockers, tendremos todos colgando del interfaz docker0 y se verán entre ellos. Os dejo un esquema de cómo sería:
Tendríamos que habilitar en el host el interface docker0 para poder trabajar en modo bridge, le añadiríamos el puerto y volveríamos a cargar para que se aplique la configuración.
1 2 3 4 5 6 7 8 |
[root@localhost /]# firewall-cmd --permanent --zone=trusted --change-interface=docker0 The interface is under control of NetworkManager, setting zone to 'trusted'. success [root@localhost /]# firewall-cmd --permanent --zone=trusted --add-port=80/tcp success [root@localhost /]# firewall-cmd --reload success |
CONFIGURACION RED DOCKERS EN MODO HOST
Para crear un docker con red en modo Host:
1 2 |
[root@localhost ~]# docker run -d --name centos3 --net=host repositorio/centos-mysql 5616d119fd3be40d545f12c95199bf444bff74ac9d83736460b9c7bd379cd813 |
Tener en cuenta que este modo impide lanzar varios dockers para hacer lo mismo. Ejemplo, publicar una web en el puerto 80 en el docker cuando ya tienes una en el Host u otro docker en el mismo modo. Para que funcione hay que modificar configuraciones, pero esto para más adelante.
CONFIGURACION RED DOCKERS EN MODO NONE
Creamos un docker con red none y comprobamos que realmente está aislado:
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# docker run --network=none -itd --name=centos2 centos 24b2ed0bde5b6377a96f8ff070a8bf3d949cfc326d766f080d27dea6ec95ab20 [root@localhost ~]# docker attach centos2 [root@24b2ed0bde5b /]# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
CREAR RED PERSONALIZADA PARA DOCKERS
Si queréis personalizar la red os dejo como hacerlo:
1 2 3 4 5 6 7 8 |
[root@localhost ~]# docker network create --driver bridge redpersonalizada 174078e40baef94b2b804e27f507dae54d824f9c932526d3fe78f42915ad814a [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 2487f6785163 bridge bridge local c8ccf7ce3c9e host host local 430d3d36c198 none null local 174078e40bae redpersonalizada bridge local |
Y hasta aquí el siguiente capítulo…
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?
hola y gracias muy interesante, e estado haciendo algunas pruebas y tengo un problema
tengo la maquina host con centos 7 y docker 18.09.6 conectada a un router que se encarga de asignar las ip por dhcp
la ip del router es 192.168.0.1 y la maquina host 192.168.0.2
quiero lebantar un contenedor y que este el router le asigne una ip por dhcp ejemplo 192.168.0.3 no se si es que sera pocible hacerlo si me pudieras orientar seria genial .. de antemano gracias