有这个需求是因为我要用docker的jellyfin来播放ipv6的iptv源,也就是必须要让docker容器获取到能够和外界通信的ipv6地址。

事实上,让容器获取ipv6,无非就两种方式

  • 一种是直接使用host网络
  • 另一种则是建立ipv6子网,通过nat6来通信,又或是macvlan,这两种看做是同一种

让我选择,必然是第一种,因为容器使用ipv6的需求不是很多,为数不多的容器使用host网络,只要端口之间没有什么冲突,几乎没啥风险,于是很快就操作起来,实操千万种曹尼玛,结果的发现却让人哭笑不得。

1.首先打开路由器的ipv6功能,让群晖获取ipv6,没啥问题。

file

2.打开群晖7.2的docker套件也就是Container Manager->网络,查看host,什么鬼,ipv6 已禁用!!!

file

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通信是否正常:

file

毫无意外,通信正常!

12 thoughts on “群晖7.2 docker 开启 ipv6”
  1. 博主 我是关键字找到这里的。。
    是搜到$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开启给加进去了。但是我当初不知道为啥给注释掉了。。恢复就好了。。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注