Riot Games

In diesem ersten Tutorial der Docker-Serie lernen Sie:

  • Was wir bei Riot erreichen wollen

  • Basis-Setup für Docker

  • Grundlegende Docker-Pull-Befehle

  • So führen Sie Docker-Container als Daemons aus

  • Grundlegende Jenkins-Konfigurationsoptionen

Als ich vor einem Jahr anfing, etwas über Docker zu lernen und seine Verwendung zu erforschen, hatte ich Probleme, großartige Dokumentationen und Beispiele zu finden – selbst heute beschreiben viele einfache Anwendungsfälle, die letztendlich nicht produktionsreif sind. Die Produktion von Anwendungen mit Docker-Containern erfordert die Anpassung an ihre Vergänglichkeit und den Fokus auf einen Prozess. Dies stellt Anwendungen mit Datenpersistenzanforderungen oder Multiprozessarchitekturen vor Herausforderungen.

Wie ich in meinem letzten Beitrag erwähnt habe, verwenden wir Jenkins als grundlegende Open-Source-Software, auf der wir unsere Automatisierung aufbauen. Jenkins ist auch eine großartige Anwendung, um eine Möglichkeit zu demonstrieren, über das „Andocken“ Ihrer Anwendungen nachzudenken. Wir stellen Jenkins unter Berücksichtigung dieser Architekturkomponenten bereit:

  • Jenkins Master Server (Java-Prozess)

  • Jenkins-Stammdaten (Plugins, Jobdefinitionen usw)

  • NGINX Web Proxy (wir verwenden SSL-Zertifikate usw., mit NGINX ist hier eine einfache Wahl)

  • Erstellen Sie Slave-Agenten (Maschinen, auf denen entweder SSH ausgeführt wird oder JNLP eine Verbindung zu Jenkins Master herstellt)

Dies ist ein guter Anfang. In dieser Reihe von Blogbeiträgen werde ich Möglichkeiten behandeln, all dies als Container zu betrachten, und mit einem erweiterten Blick auf Möglichkeiten zur Verwendung von Docker-Containern als Build-Slaves abschließen. Für den Anfang erstellen wir einen Jenkins-Masterserver in einem Docker-Container. Dann werden wir uns mit der Datenpersistenz befassen und einen Web-Proxy mit NGINX hinzufügen.

Diese gesamte Blogserie behandelt die folgenden Docker-Konzepte:

  • Eigene Dockerfiles erstellen

  • Bildabhängigkeiten von öffentlichen Bildern minimieren

  • Erstellen und Verwenden von Datenvolumes, einschließlich Backups

  • Erstellen von containerisierten „Build-Umgebungen“ mit Containern

  • Umgang mit „geheimen“ Daten mit Bildern und Jenkins

Wenn Sie sich das Cloudbees Jenkins Docker-Image noch nicht angesehen haben, beginnen Sie dort, da es wirklich ziemlich gut ist. Dies war mein Bezugspunkt, als ich zum ersten Mal darüber nachdachte, Jenkins in einem Docker-Container auszuführen, und für viele Leute könnte dies ausreichen. Sie finden ihre Dokumentation hier und ihre Git Repo / Dockerfile hier .

Dieser erste Blog ist in zwei Unterrichtspläne unterteilt. Jeder ist so bemessen, dass er ungefähr 30 Minuten dauert. Zunächst ist Teil eins, Ihre Entwicklungsumgebung vorzubereiten und zu lernen, mit dem von Cloudbees angebotenen Standard-Jenkins-Docker-Container zu arbeiten. In Teil zwei geht es darum, den Grundstein zu legen, um dieses Image in Ihre eigene Docker-Datei zu packen und eine elegantere Kontrolle über das Image zu übernehmen. Zusammen sollen sie Ihnen den Einstieg erleichtern, insbesondere wenn Sie noch nie mit Docker gearbeitet haben oder relativ neu in Docker sind — obwohl sie davon ausgehen, dass Sie bereits wissen und verstehen, wie man mit Jenkins arbeitet. Wenn Sie Erfahrung mit Docker haben, wird ein Teil des Materials in Lektion 1 eine Wiederholung von Dingen sein, die Sie wahrscheinlich bereits kennen.

LEKTION 1: RICHTEN SIE IHR ERSTES BILD EIN UND FÜHREN SIE ES AUS

Machen Sie sich bereit für die Rolle. Hier bei Riot arbeiten wir mit Docker (und Jenkins) unter Windows, Mac OSX und Linux. Ich arbeite lieber mit Docker unter OSX, obwohl es unter Windows seit Docker 1.6 einwandfrei funktioniert. Heutzutage gibt es ausgezeichnete Installationsprogramme für beide Betriebssysteme. Ich werde aus einer OSX-Perspektive arbeiten, aber die gleichen Tools existieren für Windows.

VORAUSSETZUNGEN:

1. Sie benötigen Windows 10 Pro oder Mac OSX Yosemite 10.10.3 (oder höher)

2. Wenn Sie Windows verwenden, müssen Sie sicherstellen, dass die Windows-Virtualisierung aktiviert ist (siehe Dokumentation von Docker)

EINE KURZE ANMERKUNG ZU KITEMATIC

Mit Docker 1.8 und der Veröffentlichung der Docker Toolbox enthält Docker jetzt „Kitematic“, ein raffiniertes GUI-Tool zur Verwaltung und Visualisierung der Vorgänge mit Ihren Docker-Images und Containern. Der größte Teil dieses Tutorials konzentriert sich auf die Verwendung von Befehlszeilenargumenten und die Arbeit mit Docker ohne die Kitematic-GUI. Dies dient dazu, Sie besser mit den zugrunde liegenden Mechanismen vertraut zu machen. Ebenso beginne ich in späteren Blogs mit der Verwendung von Compose, um mehrere Container gleichzeitig zu starten und zu stoppen.

SCHRITT 1: DOCKER INSTALLIEREN

1. Gehe zu: https://www.docker.com/docker-mac oder https://www.docker.com/docker-windows

2. Laden Sie die entsprechende Version von Docker für Ihr Betriebssystem herunter und installieren Sie sie

3. Befolgen Sie alle Setup-Anweisungen.

4. Stellen Sie sicher, dass Ihre Installation funktioniert, indem Sie die für Ihr Betriebssystem empfohlene Shell (Terminal für OSX, Powershell für Windows) öffnen, indem Sie „Docker Quickstart Terminal“ ausführen. Unter Windows ist dies eine Verknüpfung auf Ihrem Desktop. Unter OSX finden Sie es in Ihrem Ordner applications / Docker. Überprüfen Sie die folgenden Befehle und stellen Sie sicher, dass keine Fehler angezeigt werden

docker ps
docker info

5. Bevor wir etwas anderes tun, sollten wir die von Docker verwendeten Standardspeicher- und CPU-Einstellungen erhöhen. Später werden wir Jenkins optimieren, um mehr Speicher zu verwenden, und wenn wir diese Einstellungen nicht zuerst anpassen, kann Jenkins abstürzen.

  • Gehen Sie zu Ihrem Docker-Widget in Ihrer Symbolleiste und wählen Sie „Einstellungen“

  • Gehen Sie zur Registerkarte Erweiterte Konfiguration

  • Erhöhen Sie die CPU-Auslastung auf mindestens 4 Kerne

6. Erhöhen Sie die Speichernutzung auf mindestens 8 GB, vorzugsweise mehr, etwa 12 GB, um sicherzugehen (falls verfügbar)

SCHRITT 2: ZIEHEN SIE DEN CLOUDBEES JENKINS-CONTAINER

1 UND FÜHREN SIE IHN AUS. Bleiben Sie in Ihrem Docker-Terminalfenster.

2. Ziehen Sie Jenkins aus dem öffentlichen Repo, indem Sie Folgendes ausführen:

docker pull jenkins/jenkins
docker run -p 8080:8080 --name=jenkins-master jenkins/jenkins

3. Beachten Sie, dass die Meldung „Jenkins initial setup“ in Ihrem Shell-Fenster ein Kennwort für Sie generiert. Schreiben Sie das auf, wie Sie es später brauchen werden. Wenn Sie es verlieren, können Sie `docker exec jenkins-master cat /var/jenkins_home/secrets/initialAdminPassword` ausführen, während Ihr Container ausgeführt wird, um es abzurufen.

4. Öffnen Sie Ihren bevorzugten Browser und zeigen Sie auf http://localhost:8080

Bitte beachten Sie, dass Sie sehen werden, dass ich das Flag Docker –name und den Container jenkins-master – dies ist eine Konvention, die ich in diesem Blog verwenden werde. Die Benennung Ihrer Container ist eine praktische Best Practice mit drei Vorteilen:

1. Es macht sie leicht zu merken und interagieren mit

2. Docker erlaubt nicht, dass zwei Container denselben Namen haben, was Fehler wie das versehentliche Starten von zwei identischen

3 verhindert. Viele gängige Docker-Tools (wie Docker Compose) verwenden bestimmte Containernamen, daher ist es eine gute bewährte Methode, sich an die Benennung Ihrer Container zu gewöhnen.

SCHRITT 3: DIES ETWAS PRAKTISCHER MACHEN

Der vorherige Schritt startet Jenkins mit den grundlegendsten Starteinstellungen. Sie können sogar sehen, dass Jenkins eine Basiskonfiguration benötigt und Sie nach einem Administratorkennwort fragt (das Sie aus den Protokollen entnehmen können, die während des Startvorgangs auf Ihrem Bildschirm angezeigt werden). Wenn Sie wie Riot sind, ist es unwahrscheinlich, dass Sie Jenkins mit den Standardeinstellungen ausführen. Lassen Sie uns einige nützliche Optionen hinzufügen. Wir werden uns noch nicht die Mühe machen, Jenkins zu konfigurieren.

SCHRITT 3A: DAEMONIZING

Sie möchten wahrscheinlich nicht, dass Jenkins-Protokolle die meiste Zeit als Standard ausgegeben werden. Verwenden Sie also das Docker-Daemon-Flag, um den Container zu starten (-d).

1. Strg-c im Terminalfenster, in dem Ihr Container ausgeführt wird, um ihn zu stoppen

2. Führen Sie die folgenden Befehle aus

docker rm jenkins-master
docker run -p 8080:8080 --name=jenkins-master -d jenkins/jenkins

Jetzt sollten Sie nur noch eine Hash-Zeichenfolge anzeigen und an Ihr Terminal zurückgeben. Wenn Sie neu in Docker sind, ist diese Hash-Zeichenfolge tatsächlich die eindeutige ID Ihres Containers (nützlich, wenn Sie mit der Automatisierung dieser Befehle beginnen).

SCHRITT 3B: SPEICHEREINSTELLUNGEN

Wir neigen dazu, Jenkins mit einigen kräftigen Einstellungen bei Riot auszuführen. Denken Sie daran, wenn Sie die CPU / Speicher erhöht Docker früher verwendet? Dies ist der Hauptgrund, warum. Führen Sie für einen einfachen Start die folgenden Befehle aus

docker stop jenkins-master
docker rm jenkins-master
docker run -p 8080:8080 --name=jenkins-master -d --env JAVA_OPTS="-Xmx8192m" jenkins/jenkins

Das sollte Jenkins einen schönen 8 GB Speicherpool und Platz für die Garbage Collection geben.

SCHRITT 3C: ERHÖHEN DES VERBINDUNGSPOOLS

Bei Riot erhalten wir viel Datenverkehr auf unseren Jenkins-Server. Führen Sie Folgendes aus

docker stop jenkins-master
docker rm jenkins-master

Das gibt Jenkins einen schönen Basispool von Handlern und eine Kappe. Zufälligerweise haben Sie jetzt gelernt, sowohl JAVA OPTS als auch JENKINS OPTS als Umgebungsvariablen sinnvoll zu verwenden. Bitte beachten Sie, dass dies funktioniert, weil Cloudbees ihre Jenkins Dockerfile bequem strukturiert hat.

SCHRITT 4: ALLES ZUSAMMENFÜGEN

Ich habe alles, was wir hier gelernt haben, in ein einfaches Makefile eingefügt, damit Sie mit make-Befehlen die Ausführung Ihres Jenkins-Docker-Containers steuern können. Sie finden es hier:

  • https://github.com/maxfields2000/docker Jenkins_tutorial/Baum /Meister /tutorial_01

Sie können die folgenden Befehle verwenden:

  • make build – Zieht das Jenkins-Image

  • make run – Führt den Container aus

  • make stop – Stoppt den Container

  • make clean – Stoppt und löscht den vorhandenen Container

Sie müssen das Makefile nicht verwenden, ich finde es einfach einfacher, als den gesamten run Befehl einzugeben. Sie können diese stattdessen einfach in ein Skript Ihrer Wahl einfügen.

Hoffentlich sehen Sie, wie einfach es ist, mit Docker und Jenkins zum Laufen zu kommen. Ich habe versucht, Ihnen einige grundlegende Optionen zu geben, um den Standard-Cloudbees-Jenkins-Container etwas benutzerfreundlicher zu gestalten. Cloudbees bietet viele nützliche Tutorials zum Ausführen ihres Containers, z. B. zum Vorinstallieren von Plugins und zum Speichern von Jenkins-Daten.

Das bringt mich zu zukünftigen Beiträgen zu diesem Thema. Dieser Container / dieses Image ist nützlich, hat jedoch einige Nachteile: Keine konsistente Protokollierung, keine Persistenz, kein Webserver-Proxy davor und keine saubere Möglichkeit, sicherzustellen, dass Sie die gewünschte Version von Jenkins verwenden. Dies wirft Fragen auf wie: Was ist, wenn Sie sich an eine ältere Version halten möchten? Oder was ist, wenn Sie die neueste verfügbare Veröffentlichungsperiode verwenden möchten?

In der nächsten Lektion werde ich darauf eingehen, diesen Container etwas robuster zu machen. Insbesondere:

  • Erstellen einer eigenen Docker-Datei zum Umschließen der Cloudbees-Basis

  • Verschieben einiger Umgebungsvariablen in dieses neue Image

  • Erstellen eines Protokollordners, Festlegen von Berechtigungen und anderen nützlichen Jenkins-Verzeichnissen und Abrufen der Jenkins-Protokolle während der Ausführung

LEKTION 2 – Ein JENKINS-BASIS-IMAGE-WRAPPER

In der vorherigen Lektion habe ich das Einrichten einer Entwicklungsumgebung zum Ausführen von Docker besprochen und mit dem von Cloudbees bereitgestellten Jenkins-Docker-Image experimentiert. Wir fanden, dass es einfach und leicht zu bedienen war, mit einigen großartigen Funktionen aus der Box. Um Fortschritte in den von uns identifizierten Verbesserungsbereichen zu erzielen, werden in dieser Lektion folgende Docker-Konzepte behandelt:

  • Erstellen Sie Ihre eigene Dockerfile

  • Festlegen von Umgebungsvariablen in einer Dockerdatei

  • Erstellen von Ordnern und Berechtigungen in einer Dockerdatei

  • Verwenden von docker exec zum Ausführen von Befehlen für einen laufenden Container

ERSTELLEN IHRER BASIS-DOCKERDATEI

Wir möchten einige Änderungen daran vornehmen, wie Jenkins standardmäßig gestartet wird. Im letzten Blog haben wir dies behandelt, indem wir ein Makefile erstellt haben, das Argumente als Umgebungsvariablen übergeben hat. Da wir dies jedes Mal tun möchten, können wir diese einfach in unsere eigene Dockerfile verschieben. Darüber hinaus können wir mit unserer eigenen Docker-Datei die Version von Jenkins sperren, die wir verwenden, falls Cloudbees ihre aktualisiert und wir nicht bereit sind, ein Upgrade durchzuführen.

Wir machen das in vier Schritten:

1. Erstellen Sie ein Arbeitsverzeichnis

2. Erstellen Sie in Ihrem bevorzugten Texteditor eine neue Datei mit dem Namen „Dockerfile“

3. Fügen Sie der Datei Folgendes hinzu und speichern Sie sie:

FROM jenkins/jenkins:2.112LABEL maintainer=""

4. Geben Sie dann in der Befehlszeile Folgendes ein:

docker build -t myjenkins .

Was wir hier getan haben, war eine bestimmte Version des Jenkins-Images aus dem öffentlichen Docker-Repo zu ziehen. Alle verfügbaren Versionen finden Sie hier:

  • Sie können die FROM-Klausel immer auf die verfügbare Version des Images festlegen. Sie können die Version jedoch nicht einfach auf die gewünschte Version von Jenkins festlegen. Dies ist die Bildversion „Tag“ oder „Label“, und Cloudbees ist nett genug, damit sie mit der Jenkins-Version im Bild übereinstimmt. Cloudbees bietet „jenkins / jenkins“ als bequeme Möglichkeit, die neueste Version zu erhalten, oder „jenkins / jenkins: lts“, um die neueste „Long Term Support“ -Version zu erhalten. In diesem Beispiel verwende ich eine bestimmte Version. Diese Tags, die Arten von Releases kennzeichnen, sind großartig, aber wenn Sie sie verwenden, kann sich die Version von Jenkins unter Ihnen ändern, was zu Komplikationen führen kann, wenn Sie nicht bereit waren, ein Upgrade durchzuführen. Ich empfehle „Versionssperre“ als allgemeine Best Practice, wenn Sie mit Abhängigkeiten in Docker oder anderen Tools zur Abhängigkeitsverwaltung umgehen. Sie möchten, dass sich die Dinge ändern, wenn Sie es beabsichtigen, nicht vorher. Deshalb verwende ich hier eine bestimmte Version.

    TESTEN DER NEUEN DOCKERDATEI

    Wir können sehr einfach zum Image wechseln, indem wir unseren Befehl docker run folgendermaßen ändern:

    docker run -p 8080:8080 --name=jenkins-master -d --env JAVA_OPTS="-Xmx8192m" --env JENKINS_OPTS=" --handlerCountMax=300" myjenkins

    Jetzt können wir diese Umgebungsvariablen bereinigen, indem wir sie in unserer eigenen Docker-Datei ablegen.

    HINZUFÜGEN VON UMGEBUNGSVARIABLEN ZU UNSERER DOCKERDATEI

    Es ist einfach, Standardeinstellungen für Dinge wie Umgebungsvariablen zu Dockerfiles hinzuzufügen. Dies bietet auch ein schönes Stück Selbstdokumentation. Und da Sie diese beim Ausführen des Docker-Containers immer überschreiben können, gibt es wirklich keinen Nachteil.

    1. Fügen Sie in Ihrer Dockerdatei die folgenden Zeilen nach der Zeile „MAINTAINER“ hinzu:

    ENV JAVA_OPTS="-Xmx8192m"ENV JENKINS_OPTS=" --handlerCountMax=300"

    2. Speichern und erstellen Sie Ihr Image neu:

    • docker build -t myjenkins .

    docker build -t myjenkins .

    Ziemlich einfach! Sie können testen, ob es noch funktioniert, indem Sie die folgenden drei Befehle eingeben:

    docker stop jenkins-master
    docker rm jenkins-master
    docker run -p 8080:8080 --name=jenkins-master -d myjenkins

    Ihr Bild sollte sofort beginnen! Aber woher wissen Sie, dass die Umgebungsvariablen funktioniert haben? Einfach: auf die gleiche Weise würden Sie überprüfen, welche Argumente Ihre Jenkins-App normalerweise mit ps gestartet haben. Und das funktioniert auch, wenn Sie unter Windows entwickeln.

    AUSFÜHREN EINES BASISBEFEHLS FÜR IHREN CONTAINER

    Um zu bestätigen, dass die Java- und Jenkins-Optionen korrekt eingestellt sind, können wir ps in unserem Container ausführen und den laufenden Jenkins Java-Prozess mithilfe von docker exec

    docker exec jenkins-master ps -ef | grep java

    Sie sollten etwas Ähnliches sehen

    jenkins 1 0 99 21:28 ? 00:00:35 java -Xmx8192m -jar /usr/share/jenkins/jenkins.war --handlerCountMax=300

    Hieraus können Sie leicht erkennen, dass unsere Einstellungen hängen geblieben sind. docker exec ist eine einfache Möglichkeit, Shell-Befehle in Ihrem Container auszuführen, und eine unglaublich einfache Möglichkeit, sie zu überprüfen. Dies funktioniert sogar unter Windows, da der Befehl nach „exec“ in Ihrem Container ausgeführt wird und daher auf dem von Ihrem Container verwendeten Basisimage basiert.

    EINRICHTEN EINES PROTOKOLLORDNERS

    Im vorherigen Blog haben wir festgestellt, dass wir beim Ausführen unseres Containers mit dem Flag daemonize (-d) die Sichtbarkeit der Jenkins-Protokolle verloren haben. Wir möchten die integrierte Jenkins-Funktion verwenden, um einen Protokollordner festzulegen. Wir müssen dies in unserer Docker-Datei tun und dann die Protokollierungsoption an Jenkins übergeben.

    Bearbeiten wir unsere Dockerdatei erneut. Zwischen dem „BETREUER“ und der ersten ENV-Zeile fügen wir Folgendes hinzu

    RUN mkdir /var/log/jenkins

    Wir platzieren den Befehl an dieser Stelle in der Datei, um den Best Practices zu folgen. Es ist wahrscheinlicher, dass wir die Umgebungsvariablen ändern als diese Setup-Verzeichnisse, und jede Befehlszeile in einer Docker-Datei wird im Wesentlichen zu einer eigenen Image-Ebene. Sie maximieren die Wiederverwendung von Ebenen, indem Sie häufig geänderte Elemente in der Nähe des Bodens platzieren.

    Erstellen Sie jetzt Ihr Image erneut:

    docker build -t myjenkins

    Sie erhalten einen Fehler, der wie folgt aussieht

    ---> Running in 0b5ac2bce13bmkdir: cannot create directory '/var/log/jenkins': Permission denied

    Keine Sorge. Dies liegt daran, dass der Standard-Cloudbees-Container den laufenden Benutzer auf den Benutzer „Jenkins“ setzt. Wenn Sie sich ihre Dockerdatei ansehen (hier zu finden: https://github.com/ Jenkinsci/docker/blob/master/Dockerfile ), sollten Sie unten

    USER ${user}

    Diese Syntax kann etwas verwirrend sein. Es verwendet die Build- „Argumente“ von Docker, damit Sie den Benutzer definieren können. Wenn Sie die Docker-Datei weiter nachschlagen, finden Sie den Standardwert. Suchen Sie oben in der Dockerdatei nach

    ARG user=jenkins

    Dies erstellt das Argument „user“ (ARG) und setzt es auf den Jenkins-Benutzer. Auf diese Weise können Sie den Benutzernamen ändern, den Jenkins verwendet, wenn Sie docker build –build-arg somevariable=somevalue aufrufen. Beachten Sie, dass dies nur funktioniert, wenn Sie die Docker-Datei von Grund auf neu erstellen. Sie können diese Werte nicht mit einem Docker Pull oder einem docker run ändern. Sie können hier mehr über Build-Argumente lesen. Da wir in unserer FROM Klausel eine vorgefertigte Version verwenden, erhalten wir den Standardbenutzer: „jenkins“.

    Unter normalem Linux würden Sie einfach SUDO oder ein anderes Mittel verwenden, um den Ordner zu erstellen (/var/log gehört root). Zum Glück für uns Docker können wir Benutzer wechseln.

    Fügen Sie Ihrer Dockerdatei Folgendes hinzu:

    1. Vor Ihrem LAUF mkdir Zeile hinzufügen

    USER root

    2. Nach Ihrem LAUF mkdir Zeile hinzufügen

    RUN chown -R jenkins:jenkins /var/log/jenkins

    3. Nach Ihrem LAUF chown Linie hinzufügen:

    USER jenkins

    Beachten Sie, dass wir auch einen Chown-Befehl hinzufügen mussten, da der Jenkins-Benutzer in den Ordner schreiben soll. Als nächstes setzen wir root und setzen dann Jenkins zurück, damit das Verhalten der Dockerdatei erhalten bleibt.

    Erstellen Sie jetzt Ihr Image erneut:

    docker build -t myjenkins .

    Und… deine Fehler sollten weg sein.

    Wenn das Protokollverzeichnis festgelegt ist (bitte beachten Sie: Sie können diesen Ordner an einer beliebigen Stelle platzieren, wir verwenden /var/log aus Konsistenzgründen), können wir Jenkins jetzt anweisen, beim Start in diesen Ordner zu schreiben, indem wir die Umgebungsvariablen JENKINS_OPTS .

    Bearbeiten Sie in Ihrer Dockerdatei die Zeile JENKINS_OPTS wie folgt:

    • ENV JENKINS_OPTS=“–handlerCountMax=300 –logfile=/var/log/jenkins/jenkins.anmelden“

    ENV JENKINS_OPTS="--handlerCountMax=300 --logfile=/var/log/jenkins/jenkins.log"

    Erstellen Sie nun Ihr Image noch einmal

    docker build -t myjenkins .

    Testen wir unser neues Image und prüfen wir, ob wir die Protokolldatei bearbeiten können! Versuchen Sie die folgenden Befehle

    docker stop jenkins-master
    docker rm jenkins-master
    docker run -p 8080:8080 --name=jenkins-master -d myjenkins

    Bei laufendem Container können wir die Protokolldatei beenden, wenn alles funktioniert hat

    docker exec jenkins-master tail -f /var/log/jenkins/jenkins.log

    PROTOKOLLE ABRUFEN, WENN JENKINS ABSTÜRZT

    Zeit für eine Bonusrunde! Solange wir über Protokolle sprechen, stellt Docker ein interessantes Problem dar, wenn Jenkins abstürzt. Der Container wird nicht mehr ausgeführt und Docker exec funktioniert nicht mehr. Also, was tun?

    Wir werden später erweiterte Möglichkeiten zum Beibehalten der Protokolldatei besprechen. Da der Container gestoppt ist, können wir vorerst Dateien mit dem Befehl docker cp kopieren. Simulieren wir einen Absturz, indem wir den Container anhalten und dann die Protokolle abrufen:

    1. strg-c zum Beenden der Protokolldatei tail

    2. Führen Sie die folgenden Befehle aus

    docker stop jenkins-master
    docker cp jenkins-master:/var/log/jenkins/jenkins.log jenkins.log
    cat jenkins.log

    ABSCHLIEßENDE GEDANKEN

    Sie können die ganze Arbeit in meinem Tutorial Git Repo (und das aktualisierte Git Makefile) hier finden:

    • https://github.com/maxfields2000/docker Jenkins_tutorial/Baum /Meister /tutorial_02

    Indem wir unsere eigene Docker-Datei erstellt haben, die die Cloudbees-Datei umschließt, konnten wir uns das Leben ein wenig leichter machen. Wir haben einen praktischen Ort zum Speichern der Protokolle eingerichtet und gelernt, wie man sie mit dem Befehl docker exec betrachtet. Wir haben unsere Standardeinstellungen in die Docker-Datei verschoben und können diese jetzt als gutes Stück Selbstdokumentation in der Quellcodeverwaltung speichern.

    Wir haben immer noch eine Datenpersistenz-Herausforderung. Wir haben gelernt, wie man Protokolldateien aus einem angehaltenen Container zieht (praktisch, wenn Jenkins abstürzt). Aber im Allgemeinen, wenn unser Container stoppt, verlieren wir immer noch alle Arbeitsplätze, die wir geschaffen haben. Ohne Persistenz ist dieses Jenkins-Image also nur für die lokale Entwicklung und das Testen nützlich.

    Das führt uns zum nächsten Artikel. Mit unseren Grundlagen – unserem eigenen Dockerfile-Wrapper, der an eine praktische Version von Jenkins gebunden ist – können wir das Persistenzproblem lösen. Der nächste Artikel wird diese Konzepte untersuchen:

    • Jenkins Job- und Plugin-Daten beibehalten

    • Docker-Datenpersistenz mit Volumes

    • Erstellen eines Datenvolumencontainers

    • Gemeinsame Nutzung von Daten in Volumes mit anderen Containern

    Weitere Informationen finden Sie im Rest dieser Serie:

    Teil I: Denken im Container
    Teil II: Jenkins in einen Docker-Container einfügen (dieser Artikel)
    Teil III: Docker & Jenkins: Daten, die bestehen bleiben
    Teil IV: Jenkins, Docker, Proxys und Compose
    Teil V: Kontrolle über Ihr Docker-Image übernehmen
    Teil VI: Erstellen mit Jenkins in einem kurzlebigen Docker-Container
    Teil VII: Tutorial: Erstellen mit Jenkins in einem kurzlebigen Docker-Container
    Teil VIII: DockerCon Talk und die bisherige Geschichte

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.