Magnolia DevOps Serie, Teil 2: Orchestrierung mit Docker Compose
Bearbeiten: Im Februar 2015 veröffentlichte Docker Inc. Docker Compose, das Fig in Zukunft ersetzen wird. Dieser Beitrag wurde entsprechend aktualisiert.
Im letzten Beitrag haben wir gesehen, wie man das Magnolia-Basis-Image verwendet, um eine bestehende WAR-Datei zu deployen. Auch wenn dieser Ansatz sehr praktisch ist, reicht er nicht aus, um eine produktive Umgebung mit Magnolia aufzubauen.
Einige Aspekte wurden nicht diskutiert - wie die Verwendung eines externen Dienstes für die Datenbank oder die Kommunikation zwischen zwei verschiedenen Magnolia-Instanzen.
In diesem Beitrag erkläre ich, wie man eine Magnolia-Autoreninstanz und ihre öffentliche Instanz einrichtet.
Die Autoreninstanz wird von Redakteuren zum Erstellen und Bearbeiten von Inhalten verwendet. Sobald ein Artikel fertig ist, wird er für die öffentliche Instanz aktiviert, die als einzige im Internet zugänglich ist.
Wie viele Container?
Eine bewährte Praxis ist es, einen Container pro Prozess zu verwenden und jeden Container so weit wie möglich zu entkoppeln: Eine Magnolia-Instanz läuft in ihrem eigenen Container und verwendet eine eigene Datenbank. Infolgedessen benötigen wir 4 Container (in grün):
Wie verwende ich meine eigene WAR
Wenn Sie kein Maven-Projekt zur Verfügung haben, erstellen Sie ein neues Projekt unter Verwendung des Maven-Archetyps in einem leeren Ordner:
mvn archetype:generate -DarchetypeCatalog=https://nexus.magnolia-cms.com/content/groups/public/
Weitere Einzelheiten und eine hervorragende Anleitung finden Sie in der offiziellen Dokumentation.
Nach erfolgreicher Erstellung des Projekts erstellt Maven einen Zielordner innerhalb des webapp-Moduls mit der WAR-Datei. Der nächste Schritt besteht darin, diese WAR-Datei an den Docker-Container zu senden.
Erstellen Sie eine neue Dockerdatei im Stammverzeichnis Ihres Projekts mit folgendem Inhalt:
FROM nicolasbarbe/magnolia-base
COPY my-project-webapp/target/my-project-webapp*.war $CATALINA_BASE/webapps/ROOT.war
Der Vorteil dieses Ansatzes besteht darin, dass die Bereitstellungsanweisungen und der Code in einer Versionskontrolle wie GIT verknüpft werden und diese Informationen leicht projektübergreifend genutzt werden können. Alle Entwickler, aber auch die Betreiber, verwenden das gleiche Bereitstellungsverfahren und die gleiche Infrastruktur.
Wie man jede Magnolia-Instanz unterscheidet
Bei diesem Ansatz wird die WAR-Datei im ROOT-Kontext von Tomcat bereitgestellt. Infolgedessen wird die Standarddatei magnolia.properties immer übernommen.
Um eine einzige WAR-Datei mit mehreren Konfigurationen zu erhalten, wählte ich einen ähnlichen Ansatz wie den von Greg in seinem ausgezeichneten Beitrag beschriebenen. Anstatt jedoch einen Tomcat-Kontextparameter zur Konfiguration des Instanztyps zu verwenden, füge ich eine Umgebungsvariable namens INSTANCE_TYPE ein.
Sie müssen Ihre web.xml so ändern, dass sie die richtigen magnolia.properties je nach dem Wert dieser Umgebungsvariablen aufnimmt:
<Kontext-Parameter>
<param-name>magnolia.initialization.file</param-name>
<param-value>
WEB-INF/config/${env/INSTANCE_TYPE}/magnolia.properties,
WEB-INF/config/default/magnolia.properties,
WEB-INF/config/magnolia.properties
</param-value>
</kontext-param>
In ähnlicher Weise werde ich eine weitere Variable namens DB_TYPE definieren, um den Typ der Datenbank festzulegen.
Komponieren Sie!
Jetzt kommt der interessanteste Teil - Wie konfiguriere und orchestriere ich meine Container?
Wir haben 4 Container, die wir direkt von der Kommandozeile aus starten können oder wir können Docker Compose verwenden .
Mit Docker Compose können Sie Ihre Dienste und deren Beziehungen definieren. Der einfachste Weg zu verstehen, wie es funktioniert, ist es zu benutzen!
Erstellen Sie eine Datei namens docker-compose.yml im Stammverzeichnis Ihres Projekts:
dbAutoren:
Abbildung: postgres
Umwelt:
- POSTGRES_USER=magnolia
- POSTGRES_PASSWORD=MeinGeheimpasswort
dbPublic:
Bild: mysql
Umwelt:
- MYSQL_USER=magnolia
- MYSQL_PASSWORT=MeinGeheimpasswort
- MYSQL_DATENBANK=magnolia
- MYSQL_ROOT_PASSWORT=meinGeheimnisPasswort
Autor:
bild: nicolasbarbe/magnolia-cloud-bundle:0.2-SNAPSHOT
Befehl: ausführen
Häfen:
- "3000:8080"
Links:
- dbAutoren:db
Umwelt:
- INSTANCE_TYPE=Autor
- DB_TYPE=postgresql
- DB_ADDRESS=db
- DB_PORT=5432
- DB_SCHEMA=magnolia
- DB_USERNAME=magnolia
- DB_PASSWORT=MeinGeheimpasswort
öffentlich:
bild: nicolasbarbe/magnolia-cloud-bundle:0.2-SNAPSHOT
Befehl: ausführen
Häfen:
- "3001:8080"
Links:
- dbPublic:db
Umwelt:
- INSTANCE_TYPE=public
- DB_TYPE=mysql
- DB_ADDRESS=db
- DB_PORT=3306
- DB_SCHEMA=magnolia
- DB_USERNAME=magnolia
- DB_PASSWORT=MeinGeheimpasswort
Und führen Sie diesen Befehl aus:
docker-compose aufwärts
Docker erstellt automatisch 4 Container:
- dbAuthor: A Postgres database based on the official image.
- dbPublic: A MySQL database based on the official image.
- author: The Magnolia author instance listening on the port 3000.
-INSTANCE_TYPE and DB_TYPE point to a specific magnolia.properties configured as an author instance using postgres.
-The author instance port is mapped to the port 3000 of the container.
-The author instance is linked to the database dbAuthor and can be accessed inside the container through the name db.
-The database credentials are injected inside the instance container through the three environment variables DB_SCHEMA, DB_USERNAME, DB_PASSWORD.
- public: The Magnolia public instance listening on the port 3001.
-INSTANCE_TYPE and DB_TYPE point to a specific magnolia.properties configured as an public instance using mysql.
-The public instance port is mapped to the port 3001 of the container.
-The public instance is linked to the database dbPublic and can be accessed inside the container through the name db.
-The database credentials are injected inside the instance container through the three environment variables DB_SCHEMA, DB_USERNAME, DB_PASSWORD.
Die öffentliche Instanz ist unter dieser Adresse http://localhost:3001 und die Autoreninstanz unter dieser Adresse http://localhost:3000 verfügbar . Wenn Sie MacOS verwenden, vergessen Sie nicht, localhost durch die IP-Adresse der virtuellen boot2docker-Maschine zu ersetzen.
Der letzte Schritt besteht darin, die öffentliche Instanz als Abonnent zu konfigurieren.
Im Idealfall werden mindestens zwei öffentliche Instanzen für die Redundanz benötigt und ein Load-Balancer muss so konfiguriert werden, dass er die Anfragen automatisch verteilt. Dies wird in einem der nächsten Beiträge behandelt!
The source code of this post is available here.