Jottacloud CLI-Docker-Image als Docker Service
Ich plane Daten von einem Linux-Host automatisiert in der Cloud zu speichern. Um den Dienst besser nutzen zu können habe ich ein Docker Image gebaut. Die Anleitung dazu ist unter https://entwickler-gilde.de/2018/02/05/dockerimages-erstellen/. zu finden.
Darauf aufbauend möchte ich zeigen wie man das Image als Service nutzt. Ich nutze dabei Docker Compose als Werkzeug.
Docker Compose ist ein Core-Tool von Docker. Es steht eine ausführliche Dokumentation unter https://docs.docker.com/compose/ zur Verfügung. Mit Docker Compose können Anwendungen definiert werden, die aus mehreren Containern bestehen. Z.B. kann die Datenbank in einem Container laufen, das Web-Frontend in einem anderen. Die Jottacloud-CLI kann, in einem dritten Container, die anfallenden Daten zur Sicherung in die Cloud sichern.
In einer YAML-Datei wird definiert wie:
- Die Images von Docker gebaut oder bezogen werden sollen
- Wie und wie viele Container Docker aus diesen Images erstellt
- Wie die Container konfiguriert sein sollen
- Wo ihre persistenten Daten auf dem Host in Volumes liegen
- Zu welchen Netzwerken die Container Zugang haben sollen
Mit einem einzigen Befehl kann Docker Compose solch ein komplexes Szenario erstellen und ausführen.
Docker-Compose muss über curl installiert werden. Die Versionsnummer in den Befehlen sollte dabei die aktuellste, stabile Version sein.
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose sudo curl -L https://raw.githubusercontent.com/docker/compose/1.18.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
docker-compose --version
sollte nun die Versionsnummer von Docker Compose anzeigen.
Mehr Informationen zu Docker Compose sind unter https://docs.docker.com/compose/install/#install-compose zu finden. Mehr Informationen zur Bashintegration unter https://docs.docker.com/compose/completion/ .
Die Konfiguration von Docker Compose wird, wie bereits gesagt, in einer YAML-Datei beschrieben. Die Datei sollte standardmäßig docker-compose.yml heißen. Docker Compose nutzt diese Datei automatisch, sofern sie im aktuellen Verzeichnis liegt.
Die docker-compose.yml zum einrichten der Jottacloud CLI sieht so aus:
version: "3.5" services: jotta-cli: build: context: ./jotta-cli args: - ubuntu_version=${JOTTA_CLI_IMAGE_UBUNUT_VERSION} - jotta_cli_version=${JOTTA_CLI_IMAGE_JOTTA_CLI_VERSION} image: jotta-cli:${JOTTA_CLI_IMAGE_JOTTA_CLI_VERSION} container_name: jotta-cli volumes: - type: volume source: jotta-cli target: /root/.jottad volume: nocopy: true - type: bind source: / target: /sync read_only: true restart: always volumes: jotta-cli: name: jotta-cli
Die Versionsnummer am Anfang beschreibt die Version des Schemas der docker-compose.yml. Einige Features sind nur ab bestimmten Docker Compose-Versionen verfügbar. Anhand der Versionsnummer weiß Docker Compose ob es die Anwendung bauen kann.
Unter services:
können alle Anwendungen aufgelistet werden, die ausgeführt werden sollen. Es gibt hier viele Konfigurationsmöglichkeiten. Die der Jottacloud CLI ist recht speziell.
build:
besagt, dass kein Image gezogen werden soll. Docker Compose baut das Image beim Einrichten der Anwendung. Das Dockerfile zum Bau des Images ist relativ zur docker-compose.yml im ./jotta-cli/dockerfile. Wer den Artikel unter https://entwickler-gilde.de/2018/02/05/dockerimages-erstellen/ gelesen hat, weiß dass die Versionsnummern des Ubuntu-Images und der Jottacloud CLI über ARG
s gesetzt werden können.
In diesem Fall wird es noch spezieller. Die ARG
s werden durch Umgebungsvariablen der Shell JOTTA_CLI_IMAGE_UBUNUT_VERSION und JOTTA_CLI_IMAGE_JOTTA_CLI_VERSION gesetzt. Setzt man diese nicht, werden Defaults aus einer Datei .env im selben Verzeichnis der docker-compose.yml genutzt.
Der Inhalt der Datei .env sieht also folgendermaßen aus:
JOTTA_CLI_IMAGE_UBUNUT_VERSION=16.04 JOTTA_CLI_IMAGE_JOTTA_CLI_VERSION=0.3.4269
build:
den Namen und Tag des erzeugten Images fest. legt im Zusammenhang mit
legt den Namen des erzeugten Containers fix auf jotta-cli. Docker Compose nutzt diesen Namen und vergibt keinen eigenen. Deshalb kann Docker Compose nur einen einzigen Container erzeugen. In diesem Fall ist das gewollt.
volumes:
mountet das Volume jotta-cli in den Container oder legt dieses an, sofern es nicht vorhanden ist. Es wird im Container in /root/.jottad gemountet. Dort ist die Konfiguration der Jottacloud CLI gespeichert. nocopy: true
stellt sicher, dass keine Dateien vom Container zur Buildzeit in das Volume kopiert werden. Persistente Daten bleiben so bei einem Update des Containers erhalten.
Ein zweiter Mount mountet den gesamten Verzeichnisbaum des Hosts im Container unter /sync. Da es als readonly
gemountet ist können Daten nur gelesen, aber nicht geschrieben werden.
restart: always
stellt sicher, dass der Container immer läuft.
Hier ist das Volume beschrieben. Hier wird in diesem Fall nur der Name fix auf jotta-cli festgelegt.
Docker Compose benutzen
Jetzt ist der größte Teil der Arbeit getan. Man muss nun in das Verzeichnis wechseln, in dem docker-compose.yml liegt.
Service bauen und ausführen
Hier kann man seine Anwendung bauen und ausführen lassen.
docker-compose up -d
Docker Compose richtet alles ein, startet die Anwendung und führt sie im Hintergrund aus. Den Status der Anwendung kann man sich anzeigen lassen.
docker-compose ps
Will man die Anwendung beenden und entfernen, weil man z.B. eine aktuellere Version laufen lassen will, geht man folgendermaßen vor:
docker-compose stop docker-compose rm
Das Volume mit den persistenten Daten bleibt erhalten. So nutzt sie eine aktualisierte Version weiter.