¿Está bien ejecutar la ventana acoplable desde la ventana acoplable?

185

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?

Johan
fuente
11
Otra posibilidad es montar el zócalo del acoplador desde el host como un volumen en el contenedor. Eso le permite crear contenedores "hermanos" y tiene la ventaja de poder reutilizar el caché.
Adrian Mouat
44
Descubrí que cuando uso el socket docker del host que en los casos en que quiero montar volúmenes externos es necesario establecer la ruta del volumen en relación con el host, ya que es donde se ejecuta el demonio docker. Establecerlo en relación con el contenedor que inicia los contenedores no funcionará necesariamente a menos que las rutas coincidan.
Jakob Runge

Respuestas:

224

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:

  1. No coopera bien con los módulos de seguridad de Linux (LSM).
  2. Crea una falta de coincidencia en los sistemas de archivos que crea problemas para los contenedores creados dentro de los contenedores principales.

De esa publicación de blog, describe la siguiente alternativa,

[La] forma más simple es simplemente exponer el zócalo Docker a su contenedor CI, montándolo con la -vbandera.

En pocas palabras, cuando inicie su contenedor CI (Jenkins u otro), en lugar de piratear algo junto con Docker-in-Docker, comience con:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

Ahora este contenedor tendrá acceso al zócalo Docker y, por lo tanto, podrá iniciar contenedores. Excepto que en lugar de iniciar contenedores "secundarios", comenzará contenedores "hermanos".

predmijat
fuente
1
¿Cómo ejecutar comandos de Docker sin sudohacer esto? Gracias
c4k
3
Es necesario agregar usuario a dockergrupo: sudo usermod -aG docker $USER. Tendrá que volver a iniciar sesión después de eso.
predmijat
2
¿Cómo volver a iniciar sesión desde un cointainer?
thiagowfx
1
@AlexanderMills Es lo mismo porque el zócalo de la ventana acoplable también se encuentra /var/run/docker.sockcuando ejecuta Docker para Mac en su máquina Mac.
Bruce Sun
1
¿Qué hay de las ventanas? no tengo/var/run/docker.sock
Abdelhafid
54

Respondí una pregunta similar antes sobre cómo ejecutar un contenedor Docker dentro de Docker .

Ejecutar Docker dentro de Docker es definitivamente posible. Lo principal es que runel contenedor externo tenga privilegios adicionales (comenzando con --privileged=true) y luego instale docker en ese contenedor.

Consulte esta publicación de blog para obtener más información: Docker-in-Docker .

Un caso de uso potencial para esto se describe en esta entrada . El blog describe cómo construir contenedores acoplables dentro de un contenedor acoplable Jenkins.

Sin embargo, Docker dentro de Docker no es el enfoque recomendado para resolver este tipo de problemas. En cambio, el enfoque recomendado es crear contenedores "hermanos" como se describe en esta publicación

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.

wassgren
fuente
Vea el comentario a continuación sobre cómo evitar la ventana acoplable en la ventana acoplable.
Dan Poltawski
6

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 .

ctalledo
fuente
0

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 ...

Renu Saini
fuente