Ich führe Jenkins in einem Docker-Container aus. Ich frage mich, ob es in Ordnung ist, wenn der Jenkins-Container auch ein Docker-Host ist. Ich denke darüber nach, für jeden Integrationstest-Build in Jenkins einen neuen Docker-Container zu starten (um Datenbanken, Nachrichtenbroker usw. zu starten). Die Container sollten daher nach Abschluss der Integrationstests heruntergefahren werden. Gibt es einen Grund, Docker-Container nicht auf diese Weise aus einem anderen Docker-Container heraus auszuführen?
jenkins
docker
docker-dind
Johan
quelle
quelle
Antworten:
Das Ausführen von Docker in Docker (auch bekannt als dind ) sollte nach Möglichkeit vermieden werden, wenn dies überhaupt möglich ist. (Quelle unten angegeben.) Stattdessen möchten Sie eine Möglichkeit für Ihren Hauptcontainer einrichten, um Geschwistercontainer zu produzieren und mit ihnen zu kommunizieren .
Jérôme Petazzoni - der Autor der Funktion, die es Docker ermöglichte, in einem Docker-Container zu laufen - schrieb tatsächlich einen Blog-Beitrag, in dem er sagte, er solle es nicht tun . Der von ihm beschriebene Anwendungsfall entspricht dem genauen Anwendungsfall des OP für einen CI Docker-Container, der Jobs in anderen Docker-Containern ausführen muss.
Petazzoni nennt zwei Gründe, warum Dind problematisch ist:
In diesem Blog-Beitrag beschreibt er die folgende Alternative:
quelle
sudo
tun? Vielen Dankdocker
Gruppe hinzufügen :sudo usermod -aG docker $USER
. Danach müssen Sie sich erneut anmelden./var/run/docker.sock
wenn Sie Docker für Mac auf Ihrem Macos-Computer ausführen./var/run/docker.sock
Ich habe zuvor eine ähnliche Frage zum Ausführen eines Docker-Containers in Docker beantwortet .
Das Ausführen von Docker in Docker wurde von vielen als eine gute Lösung für diese Art von Problemen angesehen. Jetzt geht der Trend dahin, stattdessen "Geschwister" -Container zu verwenden. Weitere Informationen finden Sie in der Antwort von @predmijat auf dieser Seite .
quelle
Es ist in Ordnung, Docker-in-Docker (DinD) auszuführen, und tatsächlich hat Docker (das Unternehmen) ein offizielles DinD-Image dafür.
Die Einschränkung besteht jedoch darin, dass ein privilegierter Container erforderlich ist, der je nach Ihren Sicherheitsanforderungen möglicherweise keine praktikable Alternative darstellt.
Die alternative Lösung zum Ausführen von Docker mithilfe von Geschwistercontainern (auch bekannt als Docker-out-of-Docker oder DooD) erfordert keinen privilegierten Container, weist jedoch einige Nachteile auf, die sich aus der Tatsache ergeben, dass Sie den Container in einem bestimmten Kontext starten unterscheidet sich von dem, in dem es ausgeführt wird (dh Sie starten den Container aus einem Container heraus, aber er wird auf Hostebene ausgeführt, nicht innerhalb des Containers).
Ich habe hier einen Blog geschrieben, in dem die Vor- und Nachteile von DinD vs DooD beschrieben werden .
Trotzdem arbeitet Nestybox (ein Startup, das ich gerade gegründet habe) an einer Lösung, die echten Docker-in-Docker sicher ausführt (ohne privilegierte Container zu verwenden). Sie können es unter www.nestybox.com überprüfen .
quelle
Ja, wir können Docker in Docker ausführen. Wir müssen das Unix-Socket "/var/run/docker.sock" anhängen, auf dem der Docker-Dämon standardmäßig als Volume dem übergeordneten Docker mit "-v / var / run" zuhört /docker.sock:/var/run/docker.sock ". Manchmal können Berechtigungsprobleme für Docker-Daemon-Sockets auftreten, für die Sie "sudo chmod 757 /var/run/docker.sock" schreiben können.
Außerdem müsste der Docker im privilegierten Modus ausgeführt werden, sodass die Befehle wie folgt lauten:
sudo chmod 757 /var/run/docker.sock
Docker-Lauf --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...
quelle