From 241eafb9cd10092bf84eabb2cbef9b71e1bf33bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesko=20Ansch=C3=BCtz?= Date: Wed, 5 Nov 2025 11:38:18 +0100 Subject: [PATCH] init --- basics.md | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 basics.md diff --git a/basics.md b/basics.md new file mode 100644 index 0000000..6852152 --- /dev/null +++ b/basics.md @@ -0,0 +1,137 @@ +# Docker basics + +# Container + +## starten, stoppen, anzeigen + +Container startet man mit `docker run`, stoppt sie mit `docker stop`und zeigt sie mit `docker ps [-a`] an. + +Beispiel: + +* Container starten +* schauen ob er noch läuft +* schauen, welche Container nicht mehr laufen +* löschen des nicht mehr laufenden Containers + +```shellscript +root@fobiX:/# docker run hello-world +root@fobiX:/# docker ps +root@fobiX:/# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +2ea145a6dc8a hello-world "/hello" 55 seconds ago Exited (0) 54 seconds ago pedantic_moore + +root@fobiX:/# docker rm 2ea145a6dc8a +2ea145a6dc8a +root@fobiX:/# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + +``` + + + + + + + + + + + +# Netzwerk + +## default bridge + +Schau dir mal an, welche Interfaces es auf dem Rechner gibt `ip a s` + +``` +root@fobiX:/# ip a s +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host noprefixroute + valid_lft forever preferred_lft forever +2: eth0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 + link/ether 92:00:06:a5:a0:f8 brd ff:ff:ff:ff:ff:ff + altname enx920006a5a0f8 + inet 91.98.206.97/32 brd 91.98.206.97 scope global dynamic eth0 + valid_lft 72536sec preferred_lft 72536sec + inet6 fe80::9000:6ff:fea5:a0f8/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +3: docker0: mtu 1500 qdisc noqueue state UP group default + link/ether b2:2a:fa:22:30:c0 brd ff:ff:ff:ff:ff:ff + inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 + valid_lft forever preferred_lft forever + inet6 fe80::b02a:faff:fe22:30c0/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever + +``` + +Starte drei Container: + +``` +docker run -itd --rm --name test1 busybox +docker run -itd --rm --name test2 busybox +docker run -itd --rm --name test3 nginx +``` + +###### Untersuchen der Netzwerk-Umgebung: + +* `docker inspect bridge` (oder `docker network inspect bridge`) +* bridge link +* `docker inspect test1` + + + +Docker reicht die Namensauflösung zu den Containern durch, und da sie alle an der gleichne Bridge hängen (wie ein switch) und IP-Adressen aus dem gleichen Netzwerk haben, können sie auch kommunizieren. + +##### Kommunikation zwischen Containern testen + +1. mit einer Shell im Container test1 verbinden: `docker exec -it test1 sh` +2. Verbindungen testen: + 1. `ping -c 3 172.17.0.1` (gateway) + 2. `ping -c 3 172.17.0.4` (wahrscheinlich test3 / nginx) + 3. `ping -c 3 1.1.1.1` (Cloudflare DNS) + 4. `ping -c 3 heise.de` + 5. `ping -c 3 test1` + 6. `wget -qO - 172.17.0.4` "minus Kuh Ohhh Leerzeichen minus" + Du siehst: Kommunikation ist möglich, DNS funktioniert, selbst die Webseite auf test3 lässt sich abrufen. + + Frage deine externe IP-Adresse ab: + ```shellscript + / # wget -qO - ip.benbex.de + 91.98.206.97 + ``` + Du siehst: Es ist die Adresse deines Servers. `docker0`macht also NAT + + Auf dem Server klappt auch `wget -qO - 172.17.0.4` + + Aber wie kommen wir jetzt sinnvoll an den Webserver, also von irgendwo in der Welt? + + Dazu müssen wir einen Port vom Server in den Container weiterleiten: + * nginx-Container stoppen / löschen: `docker stop test3` (da wir ihn mit `--rm`gestartet hatten, löscht er sich selbst nach dem stop. + * nginx-Container wieder starten aber mit Portweiterleitung: + ```shellscript + root@fobiX:/# docker run -itd --rm --name webserver -p 80:80 nginx + ``` + die vorhin gefundene IP-Adresse gibst du jetzt mal in einen Browser ein und solltest dann die NGINX-default-Seite erhalten + + Übrigens: Das `-p`lässt sich zwar leicht merken mit "p wie Port", aber ist eigentlich die Abkürzung für `--publish` + + + +# Netzwerk-Typen + +* **bridge: **Die Container werden an einen virtuellen Switch/Router angeschlossen und können damit untereinander kommunizieren und auch ins Internet +* **none: **Die Container in diesem "Netz" bekommen kein Netzwerkinterface, sind also komplett getrennt. Kein Netzzugriff egal wo hin. +* **host**: Die Container bekommen das Interface des Host durchgereicht. Portkonflikte sind vorprogrammiert. Sicherheit am niedrigsten, Performance vermutlich am größten. +* **macvlan**: DIe Container erhalten eine Netzwerkkarte im Netzwerk des hosts, erscheinen dort also als separate Rechner. Problem möglicherweise bei Portsecurity --> An einem Port viele Mac-Adressen... +* **ipvlan**: Die Container verbinden sich zu externen VLANs. auf dem host als z.B. ***eth0.20*** zu sehen. +* (overlay) Netzwerkoverlay, um Container zwischen verschiedenen Dockerhosts zu vernetzen. + + + + + + +