Docker y Multicast

De ChuWiki
Saltar a: navegación, buscar

A probar si con docker se puede enviar y recibir multicast. Lo he probado sobre un Ubuntu

Imagen de Sender

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

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

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.