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.
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.
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.
- 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>/data
und/var/lib/univention-appcenter/apps/<appid>/conf
auf 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. - 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.
- 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.
- 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.
- 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. - 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
.
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.
Kommentare
Nico Gulden
Die Dokumentation wurde aktualisiert. Der Teil zu Multi Container Support ist hier beschrieben: https://docs.software-univention.de/app-provider.html#create-app-with-docker:compose
Christian Säum
Was ist mit Zammad und Kolab geschehen.
Beide nicht mehr unter Apps zu finden in der aktuellen 4.4
Ingo Steuwer
Zammad gab es bisher noch nicht im App Center, wir hatten hier den Bedarf über unsere „Vote for App“ Umfragen ermittelt – es befindet sich aber in der Umsetzung und wird hoffentlich in Kürze freigeschaltet (im Test-App-Center gibt es bereits eine Vorab-Version: http://docs.software-univention.de/app-provider-4.4.html#testing:test-app-center).
Kolab gibt es leider seit ca. 2 Jahren nicht mehr für UCS. Da die Integrationen immer von den Projekten oder Organisationen hinter der Software bereit gestellt werden, fragen Sie zum Status gerne direkt beim Kolab Projekt nach: https://www.kolab.org/