IPv4 ist doch legacy, oder?
Ja, genau! Und deswegen sollten wir uns schleunigst mit IPv6 befassen.
Hier lernst du an einem praktischen Beispiel, wie du Docker mit IPv6 auf einem Hetzner Cloud Server zum Laufen bekommst.
Die Test Umgebung
Als Test-Server verwende ich einen CX11 Cloud-Server von Hetzner. Bei anderen Hostern wie AWS oder deinem Rechenzentrum des Vertrauens geht das natürlich genau so, Voraussetzung ist lediglich IPv6 Support und Linux.
Ich habe bei meinem CX11 die öffentliche IPv4 Adresse deaktiviert. Dies spart nicht nur 60ct / Monat, sondern beweist auch, dass wir wirklich mit IPv6 arbeiten.
Läuft denn IPv6 überhaupt?
Das lässt sich ganz einfach überprüfen, über Google 🎉
Google unterstützt den Zugriff über IPv4 und IPv6 gleichermaßen, allerdings gibt es einen speziellen Endpunkt ipv6.google.com welcher - wie der Name schon sagt - nur über IPv6 erreichbar.
Diesen können wir mit dem ping
command ansprechen, wenn wir eine Antwort bekommen wissen wir, dass IPv6 funktioniert.
~> ping ipv6.google.com -c1
PING ipv6.google.com(fra16s52-in-x0e.1e100.net (2a00:1450:4001:812::200e)) 56 data bytes
64 bytes from fra16s52-in-x0e.1e100.net (2a00:1450:4001:812::200e): icmp_seq=1 ttl=116 time=3.90 ms
--- ipv6.google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.903/3.903/3.903/0.000 ms
Konfiguration Docker
Der einfachheit halber, gehe ich hier davon aus, dass du Docker bereits auf einem Server installiert hast. Wenn dem nicht so ist, folge dieser Anleitung von Docker
In den Standard Konfiguration von Docker ist IPv6 nicht aktiviert und muss gesondert aktiviert werden. Außerdem gibt es
die Möglichkeit die notwendige ip6tables
Konfiguration von docker übernehmen zu lassen.
Hierfür müssen zusätzlich die Flags ip6tables
und experimental
auf true
gesetzt werden.
Folgende Konfiguration kannst du in einer /etc/docker/daemon.json
verwenden.
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80",
"experimental": true,
"ip6tables": true
}
Um die Änderungen der Konfiguration zu übernehmen, musst du den Docker-Daemon neu starten. Dies geht auf den meisten
Systemen mit dem Befehl systemctl restart docker
.
Hinweis: Auf machen Systemen muss der komplette Host neu gestartet werden, um die Änderungen zu übernehmen.
Ausprobieren!
Nun ist alles vorbereitet, und wir können testweise einen Docker-Container starten und die Verbindung ausprobieren.
Kopiere hierfür diese docker-compose.yaml
auf deinen Server
version: "3"
services:
httpd:
image: "registry.ipv6.docker.com/library/httpd"
restart: "unless-stopped"
ports:
- "80:80"
Diese definiert einen httpd
service, welcher einen Apache2 Web-Server startet.
Beachte hierbei, dass wir als Image registry.ipv6.docker.com/library/httpd
anstelle von nur httpd
verwenden.
Dies hat den Hintergrund, dass der offizielle Docker Hub (noch) kein IPv6 unterstützt.
Bis dies offiziell unterstützt wird, gibt es einen eigenen Endpunkt unter registry.ipv6.docker.com
.
Nun kannst du mit den Commands
docker compose pull
docker compose up
den entsprechenden Docker-Container starten.
Sobald der Container läuft, kannst du die IPv6 Adresse in die Address-Zeile deines Browsers eingeben und auf den
Container zugreifen. Beachte hierbei, dass du IPv6 Adresse im Browser mit eckigen Klammern angeben musst.
In meinem Fall z.B. [2a01:4f8:1c0c:6e23::1]