Skip to main content

Liferay Development Setup mit Docker

Docker Moby Logo

Das Aufsetzen von Entwicklungsumgebungen ist immer wieder ein zeit- aber auch nervenintensiver Prozess. Mit Hilfe von Docker lässt sich ein erheblicher Anteil des notwendigen Setups einfach und schnell automatisieren. In diesem Artikel möchte ich euch unseren Ansatz zum Aufsetzen von Liferay-Entwicklungsumgebungen mit Docker vorstellen.

Hier bei empulse entwickeln wir Mitarbeiterportal-Lösungen für unterschiedliche Unternehmen. Als Basis für viele unserer Projekte dient dazu Liferay, eine Java basierte Enterprise Portal Software. Als Entwickler ist man teilweise in unterschiedlichen Projekten involviert. Mit jedem Einstieg eines Entwicklers in ein Projekt ist auch immer das Aufsetzen der Entwicklungsumgebung der erste Schritt. Dazu gehören z.B. die Installation eines lokalen Liferay Portals, die Einrichtung der passenden Datenbank, bei uns meistens MySQL oder PostgreSQL, dazu eine angepasste ElasticSearch Instanz und viele weitere Details die erst einmal konfiguriert werden müssen, bevor man als Entwickler in die eigentliche Arbeit einsteigen kann. Nicht zuletzt laufen mit der Zeit die lokalen Versionen der Umgebungen einzelner Entwickler immer weiter auseinander und es muss ständig aktiv daran gearbeitet werden alles zu synchronisieren. Der Zeitaufwand hierfür ist erfahrungsgemäß nicht zu ignorieren und es lohnt sich diesen Prozess zu automatisieren.

Docker to the Rescue!

Mit Docker ist es möglich Anwendungsumgebungen reproduzierbar zu machen. Das kommt bisher vor allem beim Deployment von Server Applikationen zum Einsatz, wo so mit wenig Aufwand und hoher Sicherheit und im besten Fall einem einzigen „Klick“, z.B. ein weiterer Knoten in das Cluster eines verteilten Systems eingebunden werden kann. Das die Anwendung sich so verhalten wird, wie sie soll ist dadurch abgesichert, dass der Docker Container exakt die gleiche Umgebung, wie in allen anderen Knoten bereitstellt. Dazu zählen in erster Linie das gleiche Betriebssystem aber auch alle weiteren Abhängigkeiten (z.B. Java, Liferay Portal, PostgreSQL, ElasticSearch und generelle Konfiguration).

Seit kurzem verwenden wir deshalb auch Dockercontainer für unsere Entwicklungsumgebungen und möchten euch unseren Ansatz dazu vorstellen.

Unser Entwicklungssetup basiert dabei auf einem einzigen Git Repository. Dort befinden sich alle relevanten Dockerfiles aus denen sich Entwickler die benötigten Images lokal bauen können. Das hat vor allem den Vorteil, dass keine Container über das Netzwerk geschoben werden müssen und jeder Entwickler auch selbst Änderungen für ein Setup direkt im passenden Dockerfile vornehmen kann. Die Dockerfiles könnten alternativ auch einfach direkt im Repository des Projekts abgelegt werden, dagegen spricht nichts. Es gibt Basisdockerfiles die z.B. auf dem offiziellen Ubuntu Image basieren und neben einigen kleinen Tools eine Java Runtime installieren:

FROM ubuntu:latest
RUN \
    apt-get update && \
    apt-get install -y curl && \
    apt-get install -y software-properties-common && \
    echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
    add-apt-repository -y ppa:webupd8team/java && \
    apt-get update && \
    apt-get install -y oracle-java8-installer && \
    apt-get install oracle-java8-set-default
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

Dieses Image muss einmal nach jeder Änderung manuell gebaut werden. Für die Container der eigentlichen Projekte gibt es weitere Dockerfiles in einem parallelen Verzeichnis, z.B.:

FROM java-8:latest
RUN \
    apt-get update && \
    apt-get install -y unzip telnet
ENV LIFERAY_HOME=/usr/local/liferay-ce-portal-7.0-ga3
ENV CATALINA_HOME=$LIFERAY_HOME/tomcat-8.0.32
ENV PATH=$CATALINA_HOME/bin:$PATH
ENV LIFERAY_TOMCAT_URL=https://cdn.lfrs.sl/releases.liferay.com/portal/7.0.2-ga3/liferay-ce-portal-tomcat-7.0-ga3-20160804222206210.zip
WORKDIR /usr/local
RUN mkdir -p "$LIFERAY_HOME" \
    && set -x \
    && curl -fSL "$LIFERAY_TOMCAT_URL" -o liferay-ce-portal-tomcat-7.0-ga3-20160804222206210.zip \
    && unzip liferay-ce-portal-tomcat-7.0-ga3-20160804222206210.zip \
    && rm liferay-ce-portal-tomcat-7.0-ga3-20160804222206210.zip
COPY ./configs/portal-ext.properties $LIFERAY_HOME/portal-ext.properties
COPY ./configs/setenv.sh $CATALINA_HOME/bin/setenv.sh
ENTRYPOINT ["catalina.sh", "run"]

Das Image erbt vom java-8:latest Image, unserem Basisimage von oben. Neben einigen Tools wird ein Liferay Portal installiert und über Templates konfiguriert. Als Entrypoint für den Container wird der Start des Liferay Portals definiert. Unser Container stoppt also, sobald Liferay beendet wird.

Die Anbindung an die Datenbank ist in portal-ext.properties hinterlegt. Die Datenbank selbst installieren wir jedoch nicht im Liferay Container, wir nehmen stattdessen einen weiteren Container. Ein individuelles Image benötigen wir dafür eher selten und verwenden stattdessen meist ein offizielles Image. Mit Hilfe von Docker Compose lässt sich das gut automatisieren. Neben der Einbindung der Datenbank können mit Docker Compose auch gleich die notwendigen Ports geöffnet und Volumes definiert werden.

version: '2'
services:
    portal:
        build: .
        depends_on:
         - postgres
        ports:
         - "8080:8080"
         - "1145:1145"
        volumes:
         - /opt/docker/deploy:/usr/local/liferay-ce-portal-7.0-ga3/deploy
         - /opt/docker/osgi/modules:/usr/local/liferay-ce-portal-7.0-ga3/osgi/modules
    postgres:
        image: postgres
        ports:
         - "5432:5432"
        environment:
         - POSTGRES_DB=liferay_portal
         - POSTGRES_USER=liferay
         - POSTGRES_PASSWORD=test
        volumes:
         - /opt/docker/postgresql/data:/var/lib/postgresql/data

Um dieses Setup für einzelne Projekte anzupassen erstellen wir jeweils Branches, dort können dann die benötigten Versionen und die Konfiguration angepasst werden. Von jetzt an kann auf der Kommandozeile mit „docker-compose up“ die gesamte Umgebung hochgefahren werden. Für jedes andere Projekt muss vorher nur in den passenden Branch gewechselt werden.

Nachteil unseres Setups sind die vielen Container, die mit der Zeit (gerade zu Projektstart, wo noch viele Änderungen kommen) auf den Rechnern der Entwickler entstehen, gelegentliches aufräumen ist hier Pflicht. Bei den aktuellen Preisen für Speicher ist das insgesamt für uns jedoch kein relevanter Faktor.

Fazit

Mit Docker und Docker Compose haben wir ein flexibles System zum Aufsetzen von Entwicklungsumgebungen. Jeder Entwickler kann sich die Umgebung zu anderen Projekten selbst bauen und ggf. auch anpassen, und das Setup für neue Projekte kann zu einem großen Teil aus bestehenden Konfigurationen zusammengestellt werden.

Weiterführende Infos:

Wünschen Sie weitere Details oder haben Sie konkrete Fragen?

Über den Autor

empulse Team

Unser kompetentes und erfahrenes Team von (Java-)Entwickler ist stark in Beratung, technischer Konzeption und zuverlässiger Umsetzung komplexer Projekte. In unseren Reihen haben wir Spezialisten für unterschiedliche Themengebiete, die hier ihr Fachwissen zum Besten geben.