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.
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.
4. Welche Container Registery gibt es
-
GitHub Container Registry (GHCR)
-
Docker Hub Container Registry
-
Google Artifact Registry (GAR)
-
Red Hat Quay
-
etc.
5. Vorgehensweise
-
Erstellung eines Docker-Images für die Applikation
-
Bauen dieses Images
-
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.