1. Allgemeines

Wenn Sie mitmachen möchten, können Sie dieses Repository klonen: https://github.com/htl-leonding-project/franklyn-quarkus und in den Ordner "Backend" wechseln. Dieses Tutorial hängt nicht von Java und von dem Projekt "Franklyn" nicht ab. Sie können dieses Projekt auch für andere Technologien und Projekte verwenden.

2. Voraussetzungen

  • Docker muss installiert sein.

3. Was ist ein Container Registery

Eine Container Registry ist ein Repository oder eine Sammlung von Repositories, in der Container Images gespeichert werden und auf diese Images zugegriffen werden kann.
— https://redhat.com/de/topics/cloud-native-apps/what-is-a-container-registry

4. Welche Container Registery gibt es

  • GitHub Container Registry (GHCR)

  • Docker Hub Container Registry

  • Google Artifact Registry (GAR)

  • Red Hat Quay

  • etc.

5. Vorgehensweise

  1. Erstellung eines Docker-Images für die Applikation

  2. Bauen dieses Images

  3. hochladen mittels docker push

5.1. Erstellung eines Docker-Images für die Applikation

Dafür könnte man eine Library wie zum Beispiel Java Image Builder (JIB) verwenden oder ein Dockerfile schreiben.

Für diesen Tutorial habe ich mich entschieden, ein Dockerfile zu schreiben.

In dem Ordner Backend werden wir jetzt ein Dockerfile erstellen. Der Inahlt dieses Files schaut so aus:

FROM openjdk:17-alpine

WORKDIR /app

# Copy Maven Wrapper files
COPY .mvn .mvn

# Copy the rest of the application files
COPY lib lib
COPY src src
COPY pom.xml pom.xml
COPY mvnw mvnw

ENV DB_URL="jdbc:postgresql://localhost:5432/db" \
    POSTGRES_USERNAME="app" \
    POSTGRES_PASSWORD="app"
# Build the application
RUN ["chmod", "+x", "mvnw"]
RUN ["./mvnw", "clean", "package", "-DskipTests"]

# Run the application
CMD ["java", "-jar", "./target/quarkus-app/quarkus-run.jar"]
Die Werte für DB_URL,`POSTGRES_USERNAME und POSTGRES_PASSWORD sind sogenannte default Werte. Falls Sie keine Werte beim docker run oder in ihrem k8s-deployment File definieren, werden diese Werte genommen.
Passen Sie dabei auf, dass Sie nur die Ordner, Files etc. kopieren, die sie für den Build brauchen. Ordner wie dist/, target/, node_modules (für nodejs, Angular und sonstige js-Projekte) etc. dürfen nicht in das Docker-Image kopiert werden, da man diese in dem Image auch generieren kann.

Damit wir das ein Image aus diesem Dockerfile erstellen können müssen wir folgende Befehle im Terminal eingeben:

docker build -t <Name des Images> .

5.2. Hochladen mittels docker push

Wir müssen jetzt das Image taggen (markieren)

docker tag <Name des Images> ghcr.io/<Name der Organisation oder Name des Githubusers>/<Name des Packages>:<Version des Packets>

Damit wir jetzt das Paket pushen können müssen uns in ghcr.io einloggen.

docker login -u <Name des Githubusers oder Name von der Organisation> ghcr.io

Danach müssen Sie ein Github Token als Passwort eingeben.

Nach der erfolgreichen Anmeldung kann das Paket gepusht werden

docker push ghcr.io/<Name des Githubusers oder Name von der Organisation>/<Der Tag, den Sie bereits erstellt haben>:<Version>
Es kann schon sein, dass sie die Fehelrmeldung "premission_denied" kriegen. In diesem Fall müssen Sie sich beim Administrator der Organisation reden.

Gratuliere Sie haben ihr Paket erfolgreich generiert.

5.3. Überprüfung

Um zu überprüfen, ob das Image funktioniert könnte man ein docker-compose erstellen. Dabei brauchen wir zwei Services:

  • eine für die Datenbank

  • die andere für das Backend

Zuerst muss die Datenbank gestartet werden und dann die Anwendung.

version: '3.1'

services:

  backend:
    depends_on:
      - db
    container_name: franklyn_backend
    image: ghcr.io/htl-leonding-project/franklyn-application-server-image:latest
    ports:
      - 8080:8080
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
      POSTGRES_DB: db
      DB_URL: jdbc:postgresql://franklyn_postgres:5432/db
    networks:
      - postgres

  db:
    container_name: franklyn_postgres
    image: postgres:14.4-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
      POSTGRES_DB: db
    ports:
      - 5432:5432
    volumes:
      - ./db-postgres/db:/var/lib/postgresql/data
      - ./db-postgres/import:/import
    networks:
      - postgres

  #  adminer:
  #    image: adminer
  #    restart: always
  #    ports:
  #      - 8090:8080

  # https://github.com/khezen/compose-postgres/blob/master/docker-compose.yml
  pgadmin:
    container_name: franklyn_pgadmin
    image: dpage/pgadmin4:5.5
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-pgadmin4@pgadmin.org}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin}
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
      - ./db-postgres/pgadmin:/root/.pgadmin
    ports:
      - 8095:80
    networks:
      - postgres
    restart: unless-stopped

networks:
  postgres:
    driver: bridge

Sie müssen keine Volumes, Network und environment Konfigurationen verwenden, wenn sie das nicht wollen.