2016-03-27 12 views
1

Ich arbeite mit Docker und jenkins, und ich versuche, zwei Hauptaufgaben zu tun:Docker und jenkins

  1. Steuerung und Verwaltung von Docker Bilder und Container (run/Start/Stopp) mit jenkins.
  2. Richten Sie eine Entwicklungsumgebung in einem Docker-Image ein und erstellen und testen Sie dann meine Anwendung, die sich im Container befindet, mit jenkins.

Während ich das Surfen im Netz habe ich viele Lösungen gefunden:

  • Run jenkins als Container und verknüpfen sie mit anderen Behältern.
  • Führen Sie jenkins als Dienst aus und verwenden Sie die bereitgestellten jenkins plugins, um docker zu unterstützen.
  • Führen Sie Jenkins in den Container, die die Entwicklungsumgebung enthalten.

Also meine Frage ist, was ist die beste Lösung, oder Sie können einen anderen Ansatz vorschlagen.

Eine weitere Frage, die ich über das Ausführen eines Containers in einem Container gehört habe. Ist es eine gute Übung oder besser, es zu vermeiden?

+0

See: http://stackoverflow.com/questions/36088227/how-to-run-a-docker-command-in-jenkins-build-execute-shell/ –

+0

Ok, danke . Aber weißt du, welcher Ansatz besser ist, benutze Jenkins als Daemon oder als Container? –

Antwort

4

Jenkins als Container-Service zu betreiben, ist keine schwierige Aufgabe. Es gibt viele Bilder, die genau das ermöglichen. Es dauerte nur ein paar Minuten, um Jenkins 2.0-Beta-1 in einem Container laufen zu lassen, kompiliert von Quelle (Bild kann here gefunden werden). Besonderheit Ich mag diesen Ansatz, Sie müssen nur sicherstellen, dass Sie ein Datenvolumen oder einen Datencontainer als jenkins_home verwenden, um Ihre Daten persistent zu machen.

Etwas kniffliger wird es, wenn Sie diese Jenkins - in einem Container - zum Erstellen und Verwalten von Containern verwenden wollen. Um dies zu erreichen, müssen Sie etwas implementieren, das als docker-in-docker bezeichnet wird, da Sie innerhalb des Jenkins-Containers einen Docker-Daemon und -Client benötigen.

Es gibt ein sehr gutes Tutorial, das erklärt, wie man es macht: Docker in Docker with Jenkins and Supervisord.

Grundsätzlich müssen Sie die beiden Prozesse (Jenkins und Docker) im Container ausführen, indem Sie etwas wie Supervisord verwenden. Es ist machbar und verspricht eine gute Isolation, etc ... Aber kann wirklich schwierig sein, weil der Docker-Daemon selbst einige Abhängigkeiten hat, die auch im Container vorhanden sein müssen. Also, nur mit Supervisord und die Ausführung beider Prozesse ist nicht genug, müssen Sie das DIND Projekt selbst verwenden, um es funktionieren zu lassen ... Und Sie müssen den Container im privilegierten Modus ausführen ... UND Sie ' ll müssen mit einigen seltsamen DNS-Probleme beschäftigen ...

Für meinen persönlichen Geschmack klang es zu viel Umgehungslösungen, um etwas einfach zu arbeiten und zwei Dienste in einem Container laufen scheint Docker gute Praktiken und das Prinzip der Trennung zu brechen von Sorgen, etwas, das ich gerne vermeiden würde.

Meine Meinung ist noch stärker geworden, als ich das las:.. Es ist erwähnenswert, dass dieser letzte Beitrag vom DIND-Autor selbst stammt, also verdient er etwas Aufmerksamkeit.

Meine endgültige Lösung ist: Jenkins als Containerdienst ausführen, ja, aber den Docker-Daemon als Teil der Bereitstellung des zugrunde liegenden Servers betrachten, auch weil Docker-Cache und Bilder Daten sind, die Sie wahrscheinlich beibehalten möchten und sie sind vollständig im Besitz und unter Kontrolle des Daemon.

Mit diesem Setup, alles, was Sie tun müssen, ist die Docker-Dämon-Steckdose in Ihrem Jenkins Bild montieren (die die Docker Client auch braucht, aber nicht den Dienst):

$ docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v local/folder/with/jenkins_home:/var/jenkins_home namespace/my-jenkins-image 

Oder mit einer Docker-compose volumes Richtlinie:

--- 
version: '2' 

services: 
    jenkins: 
    image: namespace/my-jenkins-image 
    ports: 
     - '8080:8080' 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
     - local/folder/with/jenkins_home:/var/jenkins_home 

# other services ... 
+0

vielen Dank. –

+0

@JachkE, wenn dies für Sie funktioniert, akzeptieren Sie bitte die Antwort, ok? –

+0

Wenn ich in einem Andock-Container jenkins habe, erhalte ich einige Berechtigungsprobleme, wenn ich Code aus einem privaten Repository auf Bitbucket abrufen möchte. Ich denke, es hat etwas damit zu tun, dass der root-Benutzer den Andock-Container @ VictorSchröder – David