‏ ‏ ‎ ‏ ‏ ‎

1. Grundlagen

  • Docker-Images können aus Docker-Registries gepullt werden

  • Oft ist es aber sinnvoll ein eigenes Image zu bauen.

  • Man kann so eine Umgebung für seine Applikation vorkonfigurieren.

2. Dockerfile

  • Man benötigt hierzu eine Textdatei mit dem Namen Dockerfile (ohne extension)

  • wie in einem Script kann eine Umgebung für das Programm gebaut werden, dass am Ende im docker-Container laufen wird.

  • Es gibt hierfür mehrere Kommandos, die wir nun kennenlernen werden.

build image
  • Jedes Kommando ist ein eigener Layer, daher werden RUN - Kommandos oft mit && verbunden, um die Anzahl der Layer zu reduzieren. → Minimize the number of layers

dockerfile kommandos

3. FROM

  • Zum Auswählen des 'Base Images*

  • Man kann hierfür ein Betriebssystem wählen zB u buntu, alpine oder bereits mit einer Applikation, wie zB nginx, mariadb, postgres, node, …​

  • gibt man keine docker-registry an, wird automatisch https://hub.docker.com verwendet

  • Die Syntax des FROM-Kommandos sieht wie folgt aus:

    FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
Mögliche Verwendung von FROM
FROM openjdk:20-jdk
FROM --platform=linux/arm64 20-jdk
FROM openjdk:latest
FROM openjdk:20-jdk
FROM --platform=linux/arm64 eclipse-temurin:20-jammy
HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

4. Beispiel 1

FROM openjdk:latest (1)
COPY ./src .  (2)
RUN javac HelloWorld.java (3)
CMD java HelloWorld (4)
1 Nur beim Entwickeln :latest verwenden
2 Kopiert alle Files from Ordner ./src in den aktuellen Ordner im Image (root)
3 RUN führt ein Kommando aus
4 CMD ist der eine Befehl, weswegen der Container gestartet wird.
Bauen des Images
 docker build -t hello-world .
Starten des Containers
docker run --name hello-world hello-world:latest
Ansehen des gestoppten Containers
docker container ls -a
Löschen des gestoppten Containers
docker container rm hello-world

5. Beispiel 2

  • Es wird nur das image gewechselt → Java auf Ubuntu

FROM eclipse-temurin:20-jammy
COPY ./src .
RUN javac HelloWorld.java
CMD java HelloWorld
  • Nun ist genau festgelegt

    • welches JDK verwendet wird → temurin 20

    • welches OS verwendet wird → Ubuntu 22.04 LTS Jammy Jellyfish

Bauen des Images
 docker build -t hello-world .
Starten des Containers
docker run --rm \  (1)
           --name hello-world hello-world:latest
1 rm …​ remove → der gestoppte Container wird automatisch gelöscht

6. Beispiel 3

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTL</title>
</head>
<body>
<h1>My Personal Site</h1>
<p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit
</p>
<p>
   Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
</p>
</body>
</html>
Dockerfile
FROM ubuntu:22.04

MAINTAINER stuetz

RUN apt update
RUN apt install -y nginx
COPY index.html /usr/share/nginx/index.html

EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
# build the image
docker build -t my-webserver:v1.0 .

# start the container
docker run --rm \
           -p 8080:80 \
           --name my-web my-webserver:v1.0
  • Man würde eher ein fertiges nginx-image verwenden, als es zu bauen.

7. CMD

  • Jeder Docker Container führt nur EIN Kommando aus:

    • CMD oder

    • ENTRYPOINT

  • Alle .sh files die in /docker-entrypoint.d enthalten sind, werden automatisch beim Starten des Containers ausgeführt. [source]

Dockerfile
FROM ...
CMD ["tail", "-f", "/dev/null"]
  • Dieses Kommando verhindert, dass der Docker Container beendet wird.