Vor etwas längerer Zeit habe ich bereits hier auf dem Blog einen ganz kurzen Artikel zum Thema Docker Compose geschrieben. Da ich im Bezug auf Docker Compose immer wieder Fragen bekomme, möchte ich nun einen kleinen Docker Compose Guide schreiben und diesen mit den Fragen von Lesern immer mehr erweitern. Falls ihr also Fragen zu dem Thema habt, gerne direkt in die Kommentare.
Inhaltsverzeichnis
Was ist Docker Compose?
Bei Docker Compose handelt es sich um ein Tool, womit man sogenannte Multi-Container Anwendungen realisieren kann. Was heißt das aber jetzt genau?
Als Beispiel zur Erläuterung nehmen wir mal eine Website (wie z.B. ein WordPress Blog). Eine Webseite besteht für gewöhnlich aus mindestens zwei Applikationen: Einer Datenbank und eine Webserver. Diese beiden Anwendungen kann man z.B. Auf demselben Server laufen lassen, oder auf unterschiedlichen Server.
Dasselbe funktioniert auch mit Containern. Man kann einen Datenbank und einen Webserver Container starten. Man bekommt diese auch dazu, miteinander zu kommunizieren und kann so auch mit zwei einzelnen Docker Containern eine Webseite realisieren.
Mit Docker Compose würde man jetzt nicht jeden der beiden Container einzeln erstellen und über die Startparameter die Verbindung zwischen den Container herstellen, sonder man schreibt ein Start-Skript (Docker Compose File), welches beide Container startet und die Verbindungsparameter zwischen den Container gleich mit einrichtet.
Bei einer Anwendung mit nur zwei Containern macht das vielleicht noch nicht so viel Sinn. Aber die meisten Anwendungen (vor allem in der Microservice Architektur) haben deutlich mehr Container. Hier ist ein allgemeines Startskript für das komplette Setup durchaus sinnvoll.
docker-compose.yml
Um nun eine Multi-Container Anwendung mit Docker Compose zu realisieren, braucht man eine Datei mit dem Namen docker-compose.yml.
Um den Aufbau der Datei besser zu verstehen, zeige ich dir erstmal, wie man einen einzelnen Container mittels Docker Compose startet. Dafür kann der folgende Code in die docker-compose.yml Datei kopiert werden.
1 2 3 4 | version: "3.9" services: test_service: image: "hello-world" |
Die docker-compose.yml startet immer mit dem festlegen der verwendeten Version. Dabei handelt es sich um die Version des Docker Compose Befehlssatzes und nicht um die eigentliche Docker Version.
In Zeile zwei starten wir den Bereich Services. In diesem Block können nun verschiedene Services definiert werden. In der dritten Zeile definieren wir den Service test_service und weisen diesem in der vierten Zeile das Docker Image hello-world zu.
Damit ist nun der einfachste Aufbau dieser Datei einmal erklärt. Als nächstes können wir das ganze einmal starten. Dafür verwendet man den folgenden Befehl:
1 | docker-compose up |
Nun werden als erstes die noch nicht auf dem System hinterlegten Images heruntergeladen. Anschließend sieht man im Terminal die Standardausgabe des hello-world Docker Images.
Schauen wir uns nun kurz an, welchen Namen der Docker Container bekommen hat. Dafür gibt man einfach docker ps -a im Terminal ein. Die Ausgabe sieht dann wie folgt aus:
1 2 3 | docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5529d1129c2b hello-world "/hello" 10 minutes ago Exited (0) 10 minutes ago docker-compose-article_test_service_1 |
Wie man sieht, hat der Docker Container einen recht langen Namen bekommen. Dieser setzt sich wie folgt zusammen.
Beispiel für 2 Container mit couchdb und Python FLASK
Als nächstes Beispiel zeige ich euch mal ein zwei Container Setup. Dabei wird ein Image von Dockerhub verwendet (couchdb) und als zweiten Container nehmen wir ein selbst erstelltes Docker Images welches beim Starten mit Docker Compose automatisch gebaut wird.
1 2 3 4 5 6 | couchdb-python/ ├── api │ ├── dockerfile │ └── src │ └── app.py └── docker-compose.yml |
In das oberste Verzeichniss kommt die docker-compose.yml Datei. Für jeden Container, der beim Ausführen des compose files gebaut werden soll, wird ein neuer Unterordner angelegt.
In diesen Unterordner wird das dockerfile und alle zusätzlich benötigten Dateien abgelegt.
Für den API Container habe ich ein kleines Python Script erstellt.
Dieses erzeugt eine Instanz mit dem Namen test im CouchDB Container und fügt einen Beispieleintrag hinzu.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import couchdb import time time.sleep(5) couch = couchdb.Server() couch = couchdb.Server('http://admin:password@couchdb-python_couchdb_1:5984/') db = couch.create('test') # newly created doc = {'foo': 'bar'} db.save(doc) |
Nachdem der Python Code erstellt wurde, brauchen wir nun noch ein Dockerfile mit dem wir den Code in einem Container hinterlegen. Das Dockerfile sieht wie folgt aus:
1 2 3 4 5 6 7 | FROM python RUN pip install couchdb RUN useradd -ms /bin/bash admin USER admin WORKDIR /src COPY src /src CMD ["python", "app.py"] |
Damit haben wir alles für den Python Container fertig. Als nächstes ist die docker-compose.yml Datei an der Reihe. Den Inhalt der Datei könnt ihr euch einfach aus der nächsten Code Box kopieren.
1 | docker-compose.yml |
Jetzt können wir das Setup starten.
1 | docker-compose up |
Ob alles funktioniert hat, lässt sich nun recht einfach über den CouchDB Container prüfen. Diese liefert direkt ein Frontend mit, das man im Webbrowser aufrufen kann (http://localhost:5984/_utils/). Dort sieht man nun, dass die Instanz test angelegt wurde
Docker Compose File Mount
Wie bei normalen Docker Container kann es auch in einem Compose Setup sinnvoll sein Dateien vom Hostsystem in den Container einzubinden oder die Nutzdaten des Containers auf einen lokalen Speicher zu schreiben, damit diese persistent sind.
Der File Mount unter Docker Compose ist genauso einfach wie in einem Dockerfile.
Schreibe einen Kommentar