FranceHostun service RootLab
Guide pratique

Docker sur un VPS IPv6 uniquement.

Par défaut, Docker ne donne que de l'IPv4 à ses conteneurs. Sur un serveur sans IPv4, ils se retrouvent donc coupés d'Internet. Trois réglages suffisent pour que vos conteneurs téléchargent, se mettent à jour et répondent en IPv6.

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.

Pare-feu : Docker ajoute lui-même ses règles pour les ports publiés, aussi en IPv6. Un port publié est donc ouvert au monde entier, même si votre pare-feu le bloque par ailleurs. Pour un service réservé à la machine, publiez-le sur l'adresse locale : "[::1]:8080:80".

Questions fréquentes

Docker fonctionne-t-il sur un VPS LXC ?

Pas de façon fiable : Docker a besoin de fonctions du noyau qui sont limitées dans un conteneur LXC. Choisissez un VPS KVM. Voir KVM ou LXC.

Chaque conteneur peut-il avoir sa propre adresse IPv6 publique ?

Non : chaque VPS reçoit une seule adresse IPv6 publique (/128). Les conteneurs utilisent des adresses privées et Docker traduit leur trafic vers l'adresse du VPS. Pour exposer plusieurs services web, placez un reverse proxy comme Caddy ou Nginx devant eux.

Mon conteneur n'a pas accès à Internet, que vérifier ?

Trois choses, dans l'ordre : que le VPS lui-même joint le site voulu (getent ahostsv6 nom-du-site), que l'IPv6 est activée dans /etc/docker/daemon.json et sur le réseau Compose (enable_ipv6: true), et que le NAT64 est configuré si le site n'a pas d'IPv6.

Puis-je utiliser les images de ghcr.io ?

Oui, avec un service NAT64/DNS64 : ghcr.io n'est joignable qu'en IPv4. La configuration est expliquée dans le guide GitHub en IPv6.

Un VPS KVM pour vos conteneurs

Accès root, SSD, RAM DDR3 ECC, IPv6 dédiée, hébergé en France dès 1,49 € par mois.