有这个需求是因为我要用docker的jellyfin来播放ipv6的iptv源,也就是必须要让docker容器获取到能够和外界通信的ipv6地址。
事实上,让容器获取ipv6,无非就两种方式
- 一种是直接使用host网络
- 另一种则是建立ipv6子网,通过nat6来通信,又或是macvlan,这两种看做是同一种
让我选择,必然是第一种,因为容器使用ipv6的需求不是很多,为数不多的容器使用host网络,只要端口之间没有什么冲突,几乎没啥风险,于是很快就操作起来,实操千万种曹尼玛,结果的发现却让人哭笑不得。
1.首先打开路由器的ipv6功能,让群晖获取ipv6,没啥问题。
2.打开群晖7.2的docker套件也就是Container Manager->网络,查看host,什么鬼,ipv6 已禁用!!!
3.好吧,搜索引擎用起来,搜索怎么把群晖docker host的ipv6给打开,搜了一大圈也没发现群晖7.2下面的解决方案,但是7.2以前的版本到有很多开启方式。
有说 /etc/docker/daemon.json 加入 { "ipv6":true,"fixed-cidr-v6":"xxxxx"...}的,
然后systemctl restart docker,群晖7.2的该目录下根本没有此文件,那就创建吧,
执行 systemctl restart docker , no such service,人家群晖7.2根本不是这样玩的,
好吧,就算成功重启了,群晖7.2真的会去加载这个daemon.json吗?我看未必,
还是要运行环境下去分析才能知道。
又看到有的博主说了/usr/syno/etc/packages/Docker/dockerd.json,
加入"ipv6":true,"fixed-cidr-v6":"你的ipv6地址",然后重启。 - -!
群晖7.2下不再称呼Docker了,而是ContainerManager,所以正确的目录为
群晖7.2docker 配置目录为
/var/packages/ContainerManager/etc/dockerd.json
/usr/syno/etc/packages/ContainerManager/dockerd.json
/volume1/@appconf/ContainerManager/dockerd.json(这个要看你docker安装在哪个磁盘)
三个目录其实配置文件都是同一份,随便修改哪个都行,于是一顿操作,然后运行重启
systemctl restart pkgctl-ContainerManager
或者去界面上ContainerManager套件停用再开启
或者synopkgctl stop ContainerManager,synopkgctl start ContainerManager
这三种都是重启方式,都是一样的效果,结果刚重启,dockerd.json中"ipv6":true 消失不见了,
这尼玛肯定有程序处理了,然后分析搜索,看到老外找到了罪魁祸首是
/var/packages/ContainerManager/scripts/start-stop-status,
这个脚本中 $DockerUpdaterBin postinst updatedockerdconf "$(get_install_volume_type)"
这一行把ipv6:true 干掉了,然后注释掉,老外还写了脚本- -!当然是针对老版本群晖的,
老外脚本如下:
#!/bin/sh
synopkgctl stop Docker
sed -i 's/^[^#]*[[:space:]]*\$DockerUpdaterBin postinst updatedockerdconf "\$(get_install_volume_type)"/#&/' /var/packages/Docker/scripts/start-stop-status
sed -i '1a\ "ipv6" : true,' /var/packages/Docker/etc/dockerd.json
synopkgctl start Docker
在实验阶段我当然不会使用脚本,不是不信任老外的脚本,上面这段脚本我看了,没有任何问题,
但我习惯没解决问题之前手动,然后按照上面脚本的思路改了,然后重启。结果"ipv6":true是保住了,
特么的host还是禁用状态,其中一个网桥却有个ipv6,但是host都禁掉了,网桥有ipv6有个毛用,也是不能通信的。
最后我把/var/packages/ContainerManager这个目录下的文件仔细的分析了下,
包括各个目录的作用,没什么头绪,把之前所有的工作全部还原。
到最后也不管了,你禁用ipv6我也要把容器挂你host网络上试试。这一试就特么搞定了,
原来host ipv6显示禁用是假像,容器挂上host就能使用host的ipv6地址通信,
也就是群晖的ipv6地址,瞬间奔溃,搞了一天,最后发现什么都不用干!!
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin-nvidia
restart: always
environment:
- TZ=Asia/Shanghai
- NVIDIA_DRIVER_CAPABILITIES=all
- NVIDIA_VISIBLE_DEVICES=all
network_mode: "host" //compose只要加入这行就能使用host,同时把端口映射屏蔽
#ports:
# - 8096:8096
这件事背后可能是群晖ContainerManager的一个bug,界面显示ipv6已禁用,实际却可以使用。还有一种可能是群晖不希望你使用host网络,故意为之,说不定他希望我们使用web station套件做ipv6的反向代理,但是反向代理确实可以解决外部来访问容器,但是容器内部要和外界ipv6通信是办不到的,比如jellyfin要播放ipv6的iptv源,那就必须要让jellyfin有ipv6地址才能通信。
最后进入容器验证ipv6通信是否正常:
毫无意外,通信正常!
最终还是用了HOST
host最好用
很奇怪,我的aria2连接了host还是不能获取群晖的IPv6
感谢感谢,问题解决了
感谢感谢
一毛一样的经历,哈哈
用host的问题是会遇到端口冲突啊,不然谁会费劲去搞bridge ipv6
请问套件版的怎样开启ipv6呢?
我想怎么我 curl http://[::1]:80不通, 原来这个命令等于 curl http://127.0.0.1:80, 得你本机有80的http服务…
随便测试一个ipv6站点就好
意思就是不管什么软件在docker-compose.yml里加上这句话就可以了?
博主 我是关键字找到这里的。。
是搜到$DockerUpdaterBin postinst updatedockerdconf “$(get_install_volume_type)”
你这个
这个是一个补足群晖syno-iptables功能的脚本里附带的(用来开启透明代理的tproxy功能),,这些代码还是当初我手动加到start-stop-status里的(但是不知道最近折腾了哪里弄的bridge的v6没了,就开始又来折腾)
其实他这个代码后面几行就有一句
cat /var/packages/ContainerManager/etc/dockerd.json | jq ‘. + {experimental: true, “fixed-cidr-v6”: “fd00::/80”, ip6tables: true, ipv6: true}’ > /var/packages/ContainerManager/etc/dockerd.json2; mv -f /var/packages/ContainerManager/etc/dockerd.json{2,}
吧ipv6开启给加进去了。但是我当初不知道为啥给注释掉了。。恢复就好了。。