Quelle: Docker.com

Docker-compose erklärt4 min zu lesen

Im letzten Monat haben mich mehrere Leser gefragt ob ich nicht mal ein kleines Tutorial zu Docker-compose machen könnte. Mit diesem Artikel möchte ich dem nun nachkommen.
Ich möchte erklären wie docker-compose funktioniert, wie man es installiert und verwendet. Als beispiel nehme ich ein eigenes Setup für Nextcloud, Onlyoffice, Redis, mysql.

Was ist Docker-compose?

Docker-compose dient einem dazu relativ komplizierte Docker Netzwerke aufzusetzen und diese bei Bedarf zu ändern, oder neu zu starten. Auf diese Weise kann man mehrere Container verwalten. Ein nebeneffekt ist, das man nur eine YML Datei braucht.

Aufbau der Datei

Jede Compose Datei trägt den Namen docker-compose.yml und kann auch nicht geändert werden, da sonst das starten der Container nicht funktioniert.
Gestartet werden diese immer mit folgendem Kommando. Dabei sollte man beachten das man solche Container nie als Root User ausführt.

sudo docker-compose up -d

Die Datei ist so aufgebaut.

version: '2.2'
 
services:
 db:
    image: mariadb
    container_name: name-des-containers
    networks:
      - container-netzwerk
    volumes:
      - /lokaler/pfad/:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=superSecret
      - MYSQL_PASSWORD=Supersecret23
      - MYSQL_DATABASE=database
      - MYSQL_USER=databasePW
    restart: always

In diesem Beispiel wird ein Container mit einer Datenbank gestartet (mysql) dieser nennt sich db. Folglich kann dieser mit docker-compose up -d db gestartet werden. Will man mehrere Container starten nimmt man nur docker-compose up -d.
Das Kommando zum starten des Containers kann nur in dem Pfad erfolgen wo die docker-compose.yml liegt. In einem anderen Pfad wüsste der Server nichts mit dem Kommando anzufangen.

Container_name

Mit container_name gibt man dem Container einen Namen, dies ist sinnvoll wenn man viele Docker Container geladen hat. Denn ohne dem würden zufällige Namen vergeben werden und man verliert komplett den Überblick.

Image

image dient dazu damit das richtige Container image geladen werden kann. Diese findet man im Netz unter https://hub.docker.com.

Networks

Wenn man mehrere Container miteinander verknüpfen will geschieht dies in Netzwerken. Vergleichbar mit dem lokalen Netzwerken zuhause, wo die einzelnen Rechner untereinander reden können, von außen (Router) kein Zugriff erfolgen kann. Wie in diesem Beispiel könnte es aussehen.

Version: '3'
Services:
   db:
    image:
    port:
     - 3306
    networks:
     - netzwerkname
   website:
     image:
     port:
      - 8080:80
      - 4443:443
     networks:
      - netwerkname
     restart: always
networks:
  netzwerkname:

Volume

Mit einem Volume kann man Pfade auf dem Host-System mit Pfaden innerhalb der Container verknüpfen. Auf diese Weise bleiben Dateien bei einem Update des Containers, oder bei einem Neustart des Containers/Servers erhalten. Wenn man kein Volume setzt gehen alle Daten verloren sollte man einen Neustart machen. Ein symbolischer Link macht nur Sinn wenn der Pfad im Container auch Daten beinhaltet.

    volumes:
      - /lokaler/pfad/:/var/lib/mysql

Bei MySQL wäre der Pfad zum Beispiel /var/lib/mysql. Bei WordPress meist /var/www/html

Volumes_from

Mit diesem Befehl lassen sich alle Volumes eines anderen Containers übernehmen. So muss man nichts doppelt schreiben.

Hier ein Beispiel:

version: "2"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes_from:
      - redis:rw
  postgres:
    image: postgres:9.4
    volumes:
      - /data/webapp
  backup:
    image: postgres:9.4
    volumes:
      - /var/lib/backup/data

environment

Mit einem Enviroment werden Kommandos innerhalb des Container ausgeführt.
In unserem Beispiel, oben im Artikel, wird eine Datenbank beim ersten Containerstart erstellt, sowie der dazu gehörige Benutzer und das Datenbankpasswort. Zudem noch ein MySQL Root Nutzer erstellt, da sonst kein editieren oder erstellen der Datenbanken möglich wäre.
Eine Datenbank braucht man eigentlich immer, sei es für eine Webseite, einer Cloud, eines Emailservers oder sonstigen Dingen.

Ports

Mit der Angabe Ports ist es möglich einen Container über einen Port anzusprechen, beispielsweise via dem Nginx Web Server.

Ports: 
  - 80:80 
  - 443:443

Hier wird der Port angeben der im Container genutzt wird. Sowie der Port am Host System. Dies kann sich ein ganz anderer sein, sollte beispielsweise der Port 80 oder 443 schon belegt sein. Dies wäre dann

- 4444:443

restart

mit Restart wird dem Docker Dämon erklärt das dieser Container bei jedem Neustart des Servers mitgestartet werden soll. Mögliche Befehle wären

restart: always
restart: unless-stopped

Beim ersten Befehl wird der Container immer mit gestartet, beim zweiten nur bis du ihn selbst gestoppt hast.

Links

Mit links kann man einen Hostnamen eines Containers, einem anderen Container zur Verfügung stellen.

mynginx:
  image: nginx 
  links: myphp-fpm
myphp-fpm:
  image: php:fpm

Build

Mit dem Build Befehl lassen sich eigene Images erstellen. Dazu benötigt man ein zusätzliches Dockerfile. In diesem werden das zu nutzende Image festgelegt und Befehle eingetragen die beim erstellen des Images durchgeführt werden sollen.

In diesem Beispiel spricht der Nginx Container den PHP-fpm Container nicht mit der IP an sondern mit dem Containernamen. Echt praktisch. Hier ein Beispiel für ein Dockerfile:

FROM ubuntu:18.04 #mit Welchem Betriebssystem das Image laufen soll
MAINTAINER  # nennung des Entwicklers
ADD ./mysql-setup.sh /tmp/mysql-setup.sh #kopieren einer Datei in das Image
RUN /bin/sh /tmp/mysql-setup.sh #ausführen eines Befehls
RUN apt-get update && apt-get ugrade #Update von installierten Packeten im Image
[..]

ausgeführt wird dies dann mit

docker build -t containername .

Quellen und weitere Infos: ab-heute-programmieren.de, docs.docker.com

Wie hat dir der Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (1 Stimme(n), durchschnittliche Bewertung: 5,00 von 5)
Loading...

Folgt mir

lars

Ich bin Blogger, Technikfan und Fachangestellter für Bäderbetriebe seit 15 Jahren. Ein Leben am Beckenrand 🙂
Folgt mir auf Telegram https://t.me/dasnetzundich
lars
Folgt mir

Letzte Artikel von lars (Alle anzeigen)

Schreibe einen Kommentar

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

Ich akzeptiere