Verschiedene Dinge
Verschiedene Grössen
Schwierig zu Transportieren
Dockerfile
FROM
ARG
ENV
COPY
SHELL
sh
bash
RUN
EXPOSE
CMD
Beispieldatei für einen Nginx
FROM ubuntu:24.10 # Definiert die Basis # Ausführen von Code (hier wie in einem Ubuntu) # Installieren von Nginx RUN apt-get -y update && apt-get -y install nginx git curl # Kopieren von lokalen Dateien # Die Nginx Konfigurationsdatei COPY default /etc/nginx/sites-available/default # Das HTML dass ausgeliefert werden soll COPY src/* /usr/share/nginx/html # Definieren, welche Ports geöffnet sind EXPOSE 3000/tcp # Befehl, der beim Ausführen ausgeführt werden soll # Hier, starten vom Nginx CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
Referenz: https://docs.docker.com/reference/dockerfile/
docker build -f Dockerfile -t myimage:1.0.0
docker push myimage:1.0.0
Wird ein Docker Image ausgeführt, wird es zu einem Container
docker run myimage:1.0.0
docker run --name myimage -d myimage:1.0.0
Ein Image kann mehrfach, gleichzeitig ausgeführt werden.
docker run Befehle können sehr schnell, sehr kompliziert werden!
docker run
https://docs.docker.com/reference/cli/docker/container/run/
Eine Datei um Container zu Konfigurieren und das Starten zu vereinfachen.
docker compose up
docker compose down
myservice wird durch ein Dockerfile gebuildet
mysql über ein Image von hub.docker.com
services: myservice: # name des service # Definiert welches Dockerfile dem Service gehört build: context: . # Muss zum Ordner mit einem Dockerfile zeigen dockerfile: Dockerfile # Name des Containers container_name: myservice # Forwarden von einem Container Port nach localhost ports: - "3000:3000" # host-port:container-port # Synchronisiert Dateien local:container volumes: # alle Dateien werden im Container unter /app synchronisiert .:/app/ mysql: container_name: mysql image: "mysql:latest" # Image von hub.docker.com environment: # Environment Variablen - "MYSQL_DATABASE=mydatabase" - "MYSQL_PASSWORD=secret" - "MYSQL_ROOT_PASSWORD=verysecret" - "MYSQL_USER=myuser" ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql # mounten vom persistenten volumen # - ./local:/local volumes: # INFO: Ohne dieses Volumen löscht es die DB bei jedem Neustart # Löschen: `docker volume rm projekt-m324-gruppe-ncooep_mysql-data` mysql-data:
https://docs.docker.com/compose/compose-application-model/
Muss den TCP Port 3000 exposen
Muss auf dem Port 3000 einen Webserver serven.
Nginx
node
sprint-boot/tomcat
Muss auf dem Port 3000 eine Route /up besitzen die ein Status 200 OK zurückgibt.
curl http://localhost:3000/up
Es existiert ein eigenes build Image, damit das produktive Image kleiner ist (keine node_modules).
npm install && npm run build
node server/server.mjs
Diese Datei muss noch individuell angepasst werden!
# Build Image definieren (siehe 'AS build') FROM node AS build ## Ab hier wird im Folder /app gearbeitet WORKDIR /app ## Kopieren der App-Dateien COPY /appname . ## Installieren der Dependencies und Builden der App RUN npm install && npm run build # ------------- # Produktion Image definieren FROM node ## die Standardshell nach bash ändern (kompatibler) SHELL ["/bin/bash", "-c"] ## Ab hier wird im Folder /app gearbeitet WORKDIR /app ## App vom Build Image kopieren (siehe `--from=build`) COPY --from=build /app/dist/appname/ ./ ## Starten des Servers wenn der Container gestartet wird CMD ["node", "server/server.mjs"] ## Expose port 3000 EXPOSE 3000/tcp
docker compose build # buildet alle Images docker compose up -d # -d startet die services im hintergrund (keine logs) docker compose down # stop alle services
docker ps # zeigt alle gestarteten container an docker exec -it containername bin/bash # startet bash im container
https://docs.docker.com/get-started/docker_cheatsheet.pdf