Docker
Docker Installation on Linux
Install Docker
Add Docker's official GPG key
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
Add the repository to Apt sources
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Install Latest version of Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Run a Docker container
To run a Docker container, you can use the following command, replacing <image_name>
with the name of the image you want to run:
This command will pull the Docker image if not already present locally, start a container in detached mode, and assign it the given name.
Create your own Docker Image and Push it to Docker Hub
WIP
What about Docker
Docker is a platform for developing, shipping, and running applications in containers. Containers allow a developer to package up an application with all parts it needs, such as libraries and other dependencies, and ship it all out as one package. By doing so, the developer can be sure that the application will run on any other Linux machine regardless of any customized settings that machine might have that could differ from the machine used for writing and testing the code.
Virtualisierung vs Containerisierung
Container:
- Leichtgewichtig
- Teilt den OS-Kernel mit dem Host
- Enthält nur die notwendigen Anwendungen und Bibliotheken
- Startet schnell und verbraucht wenig Ressourcen
Virtuelle Maschinen: - Schwergewichtig - Enthält das gesamte Betriebssystem (erfordert Hypervisor) - Isolation durch Hypervisor - Langsamer und ressourcenintensiver Start
Docker
Docker ist eine Open-Source-Plattform, die es ermöglicht, Anwendungen in Containern zu verpacken, bereitzustellen und auszuführen. Dadurch werden Anwendungen und deren Abhängigkeiten unabhängig vom Host-Betriebssystem, was das Deployment vereinfacht. Docker-Container sind portable Laufzeitumgebungen, die isolierte und reproduzierbare Umgebungen durch Docker-Images bereitstellen, die alle nötigen Abhängigkeiten enthalten.
Docker-Architektur: - Docker-Engine: Kernkomponente, die Container erstellt und verwaltet. - Docker-Daemon: Hintergrundprozess, der Docker-Objekte (Container, Images, Volumes) steuert. - Docker-CLI: Kommandozeilenwerkzeug zur Interaktion mit der Docker-Engine.
Vorteile von Docker: - Portabilität: Einmal erstellte Container laufen überall (Cloud, Server, lokal). - Konsistenz: Gleiche Umgebungen in Entwicklung und Produktion. - Schnelles Deployment: Container starten schneller als VMs. - Ressourceneffizienz: Container benötigen weniger Speicher und Rechenleistung.
Beispiel für Docker-Befehle:
Hier wird gezeigt wie einfach es ist einen Container zu starten.
Mit diesem Befehl ist es möglich einen Apache2 Webserver in einem Container zu starten. Der Container wird im Hintergrund gestartet und der Port 8888 des Hosts wird auf den Port 80 des Containers gemappt.
Aufbau des Docker-Befehls:
- docker run
: Startet einen neuen Container.
- -d
: Startet den Container im Hintergrund.
- -p 8888:80
: Mapt den Port 8888 des Hosts auf den Port 80 des Containers.
- --name apache2
: Gibt dem Container den Namen "apache2".
- ubuntu/apache2:latest
: Verwendet das Image "ubuntu/apache2" mit dem Tag "latest".
- latest
: Tag des Images, in diesem Fall die neueste Version.
Dockerbefehle
docker run
: Startet einen neuen Container.docker ps
: Zeigt alle laufenden Container an.docker ps -a
: Zeigt alle Container an.docker stop <container_id>
: Stoppt einen Container.docker start <container_id>
: Startet einen gestoppten Container.docker rm <container_id>
: Löscht einen Container.docker rmi <image_id>
: Löscht ein Image.docker images
: Zeigt alle Images an.docker pull <image_name>
: Lädt ein Image herunter.docker push <image_name>
: Lädt ein Image auf Docker Hub hoch.docker exec -it <container_id> bash
: Startet eine interaktive Shell in einem Container.docker logs <container_id>
: Zeigt die Logs eines Containers an.docker inspect <container_id>
: Zeigt detaillierte Informationen über einen Container an.docker stats
: Zeigt die Ressourcennutzung der laufenden Container an.
Docker-Volumes
Persistente Speicherlösung für Docker-Container, die Daten auch nach dem Neustarten des Containers bewahrt.
Docker-Networks
Es gibt 7 verschiedene Netzwerkarten in Docker:
Default Bridge Network: Standard-Netzwerk, das von Docker bereitgestellt wird. - Ein virtuelles Netzwerk.
Docker Netzwerke anzeigen lassen:

NETWORK ID
: Eindeutige ID des Netzwerks.NAME
: Name des Netzwerks.DRIVER
: Treiber des Netzwerks.SCOPE
: Sichtbarkeit des Netzwerks.
Bridge Netzwerk
Standard Netzwerke: bridge
Das Bridge-Netzwerk ist das Standardnetzwerk, das Docker verwendet, wenn kein anderes Netzwerk explizit angegeben wird. Es ist eine virtuelle Netzwerkschnittstelle, die es Containern ermöglicht, miteinander zu kommunizieren, während sie von der Außenwelt isoliert bleiben.
Eigenschaften: - Container erhalten eine eigene IP-Adresse innerhalb des Bridge-Netzwerks (standardmäßig 172.x.x.x). - Container können über diese IP-Adressen oder Container-Namen miteinander kommunizieren. - Die Außenwelt kann auf Container nur zugreifen, wenn Ports explizit freigegeben werden (-p oder --publish). - Es nutzt NAT (Network Address Translation), um den Verkehr zwischen dem Docker-Host und Containern zu ermöglichen.
Vorteile: - Einfache Konfiguration und Verwendung. - Gute Isolation der Container. - Einfacher Zugriff auf Container durch Port-Mapping.
Mit dem Befehl
kann man sich die Informationen zumbridge
Netzwerk anzeigen lassen.
[
{
"Name": "bridge",
"Id": "3d7014a8b159afd9018310fa42a78f7e84fdb6dabab7c5a072146d94eb814f0c",
"Created": "2024-11-05T07:22:58.436486668Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"3f55ac9eac446f2d88b54ba6c31fc81a869e6002303020dd477552f8dad7ba78": {
"Name": "OllamaUI",
"EndpointID": "09b08412df42d0e358130315ce86e322f99427a3effe7d8f3ed6060be26a83f4",
"MacAddress": "02:42:ac:11:00:05",
"IPv4Address": "172.17.0.5/16",
"IPv6Address": ""
},
"95a180a5fe90890294cf71690fe9bcc0534d60d22f71bd5a085b769f13fbc6e5": {
"Name": "my-mysql",
"EndpointID": "31b3324e7f8d07d166f7cd7f7e950ac3ee7f63da87fc326d3513ac15cb1ed420",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"bc27198fa2b63fe07bff11c18be6814e05ba0e54c0bc38f48c7ea150dcf756d7": {
"Name": "buildx_buildkit_wizardly_lamport0",
"EndpointID": "30b2b3362b0cbe37b7b387aa38f8001971fb7ddfec92325d850e8854010668b4",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"c5780243f11251bc99800c91e44e2013ea9813a8dbe20f3edea9cec3cf7592e9": {
"Name": "uptime-kuma",
"EndpointID": "7d006cacd02343fbcbdb8fb261fef188d264bd958683ec4a8003ad1adcb8f5d3",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "65535"
},
"Labels": {}
}
]
Host Netzwerk
Es nutzt NAT (Network Address Translation), um den Verkehr zwischen dem Docker-Host und Containern zu ermöglichen.
Eigenschaften: - Container verwendet die Netzwerk-Schnittstellen des Hosts (z. B. eth0 des Hosts). - Kein Port-Mapping erforderlich, da der Container die gleichen Ports wie der Host verwendet. - Schneller als Bridge, da keine virtuelle Netzwerkschicht dazwischen liegt. - Keine Isolation auf Netzwerkebene.
Vorteile: - Weniger Overhead und daher schneller. - Sinnvoll für Anwendungen, die direkten Zugriff auf das Netzwerk des Hosts benötigen (z. B. Monitoring-Anwendungen).
Nachteile: - Keine Isolation auf Netzwerkebene. - Konfilkte möglich, wenn ein Container und der Host denselben Port verwenden.
Mit dem Befehl
kann man sich die Informationen zu demhost
Netzwerk anzeigen lassen.
[
{
"Name": "host",
"Id": "58c3a04140448fec2277fd593a9912b33f073291b6f063f47d9c107a8394ea5a",
"Created": "2024-08-01T11:20:36.553257125Z",
"Scope": "local",
"Driver": "host",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": null
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0301d49daa889b28000bbc8e1d49599f56fdf2f09ea417e9e4ab36ba5e87b68c": {
"Name": "cloudflared",
"EndpointID": "38e2fff78942b987ea8f5ec50e82be4a27f9522d7302a74ca1452744ec0ef500",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
None Netzwerk
Das None-Netzwerk deaktiviert die Netzwerkkonnektivität des Containers vollständig. Der Container hat keinen Zugriff auf andere Container, den Host oder das Internet.
Eigenschaften: - Container ist vollständig isoliert auf Netzwerkebene. - Keine Netzwerkschnittstelle im Container außer der lo (Loopback-Schnittstelle). - Ideal für Anwendungen, die kein Netzwerk benötigen.
Vorteile: - Maximale Sicherheit und Isolation. - Verhindert versehentliche Netzwerkkonflikte.
Nachteile: - Kein Zugriff auf andere Dienste oder das Internet.
Mit dem Befehl
kann man sich die Informationen zu demnone
Netzwerk anzeigen lassen.
[
{
"Name": "none",
"Id": "e51e946b1190696a71652a49ade22ee15a0dae768e3f8e0b4e9c039f22625435",
"Created": "2024-08-01T11:20:36.547084166Z",
"Scope": "local",
"Driver": "null",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": null
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
Vergleiche der Standard Netzwerke
Feature | Bridge | Host | None |
---|---|---|---|
Isolation | Gut | Keine | Vollständig |
Performance | Moderate | Hoch | Hoch |
Internet-Zugang | Optional (Port-Mapping) | Direkt | Kein Zugang |
Anwendung | Standard-Container | Netzwerkanwendungen | Isolierte Prozesse |
Fazit: - Verwende bridge, wenn du Container isolieren, aber dennoch miteinander kommunizieren lassen möchtest. - Verwende host, wenn die Performance wichtig ist oder der Container direkten Zugriff auf das Host-Netzwerk benötigt. - Verwende none, wenn der Container kein Netzwerk benötigt oder maximale Isolation erforderlich ist.
Nicht-Standard Netzwerke
Neben den Standardnetzwerken (bridge, host, none) bietet Docker auch benutzerdefinierte Netzwerke, die mehr Kontrolle und Flexibilität bei der Konfiguration ermöglichen. Diese Netzwerke erlauben es, Container gezielt zu verbinden und komplexere Netzwerktopologien zu erstellen. Es gibt hauptsächlich zwei nicht-standardmäßige Netzwerke: Overlay und Macvlan, sowie benutzerdefinierte Bridge-Netzwerke.
Benutzerdefiniertes Bridge-Netzwerk
Ein benutzerdefiniertes Bridge-Netzwerk ist eine Erweiterung des Standard-Bridge-Netzwerks mit zusätzlichen Funktionen, wie z. B. benutzerdefinierte Subnetze, IP-Adressen und DNS-Optionen.
Eigenschaften: - Container im selben benutzerdefinierten Netzwerk können sich gegenseitig über ihren Container-Namen erreichen (automatisches DNS). - Ermöglicht benutzerdefinierte Subnetze und statische IP-Adressen. - Die Container sind von anderen Netzwerken isoliert, es sei denn, es wird explizit eine Verbindung hergestellt.
Vorteile: - Erleichtert die Kommunikation zwischen Containern im selben Netzwerk. - Bessere Kontrolle über Netzwerkeinstellungen (z. B. IP-Bereich, Gateway).
Beispiel:
docker network create \
--driver bridge \
--subnet=192.168.1.0/24 \
my_custom_network
docker run --network my_custom_network --name webserver nginx
docker run --network my_custom_network --name appserver my_app
webserver
und appserver
sich gegenseitig über ihre Namen erreichen.
Macvlan-Netzwerk
Das Macvlan-Netzwerk gibt Containern eine eigene MAC-Adresse und macht sie im physischen Netzwerk des Hosts sichtbar. Jeder Container erscheint wie ein eigenständiges Gerät im Netzwerk.
Eigenschaften: - Container erhalten ihre IP-Adresse direkt vom Netzwerk des Hosts, als wären sie physische Geräte. - Container können direkt mit anderen Geräten im Netzwerk kommunizieren, ohne NAT oder Port-Mapping. - Container im Macvlan-Netzwerk sind isoliert von Containern im Host-Netzwerk (sofern keine zusätzlichen Verbindungen erstellt werden).
Vorteile: - Ermöglicht direkten Zugriff auf das physische Netzwerk. - Nützlich für Umgebungen, in denen Container als physische Geräte auftreten sollen (z. B. bei Legacy-Systemen).
Nachteile:
- Keine direkte Kommunikation zwischen Host und Containern im Macvlan-Netzwerk (es sei denn, zusätzliche Konfigurationen wie bridge
werden hinzugefügt).
Beispiel:
docker network create \
--driver macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my_macvlan_network
docker run --network my_macvlan_network --ip 192.168.1.100 nginx
nginx
eine eigene IP-Adresse im gleichen Netzwerk wie der Host.
Vergleich der nicht Standard Netzwerke:
Netzwerktreiber | Kommunikationstyp | Anwendungsfall |
---|---|---|
Bridge | Container-zu-Container | Standard-Container-Kommunikation. |
Benutzerdefiniert Bridge | Isolierte Gruppen von Containern | Einfachere Service-Kommunikation. |
Macvlan | Direktes LAN-Zugreifen | Legacy-Systeme, direkte Netzwerkzugriffe. |
Welches Netzwerk sollte ich verwenden?
- Benutzerdefiniertes Bridge-Netzwerk: Für Container, die auf demselben Host kommunizieren sollen, aber in einer isolierten Umgebung.
- Macvlan-Netzwerk: Für Container, die mit physischen Netzwerken interagieren müssen oder von Legacy-Systemen erkannt werden sollen.
Docker Compose
Hier ist ein Beispiel für einen für einen Apache Webserver und eine MySQL Datenbank.
version: '3'
services:
web:
image: ubuntu/apache2:latest
ports:
- "8888:80"
volumes:
- ./html:/var/www/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: example_db
MYSQL_USER: example_user
MYSQL_PASSWORD: example_password
volumes:
- ./mysql_data:/var/lib/mysql
Erklärung des Docker-Compose-Skripts:
web:
- image
: Verwendet das Image "ubuntu/apache2" mit dem Tag "latest".
- ports
: Mapt den Port 8888 des Hosts auf den Port 80 des Containers.
- volumes
: Mountet das Verzeichnis ./html
des Hosts in das Verzeichnis /var/www/html
des Containers.
db:
- image
: Verwendet das Image "mysql" mit dem Tag "5.7".
- environment
: Setzt Umgebungsvariablen für die MySQL-Datenbank.
- volumes
: Mountet das Verzeichnis ./mysql_data
des Hosts in das Verzeichnis /var/lib/mysql
des Containers.
Zum starten des Docker-Compose-Skripts wird folgender Befehl verwendet:
Mit diesem Befehl werden alle Container im Docker-Compose-Script im Hintergrund gestartet.
Docker Compose befehle
docker-compose up -d
: Startet alle Container in einem Docker-Compose-Projekt.docker-compose down
: Stoppt und entfernt alle Container in einem Docker-Compose-Projekt.docker-compose logs
: Zeigt die Logs aller Container in einem Docker-Compose-Projekt an.docker-compose exec <service_name> bash
: Startet eine interaktive Shell in einem Service eines Docker-Compose-Projekts.docker-compose ps
: Zeigt den Status aller Services in einem Docker-Compose-Projekt an.docker-compose build
: Baut die Images für alle Services in einem Docker-Compose-Projekt.docker-compose pull
: Lädt die Images für alle Services in einem Docker-Compose-Projekt herunter.docker-compose push
: Lädt die Images für alle Services in einem Docker-Compose-Projekt auf Docker Hub hoch.docker-compose restart
: Startet alle Services in einem Docker-Compose-Projekt neu.docker-compose stop
: Stoppt alle Services in einem Docker-Compose-Projekt.docker-compose start
: Startet alle Services in einem Docker-Compose-Projekt.docker-compose down -v
: Stoppt und entfernt alle Container und Volumes in einem Docker-Compose-Projekt.docker-compose top
: Zeigt die Prozesse eines Services in einem Docker-Compose-Projekt an.docker-compose events
: Zeigt die Events eines Docker-Compose-Projekts an.qdocker-compose config
: Zeigt die Konfiguration eines Docker-Compose-Projekts an.docker-compose images
: Zeigt die Images eines Docker-Compose-Projekts an.
Docker Compose Befehle für einzelne Services
docker-compose up -d --scale <service_name>=<number_of_instances>
: Startet mehrere Instanzen eines Services in einem Docker-Compose-Projekt.docker-compose exec <service_name> <command>
: Führt ein Kommando in einem Service eines Docker-Compose-Projekts aus.docker-compose run <service_name> <command>
: Führt ein Kommando in einem neuen Container eines Services eines Docker-Compose-Projekts aus.docker-compose logs -f <service_name>
: Zeigt die Logs eines Services in einem Docker-Compose-Projekt an und folgt ihnen.docker-compose port <service_name> <port>
: Zeigt den Host-Port eines Service-Ports in einem Docker-Compose-Projekt an.docker-compose pause <service_name>
: Pausiert einen Service in einem Docker-Compose-Projekt.docker-compose unpause <service_name>
: Setzt die Ausführung eines pausierten Services in einem Docker-Compose-Projekt fort.docker-compose kill <service_name>
: Beendet einen Service in einem Docker-Compose-Projekt gewaltsam.docker-compose rm <service_name>
: Entfernt einen Service in einem Docker-Compose-Projekt.docker-compose scale <service_name>=<number_of_instances>
: Skaliert die Anzahl der Instanzen eines Services in einem Docker-Compose-Projekt.docker-compose start <service_name>
: Startet einen Service in einem Docker-Compose-Projekt.docker-compose stop <service_name>
: Stoppt einen Service in einem Docker-Compose-Projekt.docker-compose restart <service_name>
: Startet einen Service in einem Docker-Compose-Projekt neu.docker-compose build <service_name>
: Baut das Image für einen Service in einem Docker-Compose-Projekt.docker-compose pull <service_name>
: Lädt das Image für einen Service in einem Docker-Compose-Projekt herunter.docker-compose push <service_name>
: Lädt das Image für einen Service in einem Docker-Compose-Projekt auf Docker Hub hoch.docker-compose exec <service_name> /bin/bash
: Startet eine interaktive Shell in einem Service eines Docker-Compose-Projekts.
Docker Images und Dockerfiles
Docker Images
Ein Docker-Image ist eine schreibgeschützte Vorlage, die alles enthält, um einen Container zu starten. Eigene Docker-Images lassen sich mit Dockerfiles erstellen.
Beispiele für den Aufbau des Namens eines Docker-Images:
<repository>/<image>:<tag>
- repository
: Name des Docker-Repositories.
- image
: Name des Docker-Images.
- tag
: Version des Docker-Images.
wimdevgroup/minecraft:fabric-1.21.1
- Der erste Teil (wimdevgroup) ist der Benutzername.
- Nach dem / steht der Name des Images.
- Der Tag (fabric-1.21.1) gibt die Version des Images an.
Dockerfiles
Ein Dockerfile ist eine Textdatei, die eine Reihe von Anweisungen enthält, um ein Docker-Image zu erstellen. Hier ist ein einfaches Beispiel für ein Dockerfile:
# Basis-Image mit Java
FROM openjdk:24-jdk-slim
# Arbeitsverzeichnis festlegen
WORKDIR /minecraft
# Installieren der benötigten Pakete
RUN apt-get update && apt-get install -y \
nano \
wget \
curl
# Herunterladen der Minecraft-Server-JAR (Fabric)
ADD https://meta.fabricmc.net/v2/versions/loader/1.21.1/0.16.9/1.0.1/server/jar minecraft-server.jar
# EULA akzeptieren
RUN echo "eula=true" > eula.txt
# Minecraft-Port freigeben
EXPOSE 25565
# Speicher festlegen
ENV MEMORY=2G
# Startbefehl für den Server
CMD ["sh", "-c", "java -Xmx${MEMORY} -Xms${MEMORY} -jar minecraft-server.jar nogui"]
Erklärung des Dockerfiles:
- FROM
: Setzt das Basis-Image für das Docker-Image.
- WORKDIR
: Legt das Arbeitsverzeichnis im Container fest.
- RUN
: Führt Befehle im Container aus.
- ADD
: Lädt eine Datei von einer URL herunter und fügt sie zum Container hinzu.
- EXPOSE
: Legt den Port fest, der für den Container freigegeben werden soll.
- ENV
: Setzt eine Umgebungsvariable.
- CMD
: Legt den Standardbefehl fest, der beim Start des Containers ausgeführt wird.
Andere wichtige Dockerfile-Befehle:
COPY
: Kopiert Dateien und Verzeichnisse in den Container.ENTRYPOINT
: Legt den Befehl fest, der beim Start des Containers ausgeführt wird.VOLUME
: Erstellt ein Volumen im Container.USER
: Setzt den Benutzer, unter dem der Befehl ausgeführt wird.LABEL
: Fügt Metadaten zum Image hinzu.ARG
: Definiert eine Build-Variable.ONBUILD
: Führt Befehle aus, wenn das Image als Basis für ein anderes Image verwendet wird.STOPSIGNAL
: Setzt das Signal, das beim Stoppen des Containers gesendet wird.HEALTHCHECK
: Fügt einen Gesundheitscheck zum Container hinzu.SHELL
: Legt die Standard-Shell für den Container fest.MAINTAINER
: Legt den Autor des Dockerfiles fest.
Docker-Image aus Dockerfile bauen
Um ein Dockerfile als Image zu verwenden, muss es gebaut werden. Hier ist der Befehl, um ein Docker-Image aus einem Dockerfile zu bauen:
Dabei definiert -t
den Namen und den Tag des Images, und .
gibt das Verzeichnis an, in dem sich das Dockerfile befindet.
Um das Docker Image dann auszuführen, kann folgender Befehl verwendet werden:
Das image wird für das System gebaut, auf dem der Befehl ausgeführt wird. Das bedeutet, dass das Image nur auf dem System ausgeführt werden kann, auf dem es gebaut wurde. Wenn man es auf einem MacBook baut ist das Image für ARM geräte gebaut und kann nicht auf einem x86 System ausgeführt werden.
Um das Image für ein andere Systeme zu bauen, kann man Buildx verwenden. Buildx ist ein Docker CLI Plugin, das es ermöglicht, Multi-Architecture Images zu bauen.
Um das Docker Image auf Docker Hub hochzuladen, kann folgender Befehl verwendet werden:
Docker Buildx
Docker Buildx ist ein Docker CLI Plugin, das es ermöglicht, Multi-Architecture Images zu bauen.
Installation von Docker Buildx
Das Buildx Plugin wird standartmäßig mit Docker installiert. Um sicherzustellen, dass es installiert ist, kann folgender Befehl verwendet werden:
Um das Buildx Plugin zu aktivieren, kann folgender Befehl verwendet werden:
Das erstellt einen Builder mit dem Namen default
und aktiviert ihn.
Ein Builder ist eine Instanz von Buildx, die verwendet wird, um Images zu bauen.
Bauen eines Multi-Architecture Images
Um ein Multi-Architecture Image zu bauen, kann folgender Befehl verwendet werden:
docker buildx build --builder default --tag wimdevgroup/minecraft:fabric-1.21.1 --platform linux/amd64,linux/arm64 --push -f .Dockerfile .
Dabei definiert --builder default
den Builder, der verwendet werden soll, --tag
den Namen und den Tag.
--platform
definiert die Plattformen, für die das Image gebaut werden soll.
--push
lädt das Image auf Docker Hub hoch.
-f
definiert das Dockerfile, das verwendet werden soll.
.
gibt das Verzeichnis an, in dem sich das Dockerfile befindet. Der Punkt gibt an, dass das aktuelle Verzeichnis verwendet werden soll.
Docker Hub
Docker Hub ist ein Cloud-basierter Dienst, der es Entwicklern ermöglicht, Docker-Images zu speichern, zu verwalten und zu teilen. Docker Hub bietet öffentliche und private Registries, in denen Docker-Images gehostet werden können.
Wenn man einen Docker-Container das erstemal startet, wird das Image von Docker Hub heruntergeladen. Wenn es nicht lokal vorhanden ist.