Container technology Docker Logo

Seit der Veröffentlichung von UCS 4.1 im November 2015 unterstützt das App Center Docker Apps. Das sind Anwendungen, die in Form von Docker Images vorliegen und durch das App Center in einem Docker Container in Betrieb genommen werden. Dazu lädt das App Center das Docker Image einer App herunter und startet den Docker Container. Wir nennen diese Apps „Single Container Apps“, weil das App Center pro App nur einen Container unterstützt. Dieser Funktionsumfang ist für viele Apps ausreichend. Bis jetzt!

Die App Landschaft unterliegt einem stetigen Wandel und neue App Kandidaten wie Rocket.Chat, Metasfresh und Zammad bestehen nicht mehr nur aus einem Container. Diese Apps werden „Multi Container Anwendungen“ genannt. Um dem Wunsch vieler unserer Nutzer nachzukommen, auch solche Apps im Univention App Center zu finden und auf UCS zu betreiben, unterstützt das App Center nun mit dem UCS 4.3 Errata Update 345 Multi Container Apps und schafft damit die nötigen Voraussetzungen.

Eine verbreitete Herangehensweise bei der Containervirtualisierung, wie sie durch Docker umgesetzt wird, ist die Bereitstellung einzelner Services in einzelnen Containern. Der wohl häufigste Anwendungsfall ist die Trennung von Applikation und Datenbank wie zum Beispiel bei Rocket.Chat. Die Zahl der Container ist hierbei nicht auf zwei beschränkt, wie Metasfresh zeigt.


Container am Kran

Wenn Sie mehr über die Docker Technologie an sich erfahren möchten, empfehlen wir Ihnen diese kurze Einführung:

Kurz erklärt: Docker


Multi Container mit Docker Compose

Für Multi Container Anwendungen im Docker-Umfeld kommt Docker Compose zum Einsatz, das auch im App Center verwendet wird. Zentrales Element ist die docker-compose.yml Datei. Im Folgenden sehen Sie ein Beispiel für die App Rocket.Chat:

version: '2'

services:
  rocketchat:
    image: rocketchat/rocket.chat:latest
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - MAIL_URL=smtp://smtp.email
    depends_on:
      - mongo
    ports:
      - 3000:3000

  mongo:
    image: mongo:3.2
    restart: unless-stopped
    volumes:
     - ./data/db:/data/db
     command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
  
  # this container's job is just run the command to initialize the replica set.
  # it will run the command and remove himself (it will not stay running)
  mongo-init-replica:
    image: mongo:3.2
    command: 'mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"'
    depends_on:
      - mongo
  
  hubot:
    image: rocketchat/hubot-rocketchat:latest
    restart: unless-stopped
    environment:
      - ROCKETCHAT_URL=rocketchat:3000
      - ROCKETCHAT_ROOM=GENERAL
      - ROCKETCHAT_USER=bot
      - ROCKETCHAT_PASSWORD=botpassword
      - BOT_NAME=bot 
      - EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics
    depends_on:
      - rocketchat   
    volumes:
      - ./scripts:/home/hubot/scripts 
    ports:
      - 3001:8080

Diese Dateien im YAML Format definieren verschiedene Services. Diese Services geben an, welches Docker Image genutzt werden soll und welche Umgebungsvariablen, Volumes, Ports und Abhängigkeiten zu anderen Containern benötigt werden. In ihrer Gesamtheit wird so eine Applikation mit all ihren Teilen beschrieben, die mittels Docker Compose gestartet werden.

Docker Compose Konfiguration am Beispiel der Applikation Zammad

App Anbieter können ihre Docker Compose Konfiguration im App Provider Portal hinterlegen, wie der Screenshot am Beispiel von Zammad zeigt.

Screenshot einer Docker Compose Konfiguration am Beispiel der App Zammad

App Anbieter können eine ganze Reihe von Konfigurationseinstellungen für die App im Provider Portal hinterlegen. Dazu gehören auch Skripte, die zu unterschiedlichen Phasen während des App Lifecycles im Container und auf dem Host ausgeführt werden.

Bei Multi Container Apps muss für das App Center festgelegt werden, welches der definierten Services bzw. welcher Container der Hauptservice ist, auf den diese Skripte und auch manche Konfigurationen angewendet werden sollen. In der Regel ist der Hauptservice der Container, der die Applikation beinhaltet.

Mögliche Veränderungen der Docker Compose Datei durch das App Center

Bevor eine Multi Container App auf dem Zielsystem des Nutzers via Docker Compose in Betrieb genommen werden kann, wird die docker-compose.yml durch das App Center auf dem UCS-System direkt verarbeitet und um einige Punkte verändert bzw. ergänzt.

  1.  Das App Center fügt für den Hauptservice zwei Standard-Volumes hinzu, wie sie auch in Single Container Apps eingebunden werden. Das sind die Verzeichnisse /var/lib/univention-appcenter/apps/<appid>/dataund /var/lib/univention-appcenter/apps/<appid>/confauf dem UCS-Host. Wenn im App Provider Portal in der App Konfiguration ebenfalls Volumes definiert sind, werden diese ebenfalls in der Docker Compose Datei durch das App Center für den Hauptservice ergänzt.
  2. Wenn im App Provider Portal Ports definiert sind, werden diese auch in der Docker Compose Datei ergänzt. Bereits definierte Ports haben weiterhin Bestand. Wenn derselbe Port im Portal und in der Docker Compose Datei definiert ist, hat die Konfiguration im App Provider Portal Vorrang. Wenn zum Beispiel in der Docker Compose Datei steht, dass der Port 4500 nach außen als Port 4500 bereitgestellt wird, aber im Portal definiert ist, dass dieser Port als 6500 genutzt werden soll, wird die Docker Compose Datei so angepasst, dass der Port 4500 auf 6500 auf dem Host gemapped wird.
  3. Eine weitere Besonderheit besteht in der Angabe des Webinterfaces. Wenn in der Docker Compose Datei steht, dass Port 80 oder 443 nach außen geöffnet werden sollen und in der App Konfiguration angegeben ist, dass diese Ports durch das App Center für das Webinterface genutzt werden sollen, wird das App Center auf dem Zielsystem on the fly einen Port festlegen und diesen in der Docker Compose Datei angeben. Hintergrund ist, dass UCS Hosts in der Regel die Ports 80 und 443 mit einem Webserver belegen. Das App Center erstellt eine Apache Reverse Proxy Konfiguration, sodass die App über eine URL der Form https://hostname.domain/appid/ erreichbar ist.
  4. Docker Container verwenden gern Umgebungsvariablen. Auch Docker Apps auf UCS machen Gebrauch davon und UCS liefert über das App Center eine Reihe von Umgebungsvariablen, wie z. B. Parameter für eine LDAP-Anbindung. Die u. a. dafür nötigen Variablen werden auch in die Docker Compose Datei geschrieben.
  5. Des Weiteren stehen in dem Hauptservice wie auch bei Single Container Apps sämtliche auf UCS definierten UCR-Variablen unter /etc/univention/base.conf zur Verfügung sowie auch das Passwort für das sogenannte Maschinenkonto unter /etc/machine.secret, über das der Hauptservice einen authentifizierten, lesenden Zugang auf das LDAP-Verzeichnis hat.
  6. Wenn eine Multi Container App veröffentlicht wird, wird serverseitig die Docker Compose Datei angepasst und die Angaben zum Docker Image so verändert, dass sie auf die Docker Images in der Univention Docker Registry verweisen. Alle Docker Images von veröffentlichten Apps werden in die Univention Docker Registry kopiert, um unabhängig von der Docker-eigenen Infrastruktur zu sein. Dies ist die einzige, serverseitige Änderung an der Docker Compose Datei.

Im Ergebnis startet Docker Compose auf dem Zielsystem eine Docker Compose Konfiguration, die nicht mehr 100% der Eingabe des App Anbieters entspricht. Das ist nötig, weil bereits beim Start einer App zahlreiche Informationen für eine optimale Integration vorhanden sein müssen. So können die Apps sich bestens auf die lokale Umgebung einstellen und sich entsprechend vorkonfigurieren, sodass Nutzer direkt loslegen können. Die veränderte Docker Compose Datei findet sich auf dem UCS Zielsystem unter
/var/lib/univention-appcenter/apps/$app/compose/docker-compose.yml.

Screenshot_Zammad

App Anbieter können nun direkt damit loslegen, im App Provider Portal ihre Docker Apps zu erstellen und die Docker Compose Konfiguration zu hinterlegen. Die Dokumentation hierzu erscheint in den nächsten Tagen. Die ersten Multi Container Apps sind bereits auf dem Weg und sollten in den nächsten Wochen im App Center veröffentlicht werden.

Nico Gulden studierte angewandte Informatik und arbeitet seit 2010 bei Univention. Er ist verantwortlich für das Produkt Management und das Relationship-Management der App-Hersteller im Univention App Center. In seiner Freizeit widmet er sich seiner Familie, dem Lesen, der Bewegung an der frischen Luft zum Fotografieren, Geocaching oder Mapping für das OpenStreetMap Projekt.

Was ist Ihre Meinung? Hinterlassen Sie einen Kommentar!

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