Docker Compose v1 vs. v2: Welche Version sollte ich benutzen? Worin liegen die Unterschiede?

Als Video ansehen
Bereitgestellt über YouTube

Docker Compose v1 vs. v2: Welche Version sollte ich benutzen? Worin liegen die Unterschiede?

Ende 2021 wurde eine neue stabile Hauptversion 2 von Docker Compose veröffentlicht. Es gibt einige Unterschiede und Neuerungen. Teils kommt es zu Verwirrungen, da manche Beiträge im Internet noch Docker Compose Version 1 nutzen, andere dagegen bereits Version 2. Manche gar einen Mix aus beidem. In diesem Beitrag schauen wir uns die Unterschiede der beiden Versionen an und beantworten die Frage, welche davon ihr nutzen solltet und wie man das in der Praxis korrekt macht.

Die wichtigsten Änderungen von Docker Compose V2

Neue technische Architektur

Compose V2 wurde in Go komplett neu geschrieben. Go wurde von Google entwickelt, basiert auf dem Syntax von C, enthält aber sowohl Vereinfachungen als auch Erweiterungen. Die Sprache hebt sich durch Skalierbarkeit und Effizienz hervor. Zuvor setzte Compose auf Python, was vor allem auf schwächeren Systemen wie dem Raspberry Pi nicht unbedingt übermäßig schnell war.

An dieser Stelle hat man auch die Integration verbessert: Compose ist nun ein Plugin für Docker, statt einer eigenständigen Binary wie unter Version 1. Dadurch ändert sich der Aufruf von docker-compose zu docker compose. Man kann alternativ mit der Kompatibilitätssicht Compose Switch auch den eigenständigen docker-compose Befehl beibehalten.

Dementsprechend wird Compose nun in das Verzeichnis ~/.docker/cli-plugins abgelegt.

Yaml-Versionen entfallen: Das Format wird standardisiert

Zu Beginn einer docker-compose.yml wurde bisher üblicherweise zuerst die Version des Dateiformates angegeben. Version 2 und 3 existieren seit einiger Zeit parallel, da Version 3 hauptsächlich eine Vereinheitlichung von Compose und Swarm bringen sollte. Dafür sind einige Funktionen aus V2 nicht mehr in V3 vorhanden – unter anderem die Limitierungen der Ressourcen, wie etwa des Arbeitsspeichers. Daher hatte ich bislang empfohlen, mit Compose bevorzugt Version 2 zu nutzen.

Das Yml-Format von Compose-Dateien wurde nun spezifiziert (Quelle: compose-spec.io)

Dieses Problem wurde durch eine generelle Spezifizierung des Formats gelöst. Die version Eigenschaft wurde darin als veraltet Markiert: Sie ist nur noch informativ für die Abwärtskompatibilität zu älteren Dateien, die für Docker Compose V1 entwickelt wurden. Eine Compose Implementierung sollte gemäß dem neuen Standard diese Version nicht mehr zur Überprüfung nutzen, sondern immer die aktuellste unterstützte Version. Bei unbekannten Feldern ist eine Warnmeldung vorgesehen.

Das Format für Docker Container selbst ist bereits seit einiger Zeit in der Open Container Initative OCI genormt. Dadurch können Alternativen wie Podman oder Containerd die gleichen Funktionen implementieren und bieten damit eine Alternative zu Docker, die wenig bis gar keine Änderungen erfordern. Dafür aber eigene Vorteile mit sich bringen, Podman kommt etwa ohne Root-Rechte aus. Es ist daher sinnvoll, auch das Compose Format zu spezifizieren – zumal das die bestehenden Dateiversionen 1 und 2 vereint. Um es verwenden zu können, braucht ihr Docker Compose v2 oder mindestens Version 1.27.0.

Weitere Neuerungen der letzten Monaten

Darüber hinaus gibt es einige weitere Neuerungen in Docker Compose Version 2, darunter unter anderem Service Profiles. Man kann damit Gruppen von Diensten anlegen, um nur einzelne Dienste zu starten. Mit docker compose ls erscheint eine Übersicht aller Compose Projekt auf dem gesanten System. Wer Dateien kopieren möchte, kann das mit docker-compose cp mittlerweile auch über Compose machen. Die Ausgabe ist übersichtlicher geworden, unter anderem durch den Einsatz von Farben. Man sieht nun auch, welcher Schritt wie viel Zeit benötigt. Caching funktioniert besser, mit Version 1 hatte ich in bestimmten Konstellationen Probleme.

Eine aktuelle Übersicht der Änderungen und Neuerungen findet ihr in den offiziellen Docker Compose Release Notes (englisch).

Welche Docker Compose Version sollte ich nutzen?

Version 2 würde ich definitiv bevorzugen: Sie bietet einige Vorteile gegenüber Version 1 und wird aktiv mit Aktualisierungen versorgt. Die letzte 1.x Version 1.29.2 stammt aus dem Mai 2021. Als Übergangslösung kann man Compose-Switch verwenden. Wobei sich die Änderungen der Konsolenbefehle in Grenzen halten.

Wie installiere ich Docker Compose V2 korrekt?

Zwar ist Compose v2 wie v2 eine Binary und kann daher theoretisch einfach nach /usr/local/bin kopiert werden. Damit der Aufruf als Plugin über docker compose (also Leerzeichen statt Minus) funktioniert, muss die Binary in den Plugin-Ordner kopiert werden. Für euren lokalen Benutzer ist das $HOME/.docker/cli-plugins, wer global installieren möchte kann dafür auch einen der vier folgenden Ordner nutzen:

  • /usr/local/lib/docker/cli-plugins
  • /usr/local/libexec/docker/cli-plugins
  • /usr/lib/docker/cli-plugins
  • /usr/libexec/docker/cli-plugins

Je nachdem ob systemweit oder für euren aktuellen Benutzer installiert werden soll, legt ihr den gewünschten Ordner zunächst an. Dann sucht ihr auf der Release-Seite von Compose nach der aktuellsten stabilen Version – zum Erstellzeitpunkt dieses Beitrages war das 2.3.3. In meinem Fall ist die 64 Bit Edition vom Raspberry Pi OS auf einem Raspberry Pi 4 installiert, daher wähle ich AARCH64 für die 64 Bit ARM Architektur. Abhängig von der eingesetzten Hard- und Software könnt ihr alternativ auch ARMv7 oder ARMv6 nutzen. Die Binary wird anschließend heruntergeladen und und den Plugin-Ordner verschoben. Dabei ändern wir den Name auf docker-compose.

mkdir -p ~/.docker/cli-plugins
wget https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-linux-aarch64
mv docker-compose-linux-aarch64 ~/.docker/cli-plugins/docker-compose

Nun kann man den Aufruf als Plugin (mit Leerzeichen statt Minus) testen:

$ docker compose version
Docker Compose version v2.3.3

Dies ist die offiziell von Docker empfohlene Installationsmethode für V2, weswegen ich sie bevorzugen würde. Wer dennoch lieber die Binary nach /usr/local/bin verschiebt, kann Compose wie unter Version 1 mit Minus aufrufen. Ob Docker das dauerhaft mit allen Funktionen unterstützt, ist allerdings ungewiss.

Leave a Reply