标题:一行都不能少:解决纯IPv6服务器Docker容器无法联网的终极指南
标签:Docker, IPv6, VPS, Linux, 网络配置, 教程
你是否也曾兴奋地开了一台纯IPv6的VPS(小鸡),准备在容器世界里大展身手,却发现 docker run 之后的容器死活无法连接网络?ping 不通任何地址,apt update 或 apk add 也全都卡住不动。
别急着怀疑人生或者怪网络不通,这大概率不是服务器本身的问题。问题的根源通常在于:Docker 的默认网络配置是一个纯 IPv4 的世界。它不会自动为容器配置IPv6网络,导致在只有IPv6出口的服务器上,容器就成了一座无法与外界沟通的“孤岛”。
本指南将提供一个简单、标准且一劳永逸的解决方案,让你的Docker容器在IPv6的世界里自由冲浪。
问题根源:Docker的默认网络栈
Docker在设计之初,IPv4网络是绝对的主流。因此,它的默认虚拟网桥 docker0 只会创建和管理IPv4地址。当你启动一个容器时,Docker会分配一个 172.17.0.x 之类的IPv4内网地址,并通过NAT(网络地址转换)技术让容器能访问外部网络。但在纯IPv6的服务器上,这套机制就完全失效了。
要解决这个问题,我们必须手动为Docker启用IPv6支持,并告诉它如何管理IPv6地址和防火墙规则。
准备工作
在开始之前,请确保你满足以下条件:
- 一台纯IPv6的Linux服务器。
- 拥有
root 或 sudo 权限。 - 已经安装了 Docker。
解决方案:三步配置大法
整个过程非常简单,只需要修改一个配置文件即可。
第一步:停止 Docker 服务
为了安全地修改Docker的守护进程配置文件,我们首先需要停止正在运行的Docker服务。
sudo systemctl stop docker
第二步:编辑 Docker 配置文件 (daemon.json)
Docker的所有守护进程级别的配置都存储在 /etc/docker/daemon.json 这个文件中。我们将在这里启用IPv6功能。
备份现有配置(一个好习惯):
这条命令会检查文件是否存在,如果存在,则创建一个以 .bak 结尾的备份文件。
[ -f /etc/docker/daemon.json ] && sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
编辑配置文件:
使用你喜欢的文本编辑器打开它。如果这个文件不存在,下面的命令会自动创建它。
sudo nano /etc/docker/daemon.json
第三步:添加IPv6配置并重启
将以下JSON内容完整地复制并粘贴到 daemon.json 文件中。
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80",
"ip6tables": true
}
配置详解:
编辑完成后,保存并退出(在 nano 中是按 Ctrl + X,然后按 Y,再按回车)。
现在,重启Docker服务以应用新的配置:
sudo systemctl start docker
最后一步:验证成果
服务重启后,我们可以检查一下 docker0 网桥的状态,看看它是否已经获取了IPv6地址。
ip addr show docker0
如果一切顺利,你应该能看到类似下面的输出。注意其中的 inet6 地址:
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
...
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fd00::1/80 scope global
valid_lft forever preferred_lft forever
看到 inet6 fd00::1/80 就代表你的 docker0 网桥已经成功启用了IPv6,并且成为了这个私有网段的网关。
现在,去启动一个容器试试看吧,你会发现它已经可以自由地访问外部IPv6网络了!
常见问题 (FAQ)
问:我的 daemon.json 文件里本来就有内容,怎么办?
答:这是一个非常常见的情况!千万不要直接用上面的内容覆盖掉你原有的配置。你需要将IPv6相关的键值对“合并”到现有的JSON对象中。
例如,如果你原来的配置是:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m"
}
}
你需要手动在其中加入IPv6的配置,并确保JSON格式正确(注意逗号!):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m"
},
"ipv6": true,
"fixed-cidr-v6": "fd00::/80",
"ip6tables": true
}
问:重启Docker失败了,怎么办?
答:大概率是 daemon.json 文件里的JSON格式写错了(比如多了或少了一个逗号)。可以通过以下命令查看Docker的日志来定位问题:
sudo journalctl -u docker.service
、