Die vollständige Anleitung zur Verwendung von Docker Compose
In diesem Beitrag werde ich die vollständige Anleitung zur Verwendung von Docker Compose behandeln. Sie können es verwenden, um eine Anwendung mit mehreren Containern zu erstellen. Aber was ist ein Docker Compose und warum sollte man es verwenden?
Was ist Docker Compose?
Wenn Sie nicht wissen, was ein Docker ist, können Sie hier darüber nachlesen. Wenn Sie eine Anwendung haben, die auf einem Docker ausgeführt wird und diese Anwendung mehrere andere Dienste wie Datenbank, Webserver und Load Balancer verwendet, können Sie mehrere Docker-Dateien schreiben und mehrere Container ausführen. Die Verwaltung dieser Dateien kann umständlich sein. Und wenn Sie etwas ändern müssen, müssen Sie möglicherweise alle Dateien ändern.
Docker compose löst dieses Problem, indem es Ihnen ermöglicht, eine YAML-Datei zu schreiben, um mehrere Container in einer einzigen Datei zu definieren. Sie schreiben eine Docker-Datei und erstellen und führen diese Datei für alle Container aus.
Docker Compose installieren
Basierend auf der Definition von docker.com ist docker compose ein Tool zum Definieren und Ausführen mehrerer Docker-Container.
Abhängig von Ihrer Umgebung müssen Sie die Anweisungen zum Installieren von Docker Compose befolgen. Sie benötigen außerdem die Docker-Engine, bevor Sie Docker Compose installieren können. Ich verwende die Windows-Umgebung, daher zeige ich diese Anweisungen hier.
- Power Shell im Administratormodus starten
- Führen Sie diesen Befehl aus –
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
- Führen Sie dann den folgenden Befehl aus – Invoke-WebRequest „https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Windows-x86_64.exe“ -UseBasicParsing -OutFile $Env:ProgramFiles\Docker\docker-compose.exe
Dadurch wird Docker Compose installiert. Öffnen Sie eine neue Eingabeaufforderung und geben Sie den ersten Befehl
ein
docker-compose -v
Dies sollte die Docker-Compose-Version bereitstellen, wenn Ihre Installation ohne Probleme ausgeführt wurde.
Spring Boot-Anwendung mit Docker einrichten
Um die Leistungsfähigkeit von Docker-Compose zu demonstrieren, verwenden wir eine einfache Spring-Boot-App für To-Do-Listen. Ich werde diese App zusammen mit der Docker-Compose-Datei in einem GitHub-Repository freigeben. Aber diese App enthält die folgenden Anwendungen, die wir in Docker Compose verwenden werden:
- Spring Boot-Anwendung
- Java-Version 8
- MySQL für Datenbank
- Keycloak für die Authentifizierung
Daher werde ich die Implementierung der Spring Boot-Anwendung nicht zeigen. Wenn Sie diese Anwendung herunterladen möchten, können Sie das Github-Repository besuchen oder meinen vorherigen Beitrag hier lesen.
Wir erstellen eine Docker-Datei für diese Spring Boot-Anwendung, die in einem eigenen Container ausgeführt wird. Jetzt verbindet sich diese Anwendung zur Authentifizierung mit Keycloak und der MySQL-Datenbank. Keycloak verwendet die Postgres-Datenbank, anstatt dieselbe MySQL-Datenbank zu verwenden.
Die Docker-Datei für die Spring Boot-Anwendung sieht wie folgt aus:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY ./build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Diese Docker-Datei lädt im Wesentlichen Open JDK 8 herunter. Sie mountet die Festplatte bei /tmp
. Es kopiert eine Anwendungs-JAR-Datei als app.jar
. Und natürlich wird die Anwendung gestartet, indem java -jar
ausgeführt wird .
So schreiben Sie eine Docker Compose-Datei
Jetzt kommt die docker-compose.yml
Datei. Dies sieht wie folgt aus:
version: "3.8"
services:
web:
build: .
ports:
- "8080:8080"
depends_on:
- db
- keycloak
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/todolist?autoReconnect=true&useSSL=false
SPRING_DATASOURCE_USERNAME: betterjavacode
SPRING_DATASOURCE_PASSWORD: betterjavacode
KEYCLOAK_URI: http://keycloak:8180/auth
REALM: SpringBootKeycloakApp
networks:
- common-network
db:
image: mysql:5.7
ports:
- "3307:3306"
restart: always
environment:
MYSQL_DATABASE: todolist
MYSQL_USER: betterjavacode
MYSQL_PASSWORD: betterjavacode
MYSQL_ROOT_PASSWORD: root
volumes:
- db-data:/var/lib/mysql
networks:
- common-network
postgres:
image: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: password
networks:
- common-network
keycloak:
image: jboss/keycloak
ports:
- "8180:8180"
command: ["-Djboss.socket.binding.port-offset=100"]
environment:
DB_VENDOR: POSTGRES
DB_ADDR: postgres
DB_DATABASE: keycloak
DB_USER: keycloak
DB_PASSWORD: password
DB_SCHEMA: public
KEYCLOAK_USER: admin
KEYCLOAK_PASSWORD: Pa55w0rd
depends_on:
- postgres
networks:
- common-network
networks:
common-network:
driver: bridge
volumes:
db-data:
driver: local
postgres_data:
driver: local
Die erste Zeile in dieser Docker-Compose-Datei ist die Version Ihres Docker-Compose.
services
Definieren Sie verschiedene Arten von Diensten, die wir zum Erstellen unseres Docker-Containers verwenden. web
Der Dienst verwendet ein Image, das aus einer Docker-Datei erstellt wird. In unserem Fall erstellen wir ein Docker-Image unserer Spring Boot-Anwendung. Diese Anwendung wird auf Port 8080 ausgeführt. Wir müssen auch sicherstellen, dass die erforderlichen Umgebungsvariablen übergeben werden. Wie Sie in der Datei sehen, verwenden wir unsere Datenbank als db
und die Variable SPRING_DATASOURCE_URL
zeigt, dass. db
ist der Name unseres Datenbankdienstes, mit dem sich unsere Anwendung verbindet.
Unser Datenbankdienst db
läuft auf dem Hostport 3307, verwendet aber Port 3306 (Standardport) auf dem Container. Das liegt daran, dass ich MySQL auf meinem Host-Rechner auf Port 3306 laufen lasse, also verwende ich 3307, um Portkonflikte zu vermeiden.
Wir haben einen anderen Datenbankdienst postgres
in unserer Docker-Compose-Datei. Das verwendet Standardports von 5432 und wird deshalb hier nicht angegeben. Keycloak verwendet postgres
als Teil dieser gesamten Anwendung. Wenn Sie postgres
nicht angeben verwendet Keycloak standardmäßig eine In-Memory-H2-Datenbank. Das Problem mit einer In-Memory-Datenbank ist, dass sobald Sie Ihren Container stoppen, alle Daten verloren gehen. Um das zu vermeiden, verwende ich eine echte Datenbank, die unsere Realm- und Benutzerdaten speichert.
Ein weiterer Dienst, den wir verwenden, ist keycloak.
Dies ist unser IDP für die Authentifizierung. Der Dienst wird auf Port 8180 ausgeführt. Er verwendet die Postgres-Datenbank, um eine Verbindung herzustellen. Die command
Teil von keycloak
service weist an, den Dienst auf Port 8180 im Container statt auf Standard 8080 auszuführen.
networks
service definiert, dass alle diese Container Teil desselben Netzwerks common-network
sind mit einem Treiber vom Typ Bridge.
Um sicherzustellen, dass wir die Datenbank verwenden können, müssen wir das Festplattenvolume sowohl für MySQL- als auch für Postgres-Datenbanken bereitstellen. Wir mounten diese Volumes lokal.
Container ausführen
Um nun die Container mit der Anwendung auszuführen, führen Sie den folgenden Befehl aus (stellen Sie sicher, dass Sie Ihre Anwendung erstellen)
docker-compose up
Dadurch werden Docker-Container für alle unsere Dienste erstellt und gestartet. Wenn wir nun unter http://localhost:8080
auf unsere Anwendung zugreifen
Wenn ein Benutzer auf Get all tasks
klickt , sieht der Benutzer keycloak
Anmeldebildschirm wie folgt:
Geben Sie den Benutzernamen und das Passwort ein, und der Benutzer sieht die Aufgaben für den angemeldeten Benutzer.
Nützliche Befehle
docker-compose up
– Dieser Befehl erstellt die Docker-Container und startet sie.
docker-compose up -d
– Dies ist ein ähnlicher Befehl wie oben, außer dass alle Prozesse im Hintergrund ausgeführt werden.
docker-compose stop
– Stoppen Sie die Docker-Dienste. Dadurch wird der vorherige Zustand der Container beibehalten, auch nachdem Sie die Container gestoppt haben.
docker-compose start
– Starten Sie die Docker-Dienste
docker-compose logs
– Zeigen Sie die Protokolle von Docker-Containern an
docker-compose ps
– Docker-Container auflisten
docker-compose run
– Einmaligen Befehl ausführen. Beispiel – docker-compose run web env
– Listen Sie die Umgebungsvariablen des Webdienstes auf.
Vorteile von Docker Compose
- Indem Sie die meisten Dienste in Docker ausführen, müssen Sie diese Dienste nicht in Ihrer Umgebung installieren.
- Es ist einfacher, mit anderen Entwicklern an der Entwicklungsumgebung zusammenzuarbeiten, indem Sie den Quellcode in der Versionskontrolle mit docker-compose einchecken.
- Schnelle und einfache Konfiguration. Sie können Ihre Dienste plattformübergreifend ausführen.
Erweiterte Verwendung von Docker Compose
Etwas, das ich in diesem Beitrag nicht behandelt habe, ist die Verwendung von network
als Dienst, den Sie mit docker compose wirklich erweitern können. Es ermöglicht Ihnen auch, einen Load Balancer (oder einen Reverse-Proxy-ähnlichen nginx
) auszuführen ) und die Last mit mehreren Hosts verwalten.
Anstelle von Umgebungsvariablen können Sie auch .env
verwenden Datei für Umgebungsvariablen und lade sie beim Starten der Container.
Schlussfolgerung
In diesem Beitrag habe ich gezeigt, wie Sie Docker Compose verwenden können, um mehrere Container mit einer einzigen Docker Compose-Datei auszuführen. Es ermöglicht Ihnen auch, Ihre Umgebung einfach zu verwalten. Ebenso können Sie sich über Kubernetes informieren.
Referenzen
- Docker Compose – Docker-Compose
- Keycloak – Keycloak-Container