Docker – Teil 3: Images

Nachdem wir uns nun mit Docker Containern auskennen machen wir diese Woche nochmal einen Schritt zurück und kommen auf Docker Images zu sprechen. Jeder Container basiert auf einem Image, daher sind sie natürlich auch sehr wichtig. Wie erzeugen, updaten und arbeiten wir denn nun damit?

Was ist ein Docker Image?

Ein Docker Image können wir uns als Schnappschuss des Zustands eines Containers vorstellen. Das bedeutet wenn ich einen Docker Container von einem ubuntu Image starte kann es erstmal nicht viel. Nun installiere ich innerhalb dieses Containers beispielsweise Apache2 und speichere diesen Zustand ab.
Ab sofort wird jeder Container, der von diesem Image gestartet wird, Apache2 enthalten. Die einzelnen Images bauen dabei aufeinander auf. Machen wir ein Gedankenspiel dazu:

Vorher habe ich Apache2 in meinem Image installiert. Sagen wir dieses Image nenne ich mein-apache2-server. Jetzt benötige ich eine Möglichkeit, eine Webapplikation auf verschiedenen PHP Versionen zu testen. Ich könnte nun also ein Image erzeugen, das auf mein-apache2-server aufbaut und PHP5.4 installiert – genannt mein-php54-server.
Außerdem erzeuge ich ein weiteres Image, das ebenfalls auf mein-apache2-server aufbaut und PHP5.5 installiert – genannt mein-php55-server.

Das bietet uns mehrere Vorteile:

  1. Wir können mit einem einfachen docker run Befehl blitzschnell sowohl eine virtuelle Maschine mit PHP5.4 als auch mit PHP5.5 starten und müssen uns nicht innerhalb einer Maschine mit mehreren PHP Versionen rumschlagen oder ständig eine andere PHP Version installieren
  2. Wenn wir unsere Grundlage verändern wollen (in diesem Fall zum Beispiel die Apache2 Version) können wir dies zentral im mein-apache2-server Image machen, dieses speichern und die darauf aufbauenden Images können diese Änderungen ganz einfach übernehmen. Das spart natürlich sehr viel Zeit wenn wir die Änderungen nicht in jeder virtuellen Testmaschine einzeln anpassen müssen.

Dieses einfache Beispiel zeigt uns bereits den Mehrwert einer gut durchdachten Docker Entwicklungsumgebung – und das obwohl wir erst eine Anwendung mit einem Plugin laufen lassen. Stellen wir uns das Ganze jetzt in einem echten Webumfeld mit Webserver, Datenbank, NodeJS, Plugins und ständig vielfältiger werdenden Tools vor verwundert die rasant ansteigende Beliebtheit von Docker gar nicht mehr.

Schauen wir uns noch kurz an woraus sich der Name eines Images zusammensetzt an folgendem Beispiel:

ftiersch/mein-apache2-server:0.1

Der Teil vor dem Slash (ftiersch) ist der Name bzw Account des Autors der das Image hochgeladen hat. Der Teil danach (mein-apache2-server) ist der Name des Images selbst. Zusammen bilden diese das sogenannte Repository.
Eines dieser Repositories kann mehrere Versionen eines Images enthalten. Diese Versionen werden anhand der sogenannten Tags unterschieden, welche hinter dem Doppelpunkt stehen. Geben wir kein Tag an wird automatisch der Tag latest vergeben.

Unser PHP Beispiel von weiter oben hätten wir also auch wesentlich eleganter lösen können indem wir ein Image mein-php-server anlegen und dieses mit den Tags 5.4 und 5.5 versehen – aber wir arbeiten uns ja Schritt für Schritt nach vorne. 😉

 

 

Das Arbeiten mit Docker Images

In diesem Abschnitt gehe ich kurz auf ein paar der Befehle ein, die uns bei der alltäglichen Arbeit mit Docker Images über den Weg laufen werden.

 

Images anzeigen, runterladen und wieder löschen

Zuerst schauen wir uns mal an, wie wir überhaupt sehen, welche Images bereits auf unserem Host installiert sind. Dafür benutzen wir den Befehl

docker images

Einfach, oder? Haben wir ein Image nicht installiert wird es automatisch beim Ausführen von docker run heruntergeladen.

Wollen wir ein Image manuell herunterladen (vielleicht weil wir im Firmennetzwerk kein Zugriff ins Internet haben) können wir dies problemlos mit

docker pull author/image:tag

Und zum Schluss können wir natürlich ein vorhandenes Docker Image auch wieder löschen.

docker rmi author/image:tag

Man achte hier auf das i bei rmi, der docker rm Befehl ist ja schon für das Entfernen von Containern da.

 

Images updaten und speichern

Wenn unser Image mal ein Update benötigt – zum Beispiel durch eine neue Softwareversion oder einfach eine geänderte Anforderung – können wir es ganz simpel updaten. Dafür starten wir zuerst mal einen Container von diesem Image (wie das geht haben wir im letzten Artikel gesehen). Beim Ausführen sollten wir uns die ID des Containers notieren, diese benötigen wir dann gleich.

Als nächstes führen wir alle Änderungen innerhalb des Containers durch, die wir brauchen – beispielsweise die Installation von curl mit dem Befehl apt-get install curl.

Sobald die Installation abgeschlossen ist und alles funktioniert können wir den Container mit exit verlassen.

Nun benötigen wir die oben angesprochene ID für den Befehl

docker commit -m „cURL installiert“ -a „Frank Tiersch“ CONTAINERID ftiersch/mein-test-server:2.0

Brechen wir diesen etwas längeren Befehl doch kurz in seine einzelnen Komponente runter:

  1. docker commit bedeutet, wir möchten ein Image an das repository senden.
  2. -m lässt uns einen Kommentar an diesen Commit hängen (wie bei GIT zum Beispiel auch) damit wir später wissen, was wir in welchem Commit eigentlich geändert haben
  3. -a zeigt den Autor des Commits an, damit wir in einem Team wissen, wer was gemacht hat
  4. CONTAINERID ist die vorher angesprochene ID des Docker Containers den wir davor verändert haben
  5. ftiersch/mein-test-server:2.0 ist der Name unter dem wir das neue Image abspeichern möchten. Diesen haben wir ja bereits oben in seinen Einzelheiten besprochen.

 

 

Images taggen

Als letztes noch kurz der Befehl um ein Image im nachhinein zu taggen. Wie vorher gesagt wird automatisch immer das Tag latest vergeben – das wollen wir vielleicht nicht immer, daher können wir natürlich auch manuell nur das Tag verändern ohne den Rest. Dafür benötigen wir die ID des Images die wir in der Imageliste mit docker images sehen können.

docker tag IMAGEID ftiersch/mein-test-server:neuestag

Gar nicht so kompliziert.

 

Das wars erstmal zu den Docker Images. Es gibt noch eine coolere Methode, diese Images aufzubauen und zu verwalten – die Dockerfiles. Um diese kümmern wir uns dann im nächsten Post der Serie.

Immer die neuesten Artikel zum Thema Docker? Dann folge mir einfach bei Twitter unter @AbHeuteCoden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*