Advertising:
Docker y Multicast
A probar si con docker se puede enviar y recibir multicast. Lo he probado sobre un Ubuntu
Imagen de Sender[edit]
Hay un comando linux mcsender
del paquete smcroute
que podemos instalar para enviar por multicast desde línea de comandos. Para hacer una imagen docker, nos vale un Dockerfile como el siguiente
FROM ubuntu:16.04 RUN apt-get update RUN apt-get install \ smcroute # Define default command. CMD ["mcsender","225.0.0.1:3333"]
Partimos de un ubuntu:16:04 para no liarnos mucho. Lleva demasiadas cosas, pero seguro que tiene todo lo necesario y si partimos de algo más básico como la versión Alpine, seguro que tenemos que instalar muchas más cosas para que funcione. Como sólo estamos de pruebas, no nos complicamos.
Construimos y arrancamos la imagen. Ejecutando en el directorio donde esté el fichero Dockerfile.send con el contenido que acabamos de mostrar
docker build -t sender -f Dockerfile.send . docker run -it --name sender sender
Imagen del receiver[edit]
Para la imagen del receptor de multicast, simplemente nos aseguramos que tiene tcpdump instalado y lo arrancamos. El siguiente Dockerfile nos vale
FROM ubuntu:16.04 RUN apt-get update RUN apt-get install -y \ tcpdump CMD ["tcpdump", "-ieth0", "host 225.0.0.1 and port 3333"]
Como antes para no liarnos partimos de un ubuntu:16.04, instalamos tcpdump (con la opción -y para que conteste automáticamente que sí a todas las preguntas de instalación. El comando a ejecutar en este máquina será tcpdump, en la interfaz de red por defecto eth0 y queremos escuchar el host (ip) de multicast y puerto por el que envía el sender.
En el directorio donde esté el fichero Dockerfile.recv (como le hemos llamado para distinguirlo del otro), ejecutamos los comandos
docker build -t receiver -f Dockerfile.recv docker run -it --name receiver receiver
La opción -it es para que nos abra un terminal para ver la salida de tcpdump. Listo, si todo va bien, deberíamos ver la salida de este comando recibiendo paquetes multicast, más o menos así
... 15:37:15.011607 IP 172.17.0.3.33364 > 225.0.0.1.3333: UDP, length 46 15:37:16.011857 IP 172.17.0.3.33364 > 225.0.0.1.3333: UDP, length 46 15:37:17.012246 IP 172.17.0.3.33364 > 225.0.0.1.3333: UDP, length 46 15:37:18.012442 IP 172.17.0.3.33364 > 225.0.0.1.3333: UDP, length 46 ...
Enviar desde el host[edit]
Si no hemos jugueteado mucho y desde nuestro host anfitrión vemos las tarjetas de red con el comando ifconfig (o el comando ip), veremos que hay una tarjeta de red de nombre docker0
chuidiang@javier-linux:~/docker/multicast$ ifconfig -a .... docker0 Link encap:Ethernet direcciónHW 02:42:14:af:52:f4 Direc. inet:172.17.0.1 Difus.:0.0.0.0 Másc:255.255.0.0 Dirección inet6: fe80::42:14ff:feaf:52f4/64 Alcance:Enlace ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1 Paquetes RX:13053 errores:0 perdidos:0 overruns:0 frame:0 Paquetes TX:15134 errores:0 perdidos:0 overruns:0 carrier:0 colisiones:0 long.colaTX:0 Bytes RX:762907 (762.9 KB) TX bytes:33046526 (33.0 MB) ....
esta es la tarjeta de red que conecta con las máquinas virtuales, si enviamos paquetes multicast por esta interfaz de red, los recibirán nuestros container
mcsender -idocker0 225.0.0.1:3333
y el log del tcpdump que todavía tenemos arrancado, porque no lo has matado todavía ¿verdad?, dará ahora
... 15:40:27.638372 IP 172.17.0.1.51428 > 225.0.0.1.3333: UDP, length 46 15:40:28.062385 IP 172.17.0.3.33364 > 225.0.0.1.3333: UDP, length 46 15:40:28.638615 IP 172.17.0.1.51428 > 225.0.0.1.3333: UDP, length 46 15:40:29.062641 IP 172.17.0.3.33364 > 225.0.0.1.3333: UDP, length 46 15:40:29.638846 IP 172.17.0.1.51428 > 225.0.0.1.3333: UDP, length 46 15:40:30.062902 IP 172.17.0.3.33364 > 225.0.0.1.3333: UDP, length 46 15:40:30.639014 IP 172.17.0.1.51428 > 225.0.0.1.3333: UDP, length 46 15:40:31.063155 IP 172.17.0.3.33364 > 225.0.0.1.3333: UDP, length 46 ...
Vemos que en la IP de origen se alternan la 172.17.0.1 (nuestro host anfitrión) y la 172.17.0.3, la de nuestro contenedor sender.