Übersicht: Was ist Docker Compose?
Die Definition eines Docker-Containers erfolgte bisher durch die Parametrisierung des docker create
-Befehls. Dies wurde so auch in früheren Artikeln so beschrieben und ist auch ein durchaus korrekter Ansatz. Allerdings werden diese Befehle spätestens in dem Moment sehr unhandlich und unübersichtlich, wenn mehrere Container miteinander verlinkt werden und damit voneinander abhängig sind.
Mit Docker Compose wird die Definition verlinkter Container besser gelöst: Statt eines Aufrufs von docker create
mit vielen Parametern werden diese in einer einfach strukturierten Textdatei abgelegt. Als Dateiformat hat sich die Docker-Community für YAML entschieden, eine sinnvolle und nachvollziehbare Entscheidung.
Damit wird werden Dependencies zwischen Docker-Containern deutlich vereinfacht. Dies kann auch sofort dem WordPress-Beispiel aus der Docker Compose-Dokumentation entnommen werden:
version: '3.3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {}
Selbst ohne bisherige Kenntnisse in Docker Compose ist einem Leser mit Docker-Hintergrund sofort klar, was mit dieser Datei bezweckt werden soll:
- Es wird ein MySQL-Container aus dem mysql:5.7-Image erzeugt.
- Dieser benutzt ein Volume namens
db_data
- und wird automatisch gestartet, sobald die Docker-Engine aktiv ist.
- Benutzername, Passwort und der Name der Datenbank werden über Environment-Parameter gesetzt.
- Ein weiterer Container beruht auf dem wordpress:latest-Image und stellt einen WordPress-Server bereit.
- Auch hier erfolgt die Konfiguration über Environment-Parameter, zusätzlich erfolgt ein Port-Mapping.
- Mit
depends-on
wird dieser Container aber nun mit dem MySQL-Container verlinkt. Damit steht für beide Container ein gemeinsames Netzwerk bereit, so dass der Web Server von WordPress direkt auf den MySQL-Server zugreifen kann.
Falls nun Docker Compose installiert ist wird diese Information ganz einfach in einer Datei namens docker-compose.yml
abgelegt.
Und dann genügt tatsächlich der Befehl docker-compose up
, um die gesamte Anwendung zu starten!
Einige Details
Installation
Die Installation ist detailliert hier beschrieben, wird aber hier exemplarisch für eine Linux-Distribution, z.B. SLES 12, durchgeführt:
Als erstes wird die für die Distribution relevante Compose-Version von GitHub geladen und ausführbar gemacht:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Zusätzlich kann die Bash-Completion installiert werden:
curl -L https://raw.githubusercontent.com/docker/compose/1.21.2/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
Ab jetzt sollte der Befehl docker-compose
verfügbar sein, also beispielsweise
docker-compose -v
Arbeitsweise
Docker Compose ist keine Erweiterung der Docker-Engine sondern “nur” ein Generator für Docker Befehle auf Grundlage der yml-Datei. So erzeugt der up
-Befehl von docker compose ganz normale Docker-Container, die beispielsweise über ein docker ps
aufgelistet werden können. Entsprechend wird der down
-Befehl diese Container wieder löschen.
Kommando-Referenz
Selbstverständlich müssen die über docker compose definierten Container nicht jedesmal erneut mit up
erzeugt werden. Zum Starten und Stoppen dienen die Befehle start
und stop
, die die vorhandenen Container benutzen.
Die vollständige Kommando-Referenz ist Bestandteil der Docker-Compose Dokumentation, ebenso die Command Line-Befehle.
Compose und Build-Prozess
Für eine agile Entwicklung kann die docker-compose.yml
auch ein Dockerfile angeben und vor der Erstellung der Container erst einmal das zugehörige Image neu bauen. Damit kann compose auch sinnvoll in den Buildprozess einer Docker-Anwendung integriert werden.