init
This commit is contained in:
parent
8be6d790a5
commit
241eafb9cd
1 changed files with 137 additions and 0 deletions
137
basics.md
Normal file
137
basics.md
Normal file
|
|
@ -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: <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:
|
||||
```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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
Add table
Reference in a new issue