Erstellen von Docker-Images
Container-Images erstellen in Docker (Tutorial für Anfänger)
Im ersten Tutorial zu Docker haben wir besprochen, wie du Container basierend auf bereits existierenden Images aus der Docker-Registry starten kannst. Dieses kurze Tutorial soll dir zeigen, wie du ein Image, passend zu deinen individuellen Anforderungen, erstellen kannst.
In diesem Beispiel-Fall wird der Container eine statische HTML-Website mit Nginx (einem Web-Server) ausführen. Der Name des Computers (oder Servers), auf dem Docker läuft, wird ganz einfach nur "Docker" genannt. Wenn du auf einen der Dienste zugreifen möchtest, dann benutze docker anstelle von localhost oder 0.0.0.0.0.
(Du benötigst kein Vorwissen zu Docker. Solltest du jedoch eine kurze Anleitung zu den Basics durchlesen wollen, findest du hier den Artikel "Docker lernen für Anfänger")
Wie funktionieren Docker-Images?
Docker-Images sindwerden einemithilfe Sammlungeines Dockerfiles erstellt. Ein Dockerfile definiert alle Schritte, die nötig sind, um ein Docker-Image zu erstellen. Deine Anwendung wird dabei so konfiguriert, dass sie bereit ist als Container gestartet zu werden.
Das eigentliche Image enthält alle Dateien, vom Betriebssystem bis hin zur Konfiguration und allen Dependencies, die du benötigst, damit deine Anwendung fehlerfrei läuft.
Alle Dateien in dem Image parat zu haben hat den Vorteil, dass du deine Umgebungen überallhin migrieren kannst. Es stellt sicher, dass deine Anwendung überall funktioniert, wo du sie ausführst.
Das Dockerfile ermöglicht es, dass Images zusammengesetzt werden können, so dass Benutzer bestehende Images erweitern können. Das hat den Vorteil, dass du deine Images nicht jedes Mal von Software,Grund Konfigurationsdateienauf undneu anderenbauen Ressourcen,musst, sobald sich kleine Änderungen ergeben. Wenn du auf einem bestehenden Image aufbaust, brauchst du nur die Schritte zur Einrichtung deiner Anwendung zu definieren. Die Basis-Images können bspw. Betriebssystem-Installationen oder bereits konfigurierte Systeme sein, die lediglich einige zusätzliche Anpassungen benötigen.
1. Ein Base-Image erstellen
Alle Docker-Images beginnen mit einem Base-Image.
Ein Base-Image ist identisch mit den Images aus der Docker-Registry, die zum AusführenStarten einervon AnwendungContainern oderverwendet eineswerden. DienstesZusammen erforderlichmit sind.dem SieImage-Namen können Docker-wir auch ein Image-Tag angeben. Dadurch kannst du z.B. angeben, welche Version eines Programmes installiert wird. Wird keine Angabe zur Version gemacht, wird standardmäßig die aktuellste Version benutzt.
Diese Base-Images werden als Grundlage für deine zusätzlichen Änderungen verwendet. In diesem Fall benötigen wir zum Beispiel eine konfigurierte und lauffähige Nginx-Version, bevor wir die statischen HTML-Dateien bereitstellen können. Wir benutzten daher Nginx als Base-Image.
Dockerfile's sind einfache Textdateien, die pro Zeile einen Befehl enthalten. Damit du ein Base-Image definieren kannst, benutzt du folgenden Befehl:
FROM nginx
Da wir Nginx benötigen, sollte unsere erste Zeile im Dockerfile wie folgt aussehen:
FROM nginx
Schreibe diese Zeile in dein Dockerfile und speichere die Datei.
Hinweis zur Versionierung von Images:
Es ist so schön einfach :latest-Tag zu verwenden, um Anwendungendie aktuelle Image-Version zu erhalten. Jedoch ist hier Vorsicht geboten. Nicht immer bekommst du die Version des Image, die auf deine Anwendung abgestimmt ist. Ich empfehle dir daher immer die spezifische Versionsnummer als Tag anzugeben.
Sobald du eine Aktualisierung vorgenommen hast, solltest du dein Dockerfile auf die entsprechende Versionsnummer abändern.
Ja, das ist mehr Aufwand, aber es schützt auch vor Kopfschmerzen durch inkompatible Versionen!
2. Befehle ausführen
Wenn du das Base-Image angegeben hast, musst du weitere Befehle definieren, um dein Image zu konfigurieren. Hier gibt es mehrere Befehle, die dir dabei helfen z.B. RUN und DiensteCOPY.
Hier eine kurze Erklärung zu RUN und COPY:
RUN <Befehl>
Der RUN-Befehl erlaubt es dir, jeden Befehl wie in einemder konsistentenKommandozeile undauszuführen. reproduzierbarenDamit Formatkannst du bspw. verschiedene Anwendungspakete installieren oder einen Build-Befehl ausführen.
Die Ergebnisse des RUN-Befehls werden im Image gespeichert, daher ist es wichtig, keine unnötigen oder temporären Dateien (z.B. Cache-Dateien) zu erstellenhinterlassen, undda zudiese bereitstellen.sonst in das Image eingebunden werden.
Es
COPY gibt<Quelle> zwei<Ziel>
Möglichkeiten, Docker-Images zu erstellen:
Mit einemCOPY Dockerfile:kannst Eindu Dateien aus dem Verzeichnis, in dem sich dein Dockerfile befindet, in das Image des Containers kopieren. Das ist besonders nützlich für Quellcode und Assets, die du in deinem Container bereitstellen möchtest.
Hier eine Textdatei,einfache Übung zum COPY-Befehl:
Um etwas Praxis-Erfahrung zu bekommen führe Folgendes aus.
Erstelle eine .html Datei z.B. index.html und fülle sie mit etwas Inhalt. Diese Datei wollen wir im Anschluss in unserem Container bereitstellen.
Benutze in der nächsten Zeile den Befehl COPY Befehl, um die dieindex.html Schrittein beschreibt,das Nginx-Verzeichnis /usr/share/nginx/html zu kopieren.
Hast du das gemacht? Gut! Dann geht es jetzt weiter mit der Freischaltung der Ports.
3. Ports freigeben (öffnen)
Wenn die zumDateien Erstellenin einesunser ImagesImage erforderlichkopiert sind.wurden und die Dependencies heruntergeladen sind, musst du noch den Port definieren. Genauer gesagt musst du spezifizieren, auf welchem Port die Anwendung zugänglich sein wird.
Dafür benutzt du den Befehl EXPOSE enthältist Anweisungenauch zummöglich Herunterladengleich vonmehrere Software,Ports zumeinem Kopiereneinzigen vonBefehl Dateienzu unddefinieren.
Docker-Beispiel, Konfigurierenum vonmehrere Umgebungsvariablen.Ports Manuellfreizugeben:
EXPOSE 80
Wenn du diesen Schritt nachmachen möchtest, dann gib mit dem Befehl docker commit: Mit diesemobigen Befehl können Sie ein Image aus einem laufenden Container erstellen.
Erstellen eines Images mit einem Dockerfile
Um ein Image mit einem Dockerfile zu erstellen, erstellen Sie zunächst eine Textdatei mit der Endung .dockerfile. In dieser Datei geben Sie die folgenden Anweisungen ein:
Anweisung FROM
FROM ubuntu:latest
Anweisung RUN
RUN apt-get update && apt-get install -y nginx
Anweisung EXPOSE
EXPOSE 80
Anweisung CMD
CMD ["nginx", "-g", "daemon off;"]
Dieses Dockerfile basiert auf dem Ubuntu-Basisimage und installiert den nginx-Webserver. Es legt auch den Port 80 fürfrei. den Webserver offen und startet den Webserver beim Starten des Images.
Nachdem Sie ein Dockerfile erstellt haben, können Sie es mit dem Befehl docker build in ein Image umwandeln. Führen Sie den folgenden Befehl aus, um das Image zu erstellen, das wir im Beispiel oben definiert haben:
docker build -t my-webserver .
Dieser Befehl erstellt ein Image mit dem Namen my-webserver.
Erstellen eines Images manuell mit dem Befehl docker commit
Um ein Image manuell mit dem Befehl docker commit zu erstellen, starten Sie zunächst einen Container mit der Software, die Sie in Ihrem Image verwenden möchten. Führen Sie den folgenden Befehl aus, um einen Container mit dem nginx-Webserver zu starten:
docker run -d -p 80:80 nginx
Dieser Befehl startet einen Container mit dem nginx-Webserver und bindet denDer Port 80 desmuss Containersgeöffnet ansein, dendamit Portunser 80Webserver des(Nginx) Hostsystems.verfüg
Sobald der Container gestartet ist, können Sie ihn mit dem Befehl docker commit in ein Image committen. Führen Sie den folgenden Befehl aus, um ein Image mit dem Namen my-webserver aus dem laufenden Container zu erstellen:
docker commit -m "My custom webserver" my-webserver
Dieser Befehl erstellt ein Image mit dem Namen my-webserver. Das Image enthält die Software, die im Container ausgeführt wird, sowie die Einstellungen des Containers.
Nach dem Erstellen eines Images
Nachdem Sie ein Image erstellt haben, können Sie es mit dem Befehl docker run starten. Führen Sie den folgenden Befehl aus, um das Image, das wir im Beispiel oben erstellt haben, zu starten:
docker run -p 80:80 my-webserver
Dieser Befehl startet einen Container mit dem nginx-Webserver und bindet den Port 80 des Containers an den Port 80 des Hostsystems.
Sie können ein Image auch mit dem Befehl docker push in den Docker Hub hochladen. Dies ermöglicht es Ihnen, das Image mit anderen zu teilen.
Weitere Informationen
Weitere Informationen zum Erstellen von Docker-Images finden Sie in der Docker-Dokumentation: https://docs.docker.com/engine/reference/commandline/build/.