/ HOWTO

Interprocesos en Contenedores.


IPC - Interprocess.

Como todos sabemos, es posible comunicar procesos/programas dentro de un sistema operativo, como ejemplo, un Navegador Web es cliente (Firefox) y nos permite comunicarnos con un servidor web (Apache), supongamos ahora que el servidor y el cliente están corriendo en la misma máquina Linux, entre ambos procesos se generan paquetes TCP-IP, en este caso contra el IP 127.0.0.1 (en el mejor de los casos), pero este proceso genera una sobrecarga en la comunicación, empaquetado de datos, posible encriptación/des-encriptación, procesos de validación intermedios en ambas puntas, etc.

Sin embargo, existe una funcionalidad de los sistemas operativos POSIX llamada “Interprocess Communication” que nos permite comunicar procesos corriendo en el mismo O.S. sin necesidad de utilizar una capa de red, facilita el proceso de comunicaciones entre dos programas compartiendo memoria, ficheros, tuberías/pipes, semáforos, mensajes, sockets y otras estructuras existentes.

Una buena página con mucha información al respecto.

http://www.chandrashekar.info/articles/linux-system-programming/introduction-to-linux-ipc-mechanims.html

Un buen video sobre IPC en Linux.

https://www.youtube.com/watch?v=vU2HDf5ZhO4

Esta funcionalidad reduce los tiempos, consumos de recursos, evita pasar por capas, encriptar/desencriptar, etc.

No es una solución perfecta porque hemos visto muchas veces vulnerabilidades debido a este sistema, varias detectadas recientemente donde un proceso corriendo en una máquina virtual puede acceder al kernel de ese sistema operativo y luego accede al kernel del equipo real. También accede a estructuras de memoria de otros procesos pudiendo leer variables, claves, etc.

Aún así se utiliza desde los inicios del S.O. para que dos procesos puedan pasarse datos, señales o interactuar entre si.

En el caso de Docker, existe una solución relativamente sencilla, es utilizar la función de compartir una carpeta del servidor “host” por dos o mas contenedores mediante el modificador “-v host:contenedor”

Aunque también es posible utilizar la funcionalidad “IPC”.

Al arrancar un contenedor, podemos utilizar el parámetro “–ipc” con estos parámetros.

"" - Utilizar el standard definido por el demonio. (puede ser private o shareable)

"none" - Permite nombres IPC de manera privada, sin tener que montar un dispositivo llamado "/dev/shm".

"private" - Permite nombres IPC.

"shareable" - Permite compartir recursos IPC con otros contenedores.

"contenedor:ID" - Permite acceder a un recurso compartido de otro contenedor.

"host" - Permite acceder a recursos IPC del host (equipo real).

Algunos ejemplos.

Arrancar un contenedor y accediendo a recursos compartidos por el equipo real.

# docker run --ipc="host" -it ubuntu /bin/bash

Compartir recursos entre dos contenedores.

(adaptación del post https://dzone.com/articles/docker-in-action-the-shared-memory-namespace)

-- Arranco el Proveedor de mensajes
# docker run -d -u nobody --name ch6_ipc_producer allingeek/ch6_ipc -producer

-- Arranco el consumidor de mensajes
# docker run -d -u nobody --name ch6_ipc_consumer allingeek/ch6_ipc -consumer

Vemos los logs de cada Contenedor

# docker logs ch6_ipc_producer

# docker logs ch6_ipc_consumer
Either the producer has not been started or maybe I cannot access the same memory...

Veremos los errores del consumidor que dicen que no puede acceder a los recursos compartidos del productor.

Ahora borraremos el segundo contenedor para regenerarlo correctamente.

# rm ch6_ipc_consumer --force

Ahora arrancamos el consumer indicando que queremos acceder a los recursos IPC del producer indicando el parámetros “container” y el “nombre del mismo”.

–ipc container:ch6_ipc_producer

# docker run -d -u nobody --name ch6_ipc_consumer --ipc container:ch6_ipc_producer allingeek/ch6_ipc -consumer

Ahora podremos ver los mensajes enviados desde el “Producer” al “Consumer”.

Aunque existe esa funcionalidad (IPC), también tenemos la posibilidad de carpetas compartidas entre contenedores, debemos identificar la necesidad que nos interese cubrir con este tipo de tecnología y las preferencias de cada desarrollador.

Quizas para desarrolladores les resuelte mejor esta solución.

# docker logs ch6_ipc_consumer
Consumed: db
Consumed: b1
Consumed: a5
Consumed: d4
Consumed: 86
Consumed: 71
Consumed: 9c
Consumed: 25
Consumed: c3
Consumed: done

Subscríbete y recibirás los últimos artículos semanalmente en tu email.