Container in der CI/CD-Pipeline verwenden Docker-Images mit Jenkins erstellen

Von Thomas Joos

Anbieter zum Thema

Jenkins ermöglicht Entwicklern das Erstellen von Container Images in CI/CD-Pipelines. Damit lassen sich Images auch zwischen Umgebungen übertragen. Wie Erstellung und Konfiguration ablaufen, zeigen wir hier.

Mit Jenkins lassen sich eigene Docker-Images erstellen und in verschiedene Umgebungen übertragen.
Mit Jenkins lassen sich eigene Docker-Images erstellen und in verschiedene Umgebungen übertragen.
(Bild: alevision.co (bearbeitet) / Unsplash )

Die Arbeit mit Jenkins funktioniert prinzipiell auch auf Basis von Docker-Containern, was insbesondere die Bereitstellung vereinfacht. Natürlich lassen sich auch andere Bereitstellungsszenarien für Jenkins nutzen.

Wichtig ist beim Einsatz von Jenkins mit Docker nur, dass die Umgebungen miteinander kommunizieren können. Da die Kommunikation über das Netzwerk stattfindet, ist das zwar auch ohne Docker-Container problemlos umsetzbar, mit gestaltet sich der Vorgang aber grundlegend einfacher.

Jenkins lässt sich zusammen mit Docker auf Ubuntu-Servern zum Beispiel mit den folgenden Befehlen installieren:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
docker run -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11

Das ist natürlich nur ein Beispiel. Es gibt viele weitere Möglichkeiten, Jenkins in Betrieb zu nehmen.

Das ist bei der Verwendung von Jenkins mit Docker wichtig

Für die Verbindung zwischen Jenkins und Docker spielt generell nur das Docker-Plug-in eine Rolle. Die Installation des Plug-ins kann einfach über die Steuerung der Plug-ins im Jenkins-Dashboard erfolgen. Wichtig ist zu beachten, dass das Plug-in keinen Docker-Deamon darstellt. Das Plug-in sorgt nur für die Verbindung zwischen Docker und Jenkins.

Der Betrieb erfordert eine unabhängige Docker-Anbindung. Das Plug-in wird über die URI der Docker-Umgebung angebunden. Jenkins unterstützt auch die Anbindung mehrerer Docker-Hosts. Hier besteht die Möglichkeit, entweder mit Docker Swarm zu arbeiten oder jeden einzelnen Host als eigene Cloud im Docker-Plug-in in Jenkins einzubinden. Das erfolgt über die Weboberfläche von Jenkins. Die Anleitung dazu ist über den Download des Plug-ins zu finden.

Interaktion von Jenkins mit der Container-Umgebung

Unabhängig vom Betrieb der Jenkins-Umgebung in Containern lassen sich mit Jenkins eigene Docker-Images erstellen und in verschiedene Umgebungen übertragen. Das funktioniert sogar innerhalb eigener Projekte in Jenkins. Hierfür ist das Docker-Plug-in for Jenkins vonnöten, das kostenlos auf der Jenkins-Webseite zum Download bereitsteht.

Die Integration kann direkt im Dashboard von Jenkins erfolgen. Hier lassen sich alle notwendigen Einstellungen in der grafischen Oberfläche vornehmen. Die erste Anmeldung am Dashboard erfolgt nach der Installation mit dem Benutzernamen „admin“. Das Standardkennwort kann im Linux-Terminal mit dem folgenden Befehl angezeigt werden:

docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword

Sobald das Plug-in konfiguriert ist, muss es noch an die Umgebung mit Docker angepasst werden. Das funktioniert am besten ebenfalls im Dashboard von Jenkins. Im Plug-in wird dazu eine neue Cloud hinzugefügt und die URI des Docker-Hosts angegeben. An der angegebenen Adresse startet Jenkins einen Container für die Verbindung mit Docker. Die Verbindung kann an dieser Stelle auch getestet werden.

Jenkins mit Docker verbinden

Die Verbindung zwischen Docker und Jenkins erfolgt über das Docker-Plug-in.
Die Verbindung zwischen Docker und Jenkins erfolgt über das Docker-Plug-in.
(Bild: Joos / Docker )

Wenn sich Docker auf einem anderen Gerät befindet, was in produktiven Umgebungen der Normalzustand ist, muss darauf geachtet werden, dass in der Docker-Konfiguration der TCP-Port geöffnet ist, über den Jenkins kommuniziert. Das erfolgt zum Beispiel in der Docker-Konfigurationsdatei über folgende Zeile:

DOCKER_OPTS="-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock"

Die Datei befindet sich normalerweise in den Verzeichnissen „etc/init/docker.conf“, „/etc/default/docker“ oder „/etc/default/docker.io“. Im Dashboard von Jenkins erfolgt die Anbindung an Docker über das Hinzufügen einer neuen Cloud bei „System Configuration“.

Damit Jenkins eigene Images erstellen kann, ist auf dem Docker-Host ein Container notwendig. Auf dem Container muss das JDK installiert sein sowie ein sshd-Server über den die Kommunikation läuft. Als Vorlage kann „jenkins/ssh-agent“ dienen. Die Authentifizierung zwischen Jenkins und dem Container läuft über einen SSH-Key. Dieser wird dem Container beim Starten mitgegeben, sodass sich Jenkins ohne Authentifizierung über den Container mit der Docker-Umgebung verbinden kann.

Images in Jenkins erstellen

Vor dem Erstellen von Images mit Jenkins, sollte zunächst die Verbindung zwischen Docker und Jenkins über das Plug-in getestet werden. Dazu steht die Schaltfläche „Test Connection“ zur Verfügung, die über die Konfiguration des Plug-ins im Jenkins-Dashboard zur Verfügung steht.

Funktioniert die Verbindung, kann die Erstellung auch über ein neues Jenkins-Projekt getestet werden. Im Rahmen der Erstellung eines neuen Projektes kann bei „Execute Shell“ die Verbindung zu Docker überprüft und über ein Docker-File kann hier aus einem Projekt heraus ein neuer Docker-Container erstellt werden.

Über die Shell stehen auch die verschiedenen Docker-Befehle zur Verfügung. Auch die Anzeige der vorhandenen Images kann mit dem Standard-Befehl „docker images“ erfolgen. Neue Images lassen sich in der Shell mit „docker build“ erstellen und auch gleich mit einem Tag versehen, mit dem klar wird, dass die Erstellung direkt aus Jenkins heraus vorgenommen wurde. Wenn alle Einstellungen vorgegeben sind, kann aus dem Jenkins-Dashboard heraus mit „Build Now“ das Image direkt in Docker erstellt werden.

Bei diesem Vorgang verbindet sich Jenkins per SSH mit dem vorbereiteten Agenten auf dem Docker-Host und erstellt das Image auf Basis der Vorgaben im Docker-File. Die Aktionen lassen sich mit „docker logs“ überprüfen. Nach der erfolgreichen Erstellung ist das Image in kurzer Zeit auf dem Docker-Host oder in Docker Swarm verfügbar. Das lässt sich wiederum mit „docker images“ überprüfen.

Wichtige Basis für neue Images sind Docker-Files. Diese sollten daher möglichst so erstellt werden, wie es von den Docker-Entwicklern empfohlen wird. Die Vorgehensweise dazu ist auf der Seite „Best practices for writing Dockerfiles“ beschrieben.

(ID:47957276)