Avant de commencer : KVM, pas LXC
Docker a besoin de fonctions du noyau Linux qui sont limitées dans un conteneur LXC. Choisissez un VPS KVM, qui a son propre noyau (voir KVM ou LXC). Le VPS Mini suffit pour un ou deux petits conteneurs ; à partir de trois ou quatre services, ou avec une base de données, prenez le VPS Start ou le VPS Plus.
Ce qui coince sans réglage
Deux choses posent problème sur un VPS en IPv6 uniquement :
- Les téléchargements. Certains services n'ont pas d'IPv6, comme le dépôt d'installation de Docker ou le registre ghcr.io. Docker Hub, lui, propose un point d'accès IPv6.
- Les conteneurs eux-mêmes. Le réseau par défaut de Docker n'a que de l'IPv4. Un conteneur qui veut joindre une API, envoyer un e-mail ou télécharger une mise à jour ne trouve aucune route.
Commencez par configurer un service NAT64/DNS64 sur le VPS, comme expliqué dans le guide GitHub en IPv6. Il règle le premier point, et profitera aussi aux conteneurs, qui reprennent les serveurs DNS de la machine.
1. Installer Docker
Une fois le NAT64 en place, le script officiel de Docker fonctionne. Lisez-le avant de l'exécuter, comme tout script téléchargé :
curl -fsSL https://get.docker.com -o get-docker.sh
less get-docker.sh
sh get-docker.sh
docker --version
docker compose version
2. Activer l'IPv6 dans Docker
Créez ou modifiez le fichier /etc/docker/daemon.json :
{
"ipv6": true,
"fixed-cidr-v6": "fd00:d0c:1::/64"
}
fd00:d0c:1::/64 est un réseau privé IPv6 (une adresse ULA, l'équivalent des 192.168.x.x de l'IPv4). Vos conteneurs y reçoivent une adresse, et Docker traduit leur trafic sortant vers l'adresse publique du VPS, exactement comme il le fait en IPv4. C'est nécessaire, car votre VPS n'a qu'une seule adresse IPv6 publique (/128) : impossible d'en donner une par conteneur. Redémarrez Docker :
systemctl restart docker
3. Vérifier depuis un conteneur
docker run --rm alpine ping -6 -c 3 ipv6.google.com
docker run --rm alpine wget -qO- https://api64.ipify.org
La première commande doit recevoir des réponses, la seconde afficher l'adresse IPv6 de votre VPS : le conteneur sort bien sur Internet par votre adresse. Si l'image alpine ne se télécharge pas, vérifiez le NAT64, ou utilisez directement le point d'accès IPv6 de Docker Hub :
docker pull registry.ipv6.docker.com/library/alpine:latest
4. Docker Compose : activer l'IPv6 sur chaque réseau
Le réglage de daemon.json ne concerne que le réseau par défaut. Compose crée un réseau par projet, qui reste en IPv4 si vous ne le précisez pas. Ajoutez un réseau avec enable_ipv6 :
services:
web:
image: nginx:alpine
ports:
- "8080:80"
networks:
- app
networks:
app:
enable_ipv6: true
Sans sous-réseau indiqué, Docker choisit tout seul un réseau privé IPv6 en fd…. Lancez avec docker compose up -d.
5. Publier un port en IPv6
Un port publié avec -p 8080:80 ou dans la section ports écoute sur toutes les adresses de la machine, IPv6 comprise. Testez depuis votre ordinateur :
curl -6 http://[2001:db8::10]:8080
Remplacez l'adresse par celle de votre VPS. Pour qu'un site soit aussi visible des internautes en IPv4, placez-le derrière Cloudflare comme expliqué dans le guide du VPS IPv6.
"[::1]:8080:80".