Docker es una herramienta ideal para desarrollar, probar y desplegar aplicaciones de manera uniforme. Sin embargo, existe una práctica menos común, pero extremadamente poderosa, que es utilizar Docker desde dentro de otros contenedores, una práctica conocida como Docker in Docker. ¿Por qué esto podría ser útil? Imagina que necesitas trabajar con scripts o aplicaciones que requieren levantar contenedores o interactuar con otros ya existentes. Esta capacidad es crucial para sistemas más complejos, especialmente en flujos de trabajo automatizados como CI/CD (Integración y Despliegue Continuo).
¿Cómo se logra Docker in Docker?
En un sistema Linux, donde todo es un archivo, aprovechamos el acceso al Docker daemon a través de un socket. Este socket es un archivo que se puede montar en un contenedor, permitiendo que el cliente de Docker del contenedor se comunique directamente con el Docker daemon del host.
Aquí te mostramos cómo montar un socket Docker dentro de un contenedor:
docker run -it --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ docker:19.0.3.12
docker:19.0.3.12 es la imagen oficial de Docker que contiene el cliente de Docker.
/var/run/docker.sock es el socket del Docker daemon montado en el contenedor.
¿Qué se puede hacer desde un contenedor con Docker in Docker?
Desde dentro de un contenedor con acceso al Docker daemon puedes:
Listar contenedores existentes con docker ps.
Iniciar nuevos contenedores:
docker run -d --name app <nombre_imagen>
Ejecutar comandos en otros contenedores.
Inspeccionar imágenes y contenedores.
Un ejemplo avanzado es el uso de Dive, una herramienta para explorar el contenido de las imágenes Docker sin necesidad de instalarlas en el sistema operativo nativo. Aquí mostramos cómo hacerlo desde un contenedor:
Montamos también el binario del cliente Docker del host en el contenedor.
¿Cuáles son los riesgos de Docker in Docker?
A pesar de sus beneficios, Docker in Docker no es seguro si se utiliza sin precauciones. Montar el socket del Docker daemon en un contenedor significa otorgarle un poder considerable sobre tu sistema Docker:
Riesgo de seguridad: Cualquier contenedor con acceso al socket puede ejecutar contenedores maliciosos, borrar imágenes o modificar configuraciones.
Ambiente controlado: Úsalo en entornos seguros y controlados donde puedes gestionar los riesgos, como en sistemas de desarrollo aislados.
Docker in Docker es una herramienta poderosa, pero como todo superpoder, conlleva una gran responsabilidad. Utilízalo con precaución y asegúrate de comprender completamente sus implicaciones en términos de seguridad y control del sistema. ¡Así podrás aprovechar al máximo sus capacidades sin comprometer la seguridad de tus despliegues y aplicaciones!