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.
-
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
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>]
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
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. |
docker build -t hello-world .
docker run --name hello-world hello-world:latest
docker container ls -a
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
-
docker build -t hello-world .
docker run --rm \ (1)
--name hello-world hello-world:latest
1 | rm … remove → der gestoppte Container wird automatisch gelöscht |
6. Beispiel 3
<!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>
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]
FROM ...
CMD ["tail", "-f", "/dev/null"]
-
Dieses Kommando verhindert, dass der Docker Container beendet wird.