Teil 1 Teil 2 Teil 3 Teil 4

Weiter geht’s mit Docker.

Wenn man sich erst mal an die ‘Docker way of life’ gewöhnt hat, wird man feststellen, dass man immer weniger Dienste direkt auf dem Server installiert. Stattdessen wird man für jeden Dienst einen Docker container verwenden, weil das eben viel einfacher in der Handhabung ist: Es gibt nie Kompatibilitätsprobleme, man muss nie lang über Konfigurationen nachdenken, und last but not least: Migration auf neue oder ganz andere Hardware ist trivial: Es ist einem Docker container schlicht egal, ob er auf Mac, Linux, Windows oder in der Amazon-ec2 cloud läuft. Er verhält sich immer genau gleich. Und es ist ihm auch egal, ob ein anderer Container, mit dem er kooperiert, sich auf demselben Computer oder auf einem anderen Kontinent befindet.

Doch einen Nachteil gibt es: Wenn man eine Menge Docker container laufen hat, muss man die bei einem Neustart des Servers alle korrekt wieder erstellen und/oder hochfahren, was manchmal schwierig sein kann, wenn das letzte Mal eine Weile her ist, und was auch eine Menge Tipparbeit an der Konsole bedeutet.

Hier kommt docker-compose ins Spiel. Damit kann man ein System aus beliebig vielen Containern mit einem simplen sudo docker-compose up & hochfahren und mit sudo docker-compose stop stoppen.

Dazu muss man sich einmal die Mühe machen, eine Steuerdatei (docker-compose.yml) zu erstellen. Die sieht zum Beispiel so aus:

    owncloud:
      image: rgwch/owncloud-client:latest
      volumes:
       - /srv/ebooks:/srv/owncloud
      env_file: ../ebenv.txt
    
    calibre:
       image: rgwch/calibre-server:latest
       volumes:
         - /srv/ebooks:/srv/calibre
       ports:
         - 4040:8080
    
    gitserver:
       build: docker-git
       volumes:
         - /srv/repositories:/opt/git
       ports:
         - 5050:80
    
    
    webelexis:
       build: docker-webelexis-server
       volumes:
         - /home/gerry/dockerfiles/cfglocal.json:/home/webelexis/cfglocal.json
         - /home/gerry/dockerfiles/wlxks.jks:/home/webelexis/ks.jks
       ports:
         - 443:2015
       environment:
         VERSION: 1.0.0

Das ist im Prinzip ja selbsterklärend. Hier werden zwei Container aus images und zwei aus build-instructions (Dockerfiles in den angegebenen Verzeichnissen) erstellt und anschliessend konfiguriert und hochgefahren. Anschliessend kann man mit http://<adresse>:4040 auf den eBook-Server, mit http://<adresse>:5050 auf den GIT-Server und mit https://<adresse> auf den Webelexis-Server zugreifen.

Docker-compose ist dabei auch schlau genug, um bereits existierende Container wiederzuverwenden, anstatt sie bei jedem Start neu zu erstellen. Neu erstellt wird nur, wenn es neuere Versionen gibt, oder wenn sich (im Fall von build:) Etwas an den build-instructions geändert hat.

Wenn man sudo docker-compose up ohne & am Schluss eingibt, dann bleibt der Prozess im Vordergrund und kann mit einmal CTRL-C sauber und mit zweimal CTRL_C “hart” gestoppt werden. Wenn man ihn mit & in den Hintergrund schickt, kann man ihn mit sudo docker-compose stop sauber und mit kill hart stoppen.

Wenn man alle Container der Komposition auf einmal löschen will, genügt ein simples sudo docker-compose rm. Man muss sich also nicht mehr mit jeder Menge angry_einsteins und condescent_newtons herumschlagen, um alle loszuwerden.