Eine der einfachsten Möglichkeiten, so gut wie jede Anwendung bereitzustellen, ist die Verwendung von Docker-Containern. Es gibt eine Fülle von Hosting-Seiten, die Container-Hosting anbieten, oder Sie können Ihren Dienst selbst hosten, indem Sie einen dedizierten Server oder VPS verwenden. Die manuelle Verwaltung verschiedener Docker-Container mit Umgebungsvariablen, gemappten Ports und Volumes kann ziemlich mühsam sein. Hier kommt Docker Compose ins Spiel.
Docker Compose
In der Docker-Dokumentation heißt es:
Compose ist ein Tool zur Definition und Ausführung von Docker-Anwendungen mit mehreren Containern.
Dies bedeutet, dass wir in der Lage sein werden, mehrere containerisierte Anwendungen zu erstellen, auszuführen und zu verwalten. Für diesen Artikel werden wir zwei Dienste erstellen: einen PlayFramework-Backend-Server und eine PostgreSQL-Datenbank. Wenn Sie eine Frontend-Anwendung oder eine Art von Administrationspanel hosten müssen, können Sie weitere Dienste zu Ihrer Docker-Compose
Datei hinzufügen.
Database service – PostgreSQL
Als erstes müssen wir eine Datei docker-compose.yml
erstellen. Danach können wir mit der Konfiguration beginnen. Das erste, was wir hinzufügen müssen, ist ein Element der obersten Ebene: services
in der ersten Zeile unserer Datei. Der erste Dienst, den wir erstellen werden, ist unsere Datenbank. Dafür werden wir das PostgreSQL-Image
verwenden. Der Dienst wird db heißen. Vergewissern Sie sich, dass Ihr Dienst einen Einzug tiefer als das services
-Element steht und alle anderen Elemente die gleiche Anzahl von Einzügen haben, wie im Beispiel unten.
db: image: postgres container_name: db restart: always ports: - "5432:5432" volumes: - ./docker/volumes/db:/var/lib/postgresql/data environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=database-name
Erläutern wir diese Konfiguration:
db:
– Name der Dienstleistungimage: postgres
– gibt das Image an, das wir verwenden wollen. In diesem Fall ist es Postgres.container_name: db
– Name des Containers, der erstellt werden sollrestart: always
– legt die Neustartrichtlinie für Container festports
– ordnet Container-Ports den Ports des Host-Rechners zuvolumes
– erstellt ein Docker-Volume, um Datenbankdaten auf dem Host-Rechner zu speichernenvironment
– setzt die Umgebungsvariablen des Containers. Das PostgreSQL-Image ermöglicht es uns, Benutzer und Datenbank bei der Initialisierung des Containers zu erstellen, indem Umgebungsvariablen gesetzt werden.
PlayFramework server application service
Der nächste Dienst, den wir benötigen, ist unser Play-Backend-Server. Hierfür verwenden wir ein Play-Anwendungsimage. Wenn Sie nicht wissen, wie man ein solches erstellt, können Sie sich diesen Artikel ansehen. We will call this service play
.
play: image: your-apps-name:latest container_name: your-apps-name restart: always ports: - "9000:9000" volumes: - ./conf:/opt/docker/conf - ./docker/volumes/play/files:/opt/docker/your-app-name_files - ./docker/volumes/play/logs:/opt/docker/logs environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=database-name depends_on: - db
Dieser Dienst enthält ein neues Element: depends_on
. Damit wird sichergestellt, dass unsere Spielanwendung nach db
, der unser Datenbankcontainer ist. Wenn Sie nicht wissen, warum in diesem Dienst etwas so eingestellt ist, wie es ist, finden Sie die Antwort wahrscheinlich in diesem Artikel, in dem wir Ihnen zeigen, wie Sie ein Play-Server-Image erstellen.
Da wir Umgebungsvariablen verwenden, um Datenbankanmeldeinformationen und Namen an unseren Play-Server-Container zu übergeben, müssen wir die Konfigurationsdatei von Play ändern, um diese Variablen zu verwenden.
default.driver = "org.postgresql.Driver" default.url = "jdbc:postgresql://db:5432/"${?POSTGRES_DB} default.username = ${?POSTGRES_USER} default.password = ${?POSTGRES_PASSWORD}
Bei der obigen Datenbankkonfiguration werden bestimmte Variablen an bestimmten Stellen platziert. Da wir eine PostgreSQL-Datenbank verwenden, müssen wir zunächst den richtigen Treiber einstellen. Als Nächstes wollen wir uns in der URL mit der Datenbank verbinden, die vom db service auf Port 5432 gehostet wird. Wir können einfach den Namen unseres Dienstes mit einem bestimmten Port als Teil unserer URL verwenden. Dann fügen wir mit ${?POSTGRES_DB} den Datenbanknamen aus der Umgebungsvariablen an die URL „jdbc:postgresql://db:5432/“ an. Wir setzen den Benutzernamen und das Passwort der Datenbank auf die gleiche Weise – mit ${?VARIABLE_NAME}.
Environment Variables
Wie Sie vielleicht bemerken, mussten wir die Datenbankanmeldedaten in beiden Diensten duplizieren. Wir können dies vereinfachen, indem wir Umgebungsvariablen in unserer Datei docker-compose.yml verwenden. Zu diesem Zweck erstellen wir eine .env-Datei im selben Verzeichnis wie die vorherige Datei. Sie sollte wie folgt aussehen:
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_DB=database-name
APP_NAME=play-app-server
Die letzte Variable APP_NAME speichert den Namen der Play-Anwendung.
Nun müssen wir die Datei docker-compose so anpassen, dass sie diese Variablen verwendet. Wir müssen die Datenbank-Anmeldeinformationen durch ${?VARIABLE_NAME} ersetzen. Ihre gesamte docker-compose-Datei sollte ähnlich aussehen wie die im folgenden Beispiel.
services: db: image: postgres container_name: db restart: always ports: - "5432:5432" volumes: - ./docker/volumes/db:/var/lib/postgresql/data environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} play: image: rakbud-server:latest container_name: ${APP_NAME} restart: always ports: - "9000:9000" volumes: - ./conf:/opt/docker/conf - ./docker/volumes/play/files:/opt/docker/your-app-name_files - ./docker/volumes/play/logs:/opt/docker/logs environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} depends_on: - db
Im letzten Schritt öffnen wir unser Terminal, geben cd in das Verzeichnis mit der Datei docker-compose ein und führen es aus:
docker-compose config
Dieser Befehl prüft, ob das erstellte docker-compose korrekt ist. Ist dies der Fall, wird er im Terminal ausgegeben, wo Sie überprüfen können, ob die Umgebungsvariablen korrekt gesetzt wurden.
Da wir nun eine korrekte docker-compose
Datei haben, können wir Folgendes ausführen
docker-compose up -d
Dieser Kommentar startet unsere Container im Detached Mode, d.h. er lässt die Container im Hintergrund laufen. Um Protokolle von Containern zu erhalten, müssen Sie Folgendes ausführen:
docker-compose logs