RT
需求:
- Docker容器之间可以通过容器名直接通信 → 自定义network,然后每个docker容器通过compose文件配置加入同一个network
- 由于有PT需求,希望每个Docker容器都能有独立的公网IPv6地址
- 网上查询到的大部分的教程都是通过设置macvlan,设置IPv4和宿主机同一网段(例如192.168.2.0/24),网关设置为路由器,然后通过SLAAC动态获取IPv6的独立地址
- 家里6个人,各种智能家居设备+电子设备,如果将各种容器都加入到和宿主机同一个网段的话,担心IPv4的DHCP池不够用
请问各位佬,是否有其他办法能够使用宿主机内部的Docker网络分配私有的v4 IP,从而不挤压到路由器分配的网段IP池,同时又能分配到独立的公网v6 IP?
16 Likes
答非所问:
换个/16的段,再不够换/8的段,总随便造了吧
你指的是我路由器v4的DHCP池吗?理论上是可以的,就是懒得搞
而且因为是家里人都在用的路由器,能不修改那边的设置就先尽量不动了
P.S. 刚刚我还是试了一下这个招数,发现不知道是我自己哪里没设置好,没啥卵用:
docker会从192.168.2.2开始给容器一个个分配IP,但是显然是docker一厢情愿,IP根本不是路由器网关给分配的,宿主机确实能ping通这些IP,但是无法通过这些IP访问到容器内部的服务端口
等于说容器可以单向向外通过v4/v6进行通信,ping百度也是正常的,但是外部向内访问就是unreachable
lekai
4
这是我的配置
cat /etc/docker/daemon.json
{
“registry-mirrors”: [“https://dockerpull.cn”],
“experimental”: true,
“ip6tables”: true,
“ipv6”:true,
“fixed-cidr-v6”: “fd00::/80”,
“dns”:[“192.168.1.1”,“223.5.5.5”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “10m”,
“max-file”: “3”
}
}
当时参考这个弄的(忽略后面的macvlan那part)
lekai
5
# 加入ipv6设置
# /etc/docker/daemon.json
# 若vps服务商只分配了个别ip,而非网段,则“fixed-cidr-v6”先不填
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/64",
"ip6tables": true,
"experimental": true
}
若在VPS上设置(VPS自己已分配得到ipv6),通过ip -6 route show
拿到网段(比如 2607:f130:0:180::/64
但还需要确定vps服务商给的ipv6是64网段,还是只几个ip,比如cloudcone给的是一个网段下的三个ipv6)以及gateway(default via 2607:f130:0:180::1 dev eth0 metric 1024 onlink pref medium
) 填到"fixed-cidr-v6"字段下即可。 不需要再额外创建一个ipv6网络。对于cloudcone,我们使用 "fd00::/64"做ipv6NAT
# 重启docker
sudo systemctl restart docker
# 查看是否配置成功
docker network inspect bridge
# 可以看到 "Subnet": "fd00::/64",
可能出现的情况是bridge网络已经启用了ipv6,但docker compose 自动创建的docker_default网络没有ipv6,此时参考下述的"ipv6NAT"模式手工创建一个bridge网络(注意subnet网段的前面改为已分得的网段2607:f130:0:180::/64
gateway是2607:f130:0:180::1
)
当"fixed-cidr-v6": "fd00::/60"时(优先用/64模式,支持SLAAC;若有冲突 再使用/80网段),为ipv6NAT模式,可单独创建一个ipv6nat网络
# 创建ipv6网络,由于"fixed-cidr-v6": "fd00::/64"已被默认的bridge使用,此处创建一个新的subnet用于新的ipv6nat
docker network create --subnet=fd01::/64 --gateway=fd01::1 --ipv6 ipv6net
# 在docker compose中使用时,注意可指定使用该ipv6网络,注意 external: true
version: "3"
services:
clash:
cap_add:
- NET_ADMIN
container_name: clash
image: metacubex/clash-meta
# network_mode: host
restart: always
volumes:
- /home/lekai/docker/data/clashMeta:/root/.config/clash
ports:
- 7890:7890
- 7891:7891
- 9090:9090
- 7053:53
networks:
- ipv6net
networks:
ipv6net:
name: ipv6net
external: true
为什么不直接获取运营商下发的ipv6前缀?因为这个前缀会变,似乎无法在docker内配置动态前缀。
lekai
6
这样配置后 我的qbittorrent docker 使用ipv6net 这个bridge 可在ipv6下上传和下载
Ai_Robot
(Ai_机器人)
7
首选要说明的是docker对ipv6的支持并不是很好,一般情况下也没必要开
1、要实现容器之间直接通信,用Bridge模式的网络
2、PT的话你要注意如果多个ipv6地址同时做种会导致做种时间翻倍,多个ip上传下载也可能会触发风控并导致封禁
3、用docker创建的macvlan是不支持动态获取地址的,需要在容器内通过SLAAC DHCP客户端获取
4、你这才几台设备而已,一个/24的网段有200多个地址