环境

服务端:群晖DSM 6.x,Docker
客户端:macOS,Chrome

症状

1. 登录二维码加载缓慢或一直不出现

image.png

2. 文件相关操作缓慢

即使登录成功后,列出文件,或者其他文件相关的操作,都很卡顿。

原因

这里只说个人遇到的,且假设不是CloudDrive本身的问题。
最有可能的原因,是CloudDrive容器使用了ipv6,某些未知原因(比如网络问题),通过ipv6访问阿里云盘的接口,会出现缓慢甚至无响应的情况。

怎样确认容器是否使用了ipv6?

群晖自带的Docker套件可以查看:
image.png
其他类似Portainer之类的工具同理。

通过命令行查看:

  1. sudo docker inspect clouddrive | grep GlobalIPv6Address
  2. # 如果显示出来的 GlobalIPv6Address右边的值 不是空的,就表示使用了ipv6
  3. # "GlobalIPv6Address": "xxx:db8:1::22::c",
  4. # "GlobalIPv6Address": "xxx:db8:1::22::c",
  5. # 或者,你不确定容器所在的网络是不是默认的bridge,可以这样:
  6. sudo docker inspect clouoddrive
  7. # 这条命令会显示整个容器的信息,
  8. # 拉到最下面可以看到【"Networks": {】,
  9. # 这部分就是容器加入到的网络信息(可以加入多个网络),
  10. # 一般来说,如果创建容器时没特意指定,网络一般是bridge。
  11. # 如果是用docker-compose创建的,可能会有类似下面这个"clouddrive_default"网络,
  12. # 具体还是看怎么创建的。
  13. # 这里,我们只需要知道容器加入到了哪些网络,有没有被分配ipv6地址(GlobalIPv6Address)。
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "clouddrive_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "5415ae0efb",
                        "clouddrive"
                    ],
                    "NetworkID": "b4154860018c607cc104eb921861f48d0b0efab0f88db2661669270bcf5617",
                    "EndpointID": "c6f0afd4284cb232b4ed5d5834cf5108d7f51c500f881f63132a88072b0747",
                    "Gateway": "172.22.0.1",
                    "IPAddress": "172.22.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "01:12:ab:12:01:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

解决

解决方式1:容器使用ipv4网络

注:每张图下方都有同样效果的shell命令,实际上用命令也很容易处理。

1. 退出原网络

image.png

# 如果是shell,则是这样:
sudo docker network disconnect bridge clouddrive

2. 新建一个不开启ipv6的docker网络

image.png

# 如果是shell,则是这样:
# 就这么简单,默认是没开启ipv6的
sudo docker network create no-ipv6

3. 加入新网络

image.png

# 如果是shell,则是这样:
sudo docker network connect no-ipv6 clouddrive

解决方式2:容器优先使用ipv4解析域名

临时解决

修改容器的/etc/gai.conf配置文件。

sudo -i

# 复制文件到宿主机,在任意目录执行皆可
docker cp clouddrive:/etc/gai.conf ./gai-for-editing.conf
# 备份一下原始文件,是个好习惯
cp ./gai-for-editing.conf ./gai-original.conf

# 编辑文件
vim ./gai-for-editing.conf

# 打开文件后,输入以下指令(别忘了前面的英文冒号),以查看行号
:set number

# 然后输入以下指令,以定位到第54行(也可能不是第54行,反正找到一样内容的行就行)
:54

把第54行开头的**#**号删除

 51 #
 52 #    For sites which prefer IPv4 connections change the last line to
 53 #
 54 precedence ::ffff:0:0/96  100
# 先按一下Esc键
# 然后输入以下指令,以保存和退出编辑
:wq

# 把修改后的文件覆盖到容器
docker cp ./gai-for-editing.conf clouddrive:/etc/gai.conf

# TODO 暂时不清楚修改`/etc/gai.conf`后,如何不重启容器就使其生效
# 所以暂时通过 重启容器 达到目的
docker restart clouddrive

完成以上步骤后,重新进入CloudDrive网页后台,看是否能正常加载二维码或者文件列表。

特殊情况需要恢复容器里的配置文件(如没问题请不要做此操作,略过即可):

# 开始时备份的文件就派上用场了
docker cp ./gai-original.conf clouddrive:/etc/gai.conf

docker restart clouddrive

如果正常的话,刚才的两个conf文件,有需要可以保留,做个备份,也可以删除:

rm ./gai-for-editing.conf ./gai-original.conf

持久化解决

在主机放一份修改好的gai.conf文件,然后在创建容器时,把该文件映射进容器即可。
详细步骤可以在另一篇TODO文章里查看

by 上下九村士
转载请注明出处、链接