Java >> Java Tutorial >  >> Java

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:

  1. Spring Boot-Anwendung
  2. Java-Version 8
  3. MySQL für Datenbank
  4. 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

  1. Docker Compose – Docker-Compose
  2. Keycloak – Keycloak-Container

Java-Tag