Migration einer dockerisierten Anwendung nach OpenShift – Teil 1/3

Aus dem Alltag eines OpenShift Middleware Engineers: Wie wird eine bestehende, dockerisierte Anwendung auf OpenShift migriert? Dieser Blogpost veranschaulicht das Vorgehen an einem bestehenden Projekt und ist Teil einer Serie. Vorliegender Bericht beschränkt sich darauf, wie Docker Images angepasst werden müssen, damit sie bereit für den Betrieb auf OpenShift sind.

Verwendete Technologien der Anwendung:

Vorgehen

Die Docker Images müssen auf die Verwendung im OpenShift überprüft werden. Es gibt Einschränkungen, welche aufgrund der erhöhten Sicherheitsanforderungen der OpenShift Plattform gelten:

  • Docker Container dürfen nicht als root Benutzer gestartet werden.
  • SELinux (Security-Enhanced Linux) ist aktiviert.

Wenn es bereits ein für OpenShift optimiertes Docker Image mit der selben Technologie gibt, ist es sinnvoll dieses zu verwenden. Ist keines zur Hand, muss das Docker Image erweitert werden.

Diese zwei Ansätze zeige ich euch anhand der folgenden Technologien.

SpringBoot Anwendungen

Ausgangslage ist eine Java Anwendung, welche mit einer Build Pipeline gebaut wird. Das resultierende SpringBoot Fat Jar wird in ein openjdk Dockerimage gepackt.

FROM openjdk:11 
COPY app.jar app.conf / 
RUN ["chmod", "+x", "/app.jar"] 
ENTRYPOINT ["/app.jar"] 

Ausserhalb OpenShift kann die Anwendung so betrieben werden. Sicherheitstechnisch und für das Ressourcenmanagement ist dieses Docker Image nicht ideal:

  • Docker Container wird als root Benutzer gestartet
  • Java Memory Konfiguration ist nicht an Docker Container Beschränkungen gebunden

Durch die Sicherheitsmechanismen von OpenShift kann das Docker Image so nicht verwendet werden. Zum Beheben dieser Probleme, und damit das Docker Image OpenShift tauglich ist, setzen wir das fabric8 openjdk11 Docker Image ein. Fabric8 bietet OpenShift fähige Docker Images an, welche den Red Hat Docker Images entsprechen.

FROM fabric8/java-centos-openjdk11-jdk 
ADD app.jar /deployments/app.jar 
  • Docker Container wird nicht als root ausgeführt
  • Jar Dateien im deployments Verzeichnis werden automatisch gestartet
  • Jolokia ist integriert für JMX Informationen
  • Ein Starter-Skript konfiguriert die JVM

Zum Beispiel wird Xmx (Java Heap Memory) anhand der Docker Container Memory Konfiguration gesetzt. Damit passt sich die Java Heap Size der Grösse vom Docker Container an. Das vereinfacht die Konfiguration, da sie nur an einem Ort verwaltet wird. Ohne diese Funktionalität müsste bei jeder Änderung der Memory Werte auf dem Docker Container die Java Heap Size der Java Anwendung angepasst werden.

fabric8 openjdk11 Docker Image

Eclipse Mosquitto

Ein Open Source MQTT Message Broker.

Docker Image Bauanleitung für den plain Docker Betrieb.

FROM eclipse-mosquitto:1.6 

COPY docker-entrypoint.sh / 
COPY config/* /mosquitto/config/ 

ENTRYPOINT ["/docker-entrypoint.sh"] 
CMD ["/usr/sbin/mosquitto", "-c", "/mosquitto/config/mosquitto.conf"] 
EXPOSE 1883 

Mit dem docker-entrypoint.sh Skript werden Berechtigungen verwaltet bevor Mosquitto gestartet wird. Beim Starten im OpenShift gibt es jedoch „Permission denied“ Fehler und der Docker Container startet nicht. Das passiert mir oft, wenn ich Docker Images verwende, welche nicht für OpenShift konzipiert wurden.

OpenShift verwendet zum Starten der Docker Container zufällig generierte User ID’s. Das ist ein Sicherheitsmechanismus, welcher jedoch zu diesen Berechtigungsproblemen führen kann. In der OpenShift Dokumentation ist die Lösung dazu beschrieben: Support Arbitrary User IDs

RUN chgrp -R 0 /some/directory && \
    chmod -R g=u /some/directory

Dies ist das erweiterte Dockerfile. Die Berechtigungen werden für das /mosquitto Verzeichnis gesetzt und als Benutzer wird mosquitto anstatt root verwendet.

FROM eclipse-mosquitto:1.6

COPY docker-entrypoint.sh /
COPY config/* /mosquitto/config/

RUN chgrp -R 0 /mosquitto && \
    chmod -R g=u /mosquitto

USER mosquitto

EXPOSE 1883

ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["/usr/sbin/mosquitto", "-c", "/mosquitto/config/mosquitto.conf"]

Mit diesen Änderungen kann das Docker Image auf OpenShift verwendet werden.

Anmerkung:

Es gibt einige Docker Images, welche den Benutzer in /etc/passwd suchen. Im gleichen Abschnitt der OpenShift Dokumentation gibt es auch die Lösung dazu. Ein spezieller Entrypoint fügt den Benutzer mit der aktuellen UID in /etc/passwd ein.

Zusammenfassung

Ich habe euch zwei Ansätze gezeigt, wie Docker Images auf OpenShift betrieben werden können.

  1. OpenShift fähiges Docker Image verwenden
  2. Docker Image für OpenShift erweitern

Gute Anleitungen zum Erstellen von Docker Images:

Wer hat in diesem Blog die OpenShift Plattform vermisst?

In einem späteren Blog zeige ich euch auf, wie diese Anwendung auf OpenShift deployt und konfiguriert wird.

Kommentare sind geschlossen.