让 Docker 同时支持 IPv4 和 IPv6 访问

让 Docker 同时支持 IPv4 和 IPv6 访问

最近在 uptime-kuma 上想添加一个仅 IPv6 主机的监控,但是发现添加了监控后无法 ping 通,但是从 uptime-kuma 所在的主机上是可以 ping 通 IPv6 的主机的。于是查了一下,发现不仅是主机需要支持 IPv6,docker 还需要开启 IPv6 功能才可以让 docker 支持 IPv6。

GitHub - louislam/uptime-kuma: A fancy self-hosted monitoring tool
A fancy self-hosted monitoring tool. Contribute to louislam/uptime-kuma development by creating an account on GitHub.

首先确认你的主机支持 IPv4 和 IPv6,然后有两种办法可以让 docker 支持 IPv6

  1. 让 docker0 的网络支持 IPv6,这样 docker 就全局支持 IPv6 了
  • 编辑 Docker 守护进程配置文件,这个文件默认是没有的,如果没有就创建一个
sudo nano /etc/docker/daemon.json
  • 在文件里添加以下内容,[2001:db8:1::/64] 是一个特殊的IPv6地址段,主要用于文档和示例目的。最好把这段 subnet 换成主机自己的 subnet,不过实测就用这个特殊地址段也是可以的。
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64",
  "experimental": true,
  "ip6tables": true
}
  • 重启 Docker 服务
sudo systemctl restart docker
  • 这样所有创建的 docker 就都支持 IPv6 了
  1. 或者可以创建一个含有 IPv6 网络的 docker 网络,这样所有在这个网络上创建的 docker 就支持 IPv6
  • 创建支持双栈的 docker 网络
# subnet 不能是已经被占用的,如果被占用了需要换一段
sudo docker network create --ipv6 --subnet=172.20.0.0/24 --subnet=2001:db8:2::/64 dualnetwork
  • 在上面创建的双栈网络上部署 docker
# 以部署 uptime-kuma 为例,添加参数 --network dualnetwork 让 docker 部署在 dualnetwork 网络上
sudo docker run -d --restart=always --network dualnetwork -p 3001:3001 -v ./kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1

总结,以上两种方法都很简单易用,具体用哪种方法要看 docker 的部署要求和环境需要。