Perché Docker-in-Docker è considerato negativo?


21

Nell'agosto 2013 Jérôme Petazzoni ha creato Docker in Docker, dindin breve, ciò ha permesso di creare container Docker all'interno di Docker Containers, questa funzionalità si è rivelata molto popolare con il risultato che il repository GitHub di Jérôme ha ricevuto oltre mille stelle e trecento forchette.

A partire da Docker 1.8, rilasciato due anni dopo nell'agosto 2015, Docker in Docker è supportato direttamente da Docker immediatamente. Tuttavia, l'uso di Docker in Docker viene fornito con un avviso, apparentemente correlato al post di Jérôme: utilizzare Docker-in-Docker per il tuo CI o l'ambiente di test? Pensa due volte. che si concentra sui motivi per cui Docker in Docker non è un'ottima scelta per l'integrazione continua.

Perché è considerato male usare Docker in Docker? È semplicemente un caso per evitare le tartarughe fino in fondo? o considerazioni sulle prestazioni?

Tartarughe fino in fondo!


Non ho familiarità con la finestra mobile oltre a averne letto. Ma a pensarci bene, sembra che tu abbia il sistema operativo host sull'hardware, che l'host carica un contenitore, quindi quel contenitore ne carica un altro. Sembra un sacco di spese generali dato che l'idea è quella di distribuire un'immagine. Un'immagine di un'immagine di un'immagine ... Interessata anche alle risposte effettive a questo q.
Nessun rimborso Nessun

Stai collegando la risposta alla tua domanda ... o mi sto perdendo qualcosa?
AnoE

Risposte:


16

Preoccupazioni per l'integrazione continua

In breve: Docker in Docker (dind) non gestisce bene la concorrenza.

Il motivo per cui non dovresti usare dind per CI è perché Docker è stato progettato per avere accesso esclusivo alla directory che usa per l'archiviazione (normalmente /var/lib/docker). Dind non lo rispetta poiché tutti i processi figlio utilizzano questa directory contemporaneamente. Ogni volta che esegui la ricostruzione (ad esempio da CI), qualsiasi cosa correlata alla tua app in questa directory potrebbe essere cancellata e forzata a partire da zero. Come piacerebbe ai tuoi utenti se inserissero i loro dettagli di pagamento, facessero clic su "Acquista" e si ritrovassero improvvisamente nella schermata di accesso come se non avessero mai fatto nulla? Non è proprio una buona UX. Si verificano due ricostruzioni contemporaneamente? Questo finirà davvero male per tutti i soggetti coinvolti (inclusa l'integrità dei dati).

Altre preoccupazioni

Dal collegamento pubblicato dall'OP, sorgono problemi di sicurezza poiché il sistema proverà ad applicare le politiche di sicurezza in modo molto "simile a CSS" in cui un contenitore inferiore potrebbe avere accesso alle risorse di un contenitore esterno se non esplicitamente vietato. Ricordi quando potresti accedere alle risorse del web server facendo qualcosa del tipo "mywebsite.com/../another_folder/private_resource.txt"? Inoltre, a volte i filesystem non giocano bene l'uno con l'altro quando sono nidificati in questo modo.

La correzione

Per fortuna, il post sul blog nell'OP ha una buona soluzione al problema. A meno che le vostre esigenze non siano soddisfatte da "build / run / push container Docker dal sistema stesso CI in esecuzione su Docker", è possibile utilizzare la -vmodalità (aggiungere un volume di dati al contenitore) sul socket Docker (in genere /var/run/docker.sock:/var/run/docker.sock) per consentire il tipo di l'accesso è necessario al volume di dati "condiviso". Questi contenitori verranno avviati insieme al genitore, anziché al di sotto, forzando l'IO sincrono. Ora hai la stessa cosa (quasi) di dind ma senza i lati negativi che derivano dal fatto che Docker non è stato creato per la concorrenza.

Riferimento (dall'OP): utilizzo di Docker-in-Docker per il CI o l'ambiente di test? Pensa due volte.


Ecco un esempio di approccio (scarabocchio) descritto per Jenkins, ma diversi problemi segnalati durante l'utilizzo hub.docker.com/r/psharkey/jenkins-dood
rombob

Da questa spiegazione non riesco ancora a capire se dind debba essere evitato nel mio caso ... Il mio agente di build viene eseguito in un contenitore docker e procede come segue: 1. Checkout repo.2. Start container & mount repo.3. Run some build-/test script inside container.Per agente, ce n'è sempre solo uno " dind'-container in esecuzione. Ci sono ancora problemi con dind in questo caso d'uso?
helmesjo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.