Einfaches Dockerfile
Übung 1
- Befehle:
LABEL,CMD - sowie:
-t
- Erstellen Sie ein Dockerfile, welches als Basis-Image
ubuntuverwendet (FROM), dasLabel Author="Ihr Name"enthält (LABEL), und den Befehl["echo", "Mein erstes Docker Image"]ausführt(CMD). - Bilden Sie das Image mit dem Befehl
docker buildx build -t uebung01 .(inklusive Punkt am Schluss) - Überprüfen Sie, ob das Image vorhanden ist, indem Sie
docker image lsausführen. Das Image uebung01 sollte angezeigt werden. - Erstellen Sie einen Container vom eben erstellten Image mit dem Befehl
docker run uebung01.- Es sollte Mein erstes Docker Image ausgegeben werden.
Übung 2
- Zusätzlicher Befehl:
ENTRYPOINT
- Erstellen Sie ein Dockerfile, welches als Basis-Image
alpineverwendet, dasLABEL Author="Ihr Name"enthält, denENTRYPOINT ["echo"]und den BefehlCMD ["Standard Ausgabe"]. - Bilden Sie das Image mit dem Tag
-t uebung02 - Überprüfen Sie, ob das Image vorhanden ist, indem Sie
docker image lsausführen. Das Image uebung02 sollte angezeigt werden. - Vergleichen Sie die Grösse der beiden Images uebung01 und uebung02. Was fällt Ihnen auf? Woran könnte das liegen?
- Erstellen Sie einen Container vom eben erstellten Image mit dem Befehlt
docker run uebung02.- Es sollte "Standard Ausgabe" ausgegeben werden.
- Erstellen Sie einen Container, sodass neue Ausgabe ausgegeben wird.
Übung 3
- Zusätzlicher Befehl:
WORKDIR
- Erstellen Sie ein Dockerfile, welches als Basis-Image
python:alpine3.20verwendet. Fügen Sie wieder dasLABEL Author="Ihr Name"hinzu. Der Standard-Befehl sollCMD ["pwd"]sein (Ausgabe des Arbeitsverzeichnisses). - Bilden Sie das Image mit dem Tag
-t uebung03. - Überprüfen Sie, ob das Image vorhanden ist. Vergleichen Sie die Grösse mit dem
Image uebung02. Beide verwenden
alpineals Basis-Image, trotzdem ist die Grösse unterschiedlich. Warum? - Erstellen Sie einen Container vom eben erstellten Image mit dem Befehlt
docker run uebung03.- Es sollte / ausgegeben werden.
Übung 4
- Erstellen Sie ein Dockerfile, welches als Basis-Image
python:alpine3.20verwendet. Fügen Sie wieder dasLABEL Author="Ihr Name"hinzu. Ändern Sie das Arbeitsverzeichnis (WORKDIR) zu "/app". Der Standard-Befehl sollCMD ["pwd"]sein (Ausgabe des Arbeitsverzeichnisses). - Bilden Sie das Image mit dem Tag
-t uebung04 - Erstellen Sie einen Container vom eben erstellten Image mit dem Befehlt
docker run uebung04.- Es sollte "/app" ausgegeben werden.
Übung 5
- Zusätzlicher Befehl:
RUN.
Nun wollen wir selber Python installieren und verwenden als Basis-Image wieder alpine.
- Erstellen Sie ein Dockerfile, welches als Basis-Image alpine verwendet.
- Installieren Sie python 3.12, indem Sie folgende Befehle ergänzen:
# Use the Alpine image 3.20
FROM alpine:3.20
# Update the package index and install Python 3 and pip
RUN apk add --no-cache python3
RUN apk add --no-cache py3-pip
# Set the working directory
WORKDIR /app
- Fügen Sie wieder das
LABEL Author="Ihr Name"hinzu. Ändern Sie das Arbeitsverzeichnis (WORKDIR) zu"/app". Der Standard-Befehl sollCMD ["python3"]sein. - Bilden Sie das Image mit dem Tag
-t uebung05 - Überprüfen Sie, ob das Image vorhanden ist. Vergleichen Sie die Grösse mit dem Image uebung04. Beide verwenden Alpine als Basis-Image und haben Python installiert, trotzdem ist die Grösse unterschiedlich. Warum?
Übung 6
- Zusätzliches Feature: Optimierung
Wir optimieren das Dockerfile der Übung 5, indem wir die Installation von
Python und Pip in einen RUN Befehl vereinen.
- Kopieren Sie das Dockerfile der Übung 5
- Ersetzen Sie die beiden Zeilen (rot) mit folgendem Befehl (grün). Dies führt dazu, dass die Installation von Python und Pip nur eine Schicht in Anspruch nehmen.
...
# Update the package index and install Python 3.12 and pip
RUN apk add --no-cache python3
RUN apk add --no-cache py3-pip
RUN apk add --no-cache python3 py3-pip
...
- Bilden Sie das Image mit dem Tag
-t uebung06 - Überprüfen Sie, ob das Image vorhanden ist. Vergleichen Sie die Grösse mit dem Image uebung05. Sie sollten einen kleinen Grössenunterschied feststellen können. In diesem Fall ist es nicht viel, kann aber je nach Installation viel ausmachen.
- Sie können die erstellten Layer sehen, indem Sie folgenden Befehl ausführen:
docker image inspect uebung05. Unter dem zweitletzten Eintrag RootFS des angezeigten JSON sieht man die Layer. Bei uebung05 sollten es 4 sein, bei uebung06 nur noch 3. Zu sehen sind die Hash-Werte der Layer (sha256).
Übung 7
- Zusätzlicher Befehl:
COPY.
Jetzt wollen wir ein einfaches Python-Programm laufen lassen. Wir benützen als Basis-Image python:3.13.1-alpine3.20. Dies bedeutet, dass wir die Python-Version 3.13.1 und die alpine-Version 3.20 verwenden. Es ist gute Praxis, konkrete Versionen des Base-Images zu wählen, um Versions-Konflikte mit dem Programm, welches im Container läuft, zu verhindern.
- Erstellen Sie ein Dockerfile mit der Basis
python:3.13.1-alpine3.20 - Definieren Sie als Arbeitsverzeichnis
/app. - Erstellen Sie im Ordner dieser Übung die Datei
app.pyund kopieren Sie folgenden Inhalt hinein.- Achten Sie darauf, dass die Einrückungen gleich sind!
import os
def list_folders_in_root():
# Get the list of all entries in the root directory
entries = os.listdir('/')
# Filter out only directories
folders = [entry for entry in entries if os.path.isdir(os.path.join('/', entry))]
return folders
if __name__ == "__main__":
folders = list_folders_in_root()
print("Folders in the root directory:")
for folder in folders:
print(folder)
- Kopieren Sie
app.pymit demCOPYBefehl in das Arbeitsverzeichnis. - Sorgen Sie mit dem
CMDBefehl dafür, dass die App ausgeführt wird. - Bilden Sie das Image mit dem Tag
-t uebung07 - Erstellen Sie einen Container vom eben erstellten Image mit dem Befehlt
docker run uebung07. - Sie sollten eine Ausgabe aller Ordner im Root-Verzeichnis bekommen: home, bin, run…
Übung 8
- Zusätzliches Feature: ".dockerignore"
Wir wollen nun ein Image erstellen, wo zu Laufzeit angegeben werden kann, welches Python-Skript laufen soll. Zudem wollen wir mit einem sogenannten .dockerignore File definieren, was ignoriert werden soll, wenn wir ein ganzes Verzeichnis kopieren.
- Kopieren Sie den Ordner von uebung07 und nennen Sie in um in uebung08.
- Erstellen Sie ein weiteres Python-Skript mit dem Namen
random_number.pyund kopieren Sie das unten stehende Skript hinein.- Achten Sie wieder auf die Einrückungen.
import random
def random_number():
number_to_guess = random.randint(1, 100)
print(f"The number is {number_to_guess}")
if __name__ == "__main__":
random_number()
- Kopieren Sie im Dockerfile den gesamten Ordnerinhalt in das
Arbeitsverzeichnis hinein. Dies erreichen Sie, indem Sie
COPY . .ergänzen. Den anderen COPY Befehl brauchen Sie nicht mehr. - Damit das Dockerfile selber nicht in das Image kopiert wird, erstellen Sie
eine Datei mit dem Namen
.dockerignoreund ergänzen sie mit dem EintragDockerfilewie folgt.
Dockerfile
- Ändern Sie den Rest vom Dockerfile so ab, dass standardmässig
app.pyausgeführt wird. Man soll jedoch beim Starten des Containers auchrandom_number.pywählen können. - Bilden Sie das Image mit dem Tag
-t uebung08 - Erstellen Sie einen Container vom eben erstellten Image mit dem Befehlt
docker run uebung08. Sie sollten die gleiche Ausgabe wie bei uebung07 erhalten. - Damit Sie das Spiel spielen können, müssen Sie den Container interaktiv
starten:
docker run -it --rm uebung08 random_number.py-itstartet den Container im interaktiven Modus, das heisst, Sie befinden sich nach dem Starten im Container.--rmführt dazu, dass der Container gelöscht wird, sobald Sie den Container beenden.- Mit dem Zusatz
random_number.pyüberschreiben Sie den Standartwert des im Dockerfile definiertenCMDBefehl.
Übung 9
- Zusätzlicher Befehl:
ENV.
Wir kreieren nun ein Image, bei welchem Umgebungsvariablen im Dockerfile gesetzt werden. Umgebungsvariablen sind nützlich, um z.B. eine Applikation zu konfigurieren, oder um Credentials auf eine sichere Art und Weise zur Verfügung zu stellen. So kann man in einer Umgebungsvariable die URL zu einer Datenbank und in einer weiteren Umgebungsvariablen das Passwort der Datenbank speichern.
- Kreieren Sie ein Dockerfile, welches auf
ubuntubasiert. - Setzen Sie die Umgebungsvariablen
VERSION="1.0",MY_NAME="Ihr Name".- Sie können alle Umgebungsvariablen mit dem Befehl
envausgeben.
- Sie können alle Umgebungsvariablen mit dem Befehl
- Erstellen Sie das Image mit dem Tag
-t uebung09. - Erstellen Sie einen Container mit dem Befehl
docker run -it --rm uebung09. Sie sollten unter anderem die von Ihnen gesetzten Umgebungsvariablen sehen. - Mit
docker image inspect uebung09sollten Sie unter Config einen Unterpunkt mit dem Namen Env finden, wo Sie die von Ihnen gesetzten Umgebungsvariablen sehen können.
Übung 10
Wir kreieren ein Image, bei welchem nginx installiert und verwendet wird. Nginx kann man unter anderem als Webserver verwenden. Damit der Webserver erreichbar ist, muss man den entsprechenden Port im Dockerfile "exponieren". Dies geschieht mit dem EXPOSE Befehl.
- Kreieren Sie folgendes Dockerfile:
FROM ubuntu:24.04
LABEL Author="Ihr Name"
RUN apt-get update && apt-get -y upgrade && \
apt-get install -y nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
-
Erstellen Sie das Image mit dem Tag
-t uebung10 -
Erstellen Sie einen Container mit dem Befehl
docker run --rm uebung10. Versuchen Sie, die Standard-Webseite in Ihrem Browser zu öffnen, indem Sie auf die URL http://localhost:80 gehen.- (Es wird nicht funktionieren.) Sie können den laufenden Container mit Ctrl + C beenden.
-
Docker öffnet den Port nur für Kommunikation zwischen Containern im internen Docker-Netzwerk. Es öffnet den Port nicht für Zugriff vom Host-Computer. Um den Zugriff vom Host-Computer zu ermöglichen, müssen Sie den Port mit
-p 80:80freischalten.docker run --rm -p 80:80 uebung10
-
Klappt dies nicht, Windows hat den Port 80 ab und zu belegt, könnt Ihr auch ein anderen Host-Port verwenden. Links ist immer der Host und rechts vom
:der Port im Container.docker run --rm -p 8080:80 uebung10