Estoy ejecutando Jenkins dentro de un contenedor Docker. Me pregunto si está bien que el contenedor Jenkins también sea un host Docker. En lo que estoy pensando es en iniciar un nuevo contenedor acoplable para cada compilación de prueba de integración desde dentro de Jenkins (para iniciar bases de datos, corredores de mensajes, etc.). Por lo tanto, los contenedores deben cerrarse después de que se completen las pruebas de integración. ¿Hay alguna razón para evitar ejecutar contenedores Docker desde dentro de otro contenedor Docker de esta manera?
jenkins
docker
docker-dind
Johan
fuente
fuente
Respuestas:
Se debe evitar ejecutar Docker dentro de Docker (también conocido como dind ), si es posible, si es posible. (La fuente se proporciona a continuación.) En su lugar, desea establecer una forma para que su contenedor principal produzca y se comunique con contenedores hermanos .
Jérôme Petazzoni , el autor de la función que hizo posible que Docker se ejecute dentro de un contenedor Docker, en realidad escribió una publicación de blog diciendo que no debía hacerlo . El caso de uso que describe coincide con el caso de uso exacto del OP de un contenedor Docker de CI que necesita ejecutar trabajos dentro de otros contenedores Docker.
Petazzoni enumera dos razones por las cuales dind es problemático:
De esa publicación de blog, describe la siguiente alternativa,
fuente
sudo
hacer esto? Graciasdocker
grupo:sudo usermod -aG docker $USER
. Tendrá que volver a iniciar sesión después de eso./var/run/docker.sock
cuando ejecuta Docker para Mac en su máquina Mac./var/run/docker.sock
Respondí una pregunta similar antes sobre cómo ejecutar un contenedor Docker dentro de Docker .
Por lo tanto, ejecutar Docker dentro de Docker fue considerado por muchos como un buen tipo de solución para este tipo de problemas. Ahora, la tendencia es utilizar contenedores "hermanos" en su lugar. Vea la respuesta de @predmijat en esta página para obtener más información.
fuente
Está bien ejecutar Docker-in-Docker (DinD) y, de hecho, Docker (la compañía) tiene una imagen oficial de DinD para esto.
Sin embargo, la advertencia es que requiere un contenedor privilegiado, que según sus necesidades de seguridad puede no ser una alternativa viable.
La solución alternativa de ejecutar Docker usando contenedores hermanos (también conocido como Docker-out-of-Docker o DooD) no requiere un contenedor privilegiado, pero tiene algunos inconvenientes derivados del hecho de que está iniciando el contenedor desde un contexto que es diferente de aquel en el que se está ejecutando (es decir, inicia el contenedor desde dentro de un contenedor, sin embargo, se está ejecutando en el nivel del host, no dentro del contenedor).
Escribí un blog describiendo los pros / contras de DinD vs DooD aquí .
Dicho esto, Nestybox (una startup que acabo de fundar) está trabajando en una solución que ejecuta Docker-in-Docker de forma segura (sin usar contenedores privilegiados). Puede consultarlo en www.nestybox.com .
fuente
Sí, podemos ejecutar docker en docker, necesitaremos adjuntar el zócalo unix "/var/run/docker.sock" en el que el dacker de docker escucha de forma predeterminada como volumen al acoplador padre usando "-v / var / run /docker.sock:/var/run/docker.sock ". A veces, pueden surgir problemas de permisos para Docker Daemon Socket para el que puede escribir "sudo chmod 757 /var/run/docker.sock".
Y también requeriría ejecutar el docker en modo privilegiado, por lo que los comandos serían:
sudo chmod 757 /var/run/docker.sock
docker run --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...
fuente