Java >> Java tutorial >  >> Java

Den komplette guide til brug af Docker Compose

I dette indlæg vil jeg dække den komplette guide til brug af docker compose. Du kan bruge det til at bygge en multi-container-applikation. Men hvad er en docker compose, og hvorfor skal man bruge det?

Hvad er Docker Compose?

Hvis du ikke ved, hvad en havnearbejder er, kan du læse om det her. Hvis du har en applikation, der kører på en docker, og hvis den applikation bruger flere andre tjenester som database, webserver og load balancer, så kan du skrive flere docker-filer og køre flere containere. Det kan være besværligt at administrere disse filer. Og hvis du skal ændre noget, skal du muligvis ændre alle filer.

Docker compose løser dette problem ved at tillade dig at skrive en YAML-fil for at definere flere containere i en enkelt fil. Du skriver én docker-fil og bygger og kører den fil for alle containerne.

Installation af Docker Compose

Baseret på definitionen fra docker.com er docker compose et værktøj til at definere og køre flere Docker-containere.

Afhængigt af dit miljø skal du bruge instruktionerne til at installere docker compose. Du skal også bruge docker engine, før du kan installere docker compose. Jeg bruger Windows-miljøet, så jeg vil vise disse instruktioner her.

  • Start Power Shell i administratortilstand
  • Kør denne kommando – [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
  • Kør derefter følgende kommando - 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

Dette vil installere docker compose. Åbn en ny kommandoprompt, og skriv den første kommando

docker-compose -v

Dette skulle give docker-compose-versionen, hvis din installation har kørt uden problemer.

Opsætning af en Spring Boot-applikation med Docker

For at vise styrken ved docker-compose vil vi bruge en simpel To-Do liste forårs boot app. Jeg vil dele denne app i et GitHub-lager sammen med en docker-komponeringsfil. Men denne app inkluderer følgende applikationer, som vi vil bruge i docker compose:

  1. Spring Boot-applikation
  2. Java version 8
  3. MySQL til database
  4. Keycloak til godkendelse

Så jeg vil ikke vise implementering af Spring Boot-applikationen. Hvis du vil downloade denne applikation, kan du besøge github-depotet, eller du kan læse mit tidligere indlæg her.

Vi vil oprette en docker-fil til denne Spring Boot-applikation, og denne vil køre i sin egen container. Nu forbinder denne applikation til Keycloak og MySQL-database for godkendelse. Keycloak vil bruge Postgres-databasen i stedet for at bruge den samme MySQL-database.

Docker-filen til Spring Boot-applikationen vil se ud som nedenfor:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY ./build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

Denne docker-fil downloader grundlæggende Open JDK 8. Den monterer disken ved /tmp . Den kopierer en programjar-fil som app.jar . Og selvfølgelig vil den starte applikationen ved at køre java -jar .

Sådan skriver du Docker Compose-fil

Nu kommer docker-compose.yml fil. Dette vil se ud som nedenfor:

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

Den første linje i denne docker-compose-fil er versionen af ​​din docker-compose.

services definere forskellige typer tjenester, som vi vil bruge til at bygge vores docker-container. web tjenesten bruger et billede, der bygger fra en docker-fil. I vores tilfælde bygger vi et docker-billede af vores Spring Boot-applikation. Denne applikation vil køre på port 8080. Vi skal også sørge for at sende de nødvendige miljøvariabler. Som du kan se i filen, bruger vi vores database som db og variablen SPRING_DATASOURCE_URL viser det. db er navnet på vores databasetjeneste, som vores applikation vil oprette forbindelse til.

Vores databasetjeneste db kører på værtsport på 3307, men bruger port 3306 (standardport) på containeren. Dette er fordi jeg har MySQL kørende på min værtsmaskine ved port 3306, så for at undgå portkonflikt bruger jeg 3307.

Vi har en anden databasetjeneste postgres i vores docker compose-fil. Det bruger standardporte på 5432, og det er derfor ikke angivet her. Keycloak bruger postgres som en del af hele denne ansøgning. Hvis du ikke angiver postgres , Keycloak vil som standard bruge en H2-database i hukommelsen. Problemet med en database i hukommelsen er, at når du stopper din container, vil den miste alle data. For at undgå det bruger jeg en rigtig database, der gemmer vores rige og brugernes data.

En anden tjeneste, som vi bruger, er keycloak. Dette er vores IDP til godkendelse. Tjenesten kører på port 8180. Den bruger Postgres-databasen til at oprette forbindelse. command del af keycloak service instruerer at køre tjenesten på port 8180 i containeren i stedet for standard 8080.

networks service definerer, at alle disse containere er en del af det samme netværk common-network med en driver af typen bridge.
For at sikre, at vi kan bruge databasen, skal vi montere diskvolumen til både MySQL- og Postgres-databaser. Vi monterer disse volumener lokalt.

Køring af containerne

For nu at udføre containerne med applikationen skal du udføre følgende kommando (sørg for at du bygger din applikation)

docker-compose up

Dette vil bygge Docker-containere til alle vores tjenester og starte dem. Hvis vi nu får adgang til vores applikation på http://localhost:8080

Hvis en bruger klikker på Get all tasks , vil brugeren se keycloak login-skærm som nedenfor:

Indtast brugernavn og adgangskode, og brugeren vil se opgaverne for den loggede bruger.

Nyttige kommandoer

docker-compose up – Denne kommando vil bygge docker-containerne og starte dem.

docker-compose up -d – Dette er en lignende kommando som ovenfor, bortset fra at den vil køre alle processer i baggrunden.

docker-compose stop – Stop havnearbejderne. Dette vil bevare den tidligere tilstand af containere, selv efter du har stoppet containerne.

docker-compose start – Start docker-tjenesterne

docker-compose logs – Vis logfilerne fra docker-containere

docker-compose ps – Liste over Docker-beholderne

docker-compose run – Kør engangskommando. Eksempel – docker-compose run web env – Liste miljøvariablerne for webtjenesten.

Fordele ved Docker Compose

  • Ved at køre de fleste af tjenesterne i docker, behøver du ikke installere disse tjenester i dit miljø.
  • Det er nemmere at samarbejde om udviklingsmiljøet med andre udviklere ved at tjekke kilden ind i versionskontrol med docker-compose.
  • Hurtig og nem konfiguration. Du kan køre dine tjenester på tværs af platforme.

Avanceret brug af docker compose

Noget jeg ikke har dækket i dette indlæg er at bruge network som en tjeneste, du virkelig kan udvide med docker compose. Det giver dig også mulighed for at køre en belastningsbalancer (eller omvendt proxy-lignende nginx). ) og administrer belastningen med flere værter.

I stedet for at bruge miljøvariabler kan du også bruge .env fil for miljøvariabler og indlæs den, mens du starter containerne.

Konklusion

I dette indlæg viste jeg, hvordan du kan bruge docker compose til at køre flere containere med en enkelt docker compose-fil. Det giver dig også mulighed for nemt at administrere dit miljø. På samme måde kan du lære om Kubernetes.

Referencer

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

Java tag