docker-fobi/basics.md
Jesko Anschütz 241eafb9cd init
2025-11-05 11:38:18 +01:00

4.8 KiB

Docker basics

Container

starten, stoppen, anzeigen

Container startet man mit docker run, stoppt sie mit docker stopund 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
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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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:

    / # wget -qO - ip.benbex.de
    91.98.206.97
    

    Du siehst: Es ist die Adresse deines Servers. docker0macht 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 --rmgestartet hatten, löscht er sich selbst nach dem stop.
    • nginx-Container wieder starten aber mit Portweiterleitung:
    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 -plä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.