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]