243 lines
11 KiB
Markdown
243 lines
11 KiB
Markdown
# Docker-Fobi Begleitmaterial
|
|
## Schulungsumgebung
|
|
Jeder Teilnehmer hat am Schulungstag einen Cloud-Server zur Verfügung:
|
|
- 2 Kerne
|
|
- 4GB RAM
|
|
- 80GB SSD
|
|
- debian13 Grundinstallation
|
|
|
|
Die Server haben jeweils einen *Wildcard-DNS-Record* gesetzt, so dass sie unter beliebigen Namen in ihrem Bereich aufgerufen werden können.
|
|
Die Basis-Adressen folgen dem Schema `fobiX.benbex.de`, wobei X die Teilnehmernummer ist:
|
|
```
|
|
Teilnehmer 1 -> fobi1.benbex.de
|
|
Teilnehmer 2 -> fobi2.benbex.de
|
|
```
|
|
|
|
Damit sind dann auf dem Server fobiX.benbex.de die Dienste zum Beispiel so zu unterscheiden:
|
|
- Webserver: **webserver**.fobiX.benbex.de
|
|
- Nextcloud: **nextcloud**.fobiX.benbex.de
|
|
- irgendwas anderes: **wurschdsalat**.fobiX.benbex.de
|
|
|
|
## Vorbereitungen
|
|
Damit ein vernünftiges Arbeiten mit dem Server möglich ist, benötigst du einen SSH-Client:
|
|
Linux / MacOS / Windows11: integriert ins System. Öffne ein Terminal (bei Windows *cmd*) und gib ein:
|
|
```sh
|
|
ssh fobiX.benbex.de -l root
|
|
```
|
|
das `-l` steht für "Login Name" und '*root*' ist der administrative Nutzer bei Linux.
|
|
(das *X* ersetzt du durch deine Nummer 1-6)
|
|
|
|
Windows10 vor Version 1809: Du benötigst ein Zusatzprogramm, z.B. [putty.exe](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
|
|
|
|
|
|
Bei der ersten Verbindung erhältst du eine Warnung:
|
|
```
|
|
The authenticity of host 'fobiX.benbex.de (<IP-Adresse>)' can't be established.
|
|
ED25519 key fingerprint is SHA256:u5Fb2WImIBh5e/FoRCzgK2uxTpL06o93XiPa+AroL+4.
|
|
This key is not known by any other names.
|
|
Are you sure you want to continue connecting (yes/no/[fingerprint])?
|
|
```
|
|
Diese Warnung ist unter normalen Bedingungen wirklich ernst zu nehmen! Ein Server, den man schon kennt, darf diese Meldung NIE verursachen. Hier merkt man, wenn ein Bösewicht sich eingeklinkt hat. In unserem Fall ist die aber normal und der Aufwand, den Fingerabdruck des Servers zu verifizieren ist für den geplanten Zweck zu aufwändig, so dass wir hier in naivem Vertrauen `yes` eintippen (bzw. anklicken, falls unter Windows mit putty)
|
|
Nachdem du dich mit dem Passwort (steht in den geteilten Notizen im BigBlueButton) authentifiziert hast, begrüßt dich nun der Server mit der "message of the day (motd)" und anschließend mit dem System-Prompt:
|
|
```
|
|
Linux fobiX 6.12.41+deb13-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.41-1 (2025-08-12) x86_64
|
|
(...)
|
|
root@fobiX:~#
|
|
```
|
|
Am *Prompt* (`root@fobiX:~# `) kannst du schon einiges sehen:
|
|
- `root` dein aktuell aktiver Nutzername
|
|
- `fobiX` der Hostname des Servers, an dem du angemeldet bist
|
|
- `~` du befindest dich gerade in deinem *Homeverzeichnis*
|
|
- `#` du besitzt root-Rechte (bei nicht privillegierten Nutzern steht da `$`)
|
|
|
|
## Erste Schritte
|
|
1. Nachdem verteilt wurde, wer welchen Server bekommt, solltest du den Server auf den neuesten Update-Stand bringen, damit wir alle die selben Voraussetzungen vorfinden.
|
|
- Paketquellen aktualisieren:
|
|
```sh
|
|
root@fobiX:~# apt update
|
|
```
|
|
- Alle Updates ohne erneute Rückfrage installieren:
|
|
```sh
|
|
root@fobiX:~# apt -y upgrade
|
|
```
|
|
Dieser Vorgang dauert je nach verfügbaren updates auch mal länger. Bei unseren frischen Server etwa 30 Sekunden.
|
|
|
|
2. Um dieses Git-Repo auf dem Server verwenden zu können, benötigst du das Programm-Paket `git`, welches du mit einem einfachen Befehl installieren kannst:
|
|
```sh
|
|
root@fobiX:~# apt -y install git
|
|
```
|
|
|
|
3. Mit git bist du jetzt in der Lage, das komplette Repo auf deinen Server zu clonen. Die Adresse musst du nicht von Hand abtippen (darfst du aber), die kannst du oben im Repo mit einem Mausklick bequem in die Zwischenablage kopieren.
|
|
|
|
```sh
|
|
root@fobiX:~# git clone https://git.az-it.net/az/docker-fobi.git
|
|
```
|
|
danach wechselst du mit `cd d<TAB><ENTER>` in das heruntergeladene Verzeichnis. *d<TAB>* bedeutet: Du tippst den Buchstaben "d" und drückst dann die `<TAB>`-Taste. Dadurch wird der Rest des Kommandos automatisch vervollständigt, was Tippfehler verhindert und Zeit spart.
|
|
|
|
|
|
Damit hast du jetzt Zugriff auf die Dateien aus dem Repo direkt auf dem Server.
|
|
|
|
### Bash-Skripte im Verzeichnis "scripts"
|
|
um verschiedene Vorgänge zu beschleunigen, habe ich die Befehlsabfolgen in Bash-Skripte verpackt. Das hat den Vorteil, dass man die Befehle dann nicht mehr einzeln von Hand eingeben muss, sondern durch den simplen Aufruf des Skriptes automatisch laufen lassen kann.
|
|
Das läuft dann immer gleich ab.
|
|
**Beispiel 1:**
|
|
führe das Skript `00-Beispiel1.sh` aus, indem du
|
|
```sh
|
|
root@fobiX:~# bash scripts/00-Beispiel1.sh
|
|
```
|
|
ausführst. Tippe dabei nicht unnötig viel von Hand, sondern verwende oft die **<tab>-Taste**.
|
|
hier z.B. `bash sc<TAB>00<TAB>`
|
|
|
|
### Übersichtlicheren Systemprompt setzen
|
|
Im Verzeichnis prompts sind verschiedene Systemprompt-Definitionen gespeichert.
|
|
Um das Terminal etwas zu verschönern (und übersichtlicher zu machen) setze den Systemprompt durch Eingabe von
|
|
```sh
|
|
. prompts/mit_datum_und_returncode
|
|
```
|
|
(vergiss auch hier die `<TAB>`-Taste nicht...)
|
|
|
|
## Docker-Host vorbereiten
|
|
der Server benötigt einige Pakete, damit er seinen Dienst als Docker-Host antreten kann.
|
|
Zusätzliche Pakete sind nötig, damit die Hilfs-Scripte ordnungsgemäß laufen können.
|
|
|
|
Von Hand würde man jetzt die [offizielle Docker.com Anleitung "Install Docker Engine on Debian"](https://docs.docker.com/engine/install/debian/) durchspielen.
|
|
Einfacher geht es, wenn schon jemand™ ein "ansible-playbook" hergestellt hat. Zufälligerweise liegt hier eins im Repo.
|
|
Ein Ansible-Playbook ist eine Datei, die für das Open-Source-Automatisierungs-Tool ansible einen Zustand eines Servers beschreibt. Ansible kümmert sich dann darum, diesen Zustand herzustellen.
|
|
|
|
Um dieses Playbook zu verwenden benötigt man natürlich "ansible".
|
|
|
|
ansible installieren und anschließend direkt alles aus ["Install Docker Engine on Debian"](https://docs.docker.com/engine/install/debian/) automatisch durchführen kannst du mit dem Skript `01-install-ansible-and-run-playbook.sh`. Wie gerade schon geübt machst du das mit dem Befehl
|
|
```sh
|
|
root@fobiX:~# bash scripts/01<TAB><ENTER>
|
|
```
|
|
|
|
einen Wimpernschlag später (oder 100...) ist docker auf dem Server fertig eingerichtet.
|
|
|
|
### Test, ob alles geklappt hat
|
|
|
|
#### Version prüfen
|
|
Wenn du `docker version` eintippst, sollte die Ausgabe in etwa so aussehen:
|
|
```
|
|
# docker version
|
|
Client: Docker Engine - Community
|
|
Version: 28.5.1
|
|
API version: 1.51
|
|
Go version: go1.24.8
|
|
Git commit: e180ab8
|
|
Built: Wed Oct 8 12:17:24 2025
|
|
OS/Arch: linux/amd64
|
|
Context: default
|
|
|
|
Server: Docker Engine - Community
|
|
Engine:
|
|
Version: 28.5.1
|
|
API version: 1.51 (minimum version 1.24)
|
|
Go version: go1.24.8
|
|
Git commit: f8215cc
|
|
Built: Wed Oct 8 12:17:24 2025
|
|
OS/Arch: linux/amd64
|
|
Experimental: false
|
|
containerd:
|
|
Version: v1.7.28
|
|
GitCommit: b98a3aace656320842a23f4a392a33f46af97866
|
|
runc:
|
|
Version: 1.3.0
|
|
GitCommit: v1.3.0-0-g4ca628d1
|
|
docker-init:
|
|
Version: 0.19.0
|
|
GitCommit: de40ad0
|
|
```
|
|
|
|
#### einen Container starten:
|
|
Weil sich [hello world](https://de.wikipedia.org/wiki/Hallo-Welt-Programm) als Tradition etabliert hat, wollen auch wir unseren ersten Container in dieser Tradition starten:
|
|
```
|
|
root@fobiX:~# docker run hello-world
|
|
```
|
|
Wenn hier sinnvoller output kommt, dann
|
|
- ist docker korrekt installiert
|
|
- kann der docker-Dienst auf die ***Docker-Registry*** zugreifen und dort automatisch nach ***Images*** suchen und sie herunterladen.
|
|
- hat der Container seine Aufgabe erfüllt und sich beendet.
|
|
|
|
Jetzt rufst du diesen Befehl noch zwei drei mal auf, damit wir gleich beim nächsten Schritt was zu sehen haben :)
|
|
|
|
#### laufende Container auflisten
|
|
`docker ps` listet die laufenden Container auf:
|
|
```
|
|
root@fobiX:~# docker ps
|
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|
root@fobiX:~#
|
|
```
|
|
wie du siehts, siehst du nix. Klar, es läuft ja kein Container mehr :)
|
|
|
|
erweitere den Befehl mit dem Parameter `-a` ("bedeutet all")
|
|
```
|
|
# docker ps -a
|
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|
7bb05fa9feff hello-world "/hello" 4 minutes ago Exited (0) 7 minutes ago beautiful_elion
|
|
dcb9ee2e3a89 hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago adoring_snyder
|
|
4b350e1e7f74 hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago kind_brattain
|
|
root@fobiX:~#
|
|
```
|
|
Damit siehst du auch die ganzen Container, die zwar erstellt wurden, aber nicht mehr laufen.
|
|
Diesen Datenmüll wollen wir gerne entfernen:
|
|
- einzeln: `docker rm 7bb0` entfernt den Container, dessen CONTAINER ID mit 7bb0 anfängt.
|
|
- mehrere: `docker container prune` entfernt alle Container, die nicht mehr laufen.
|
|
|
|
```bash
|
|
root@fobiX:~# docker container prune
|
|
WARNING! This will remove all stopped containers.
|
|
Are you sure you want to continue? [y/N] y
|
|
Deleted Containers:
|
|
7bb05fa9feffa5ea28a08c715983e1d7be75289296fa75486043fa32ffe43eab
|
|
dcb9ee2e3a895803c24796bdf68aa2dea7e1fc6131ffd76194dd522d01ec427b
|
|
4b350e1e7f74eccffc220174e8b16d3e8ceac890b826dcb9b817324c9ef8bba3
|
|
```
|
|
|
|
Um gar nicht erst alte Container herumliegen zu lassen kann man den Container mit dem Parameter --rm ("remove") starten. Dann wird er nach dem Stoppen direkt gelöscht:
|
|
|
|
```bash
|
|
root@fobiX:~# docker run --rm hello-world
|
|
|
|
Hello from Docker!
|
|
This message shows that your installation appears to be working correctly.
|
|
|
|
To generate this message, Docker took the following steps:
|
|
1. The Docker client contacted the Docker daemon.
|
|
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
|
|
(amd64)
|
|
3. The Docker daemon created a new container from that image which runs the
|
|
executable that produces the output you are currently reading.
|
|
4. The Docker daemon streamed that output to the Docker client, which sent it
|
|
to your terminal.
|
|
|
|
To try something more ambitious, you can run an Ubuntu container with:
|
|
$ docker run -it ubuntu bash
|
|
|
|
Share images, automate workflows, and more with a free Docker ID:
|
|
https://hub.docker.com/
|
|
|
|
For more examples and ideas, visit:
|
|
https://docs.docker.com/get-started/
|
|
|
|
root@fobiX:~# docker ps -a
|
|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|
root@fobiX:~#
|
|
```
|
|
|
|
## Der erste "*echte*" Container
|
|
wir wollen jetzt einen richtigen Webserver mit Docker aufsetzen :)
|
|
|
|
1. Container mit Webserver "nginx" starten: `docker run --name webdemo -d -p 8080:80 nginx`
|
|
Die Parameter hier bedeuten folgendes:
|
|
- `--name webdemo` optional - Gibt dem Container den angegebenen Namen. Wenn man den Namen nicht selbst festlegt, bekommt er einen zufälligen (z.B. "adoring_snyder")
|
|
- `-d` Lässt den Container im Hintergrund laufen ("d" steht für "detached")
|
|
- `-p 8080:80` verbindet den Port 8080 des Hosts mit dem Port 80 im Container
|
|
|
|
2. mit einem Browser nach http://fobiX.benbex.de:8080 surfen und schauen, was da zu sehen ist.
|
|
|
|
docker cp webroot/index.html webdemo:/usr/share/nginx/html/
|
|
docker stop webdemo
|
|
docker start webdemo
|
|
docker rm -f webdemo
|
|
|
|
|