Entwickler Spezial 06/15

Image-Pflege: Docker Images versionieren und verwalten

Autor:

Die offene Container-Virtualisierungstechnologie Docker verleitet dazu, rasch eine Vielzahl von Images zu erstellen und daraus wiederum noch mehr Container zu starten. Dabei geht der Überblick jedoch sehr schnell verloren, wenn nicht einige Vorüberlegungen angestellt und Vorgehensweisen berücksichtigt werden.
Mithilfe von Docker können Images einfach und schnell erzeugt werden. So genannte Dockerfiles dienen dabei als „Baupläne“ und ermöglichen es, für jeden Anwendungsfall leicht das passende Image zu erzeugen. Über ein zentrales Depot – die Docker-Registry – kann es geteilt und dadurch von anderen Benutzern wieder verwendet werden. Auch die Nutzung als Basis für neue Images ist dabei möglich. Ein Oracle-JDK-Image könnte zum Beispiel auf diese Weise die Basis für ein Apache-Tomcat-Image bilden, oder ein Unternehmen nutzt ein auf die Bedürfnisse optimiertes Docker-Image als Basis für sämtliche eigene Images.
Wie man sich leicht vorstellen kann, kommt dadurch schnell eine Vielzahl von Images zusammen. Werden bestehende Images dann auch noch aktualisiert, ist ein Image-Chaos praktisch vorprogrammiert. Dieser Artikel beschreibt die Probleme, die bei der Versionierung und Aktualisierung von Images auftreten können. Ferner werden Lösungsansätze anhand von Beispielen aufgezeigt.

Docker-Tags sinnvoll nutzen

Um bei der Versionierung von Images Transparenz zu schaffen, bietet Docker einen Tagmechanismus, der eine einfache Art und Weise der Kennzeichnung von Images ermöglicht. Doch inwieweit kann dieser Tagmechanismus wirklich genutzt werden, um auch minimale Änderungen eines Docker-Images nachvollziehbar zu machen? Am Beispiel von zwei Images kann dies sehr leicht verdeutlicht werden: 1. Oracle-JDK-Image, 2. Ubuntu-Image.
Das JDK-Image stellt keine große Herausforderung dar. Das gewünschte JDK wird in dem Image installiert, und als Tag wird das JDK-Release angegeben. Somit würden dann z. B. die folgenden JDK-Images zur Verfügung stehen:

• oracle-jdk:1.7_60
• oracle-jdk:1.7_67
• oracle-jdk:1.8_20

Hier kann man sehr schön sehen, dass pro Aktualisierung eines JDK-Releases ein neues Image erstellt wird. Wie würde die Aktualisierung bei einem Ubuntu-Image aussehen? Selbstverständlich könnte auch hier das Release des Ubuntu-Images als Tag genutzt werden. Somit ergäbe sich das folgende Szenario:

• ubuntu:13.04
• ubuntu:13.10
• ubuntu:14.04

Der wesentliche Unterschied zum JDK-Image besteht darin, dass das Ubuntu-Image zwischen den Releases weitere Aktualisierungen wie z. B. Security-Patches erhält, die den Nutzern zur Verfügung gestellt werden sollen. (…)

Vollständiger Artikel