在威联通上优雅地使用 Docker

用了快两年了,才发现原来威联通上是可以用 docker-compose 的,然后 docker-compose 真香。

Docker/Container Station 早就用上了。魔法上网、去广告、下载,大致也就这么多吧。用着是蛮爽的,但是对于版本控来说,每次升级镜像文件,都需要把 docker 销毁、重新拉镜像、重建实例,需要重新将很多参数(例如 volumes)复制来粘贴去的,比较麻烦。

前些时候发现威联通的 Container Station 其实是可以自己写 docker-compose 文件的。今晚刚好有点时间折腾下。

目标是这样的:

  1. 对于魔法上网和常用软件部分,能手动分配固定 IP
  2. 能用 portainer 来进行管理

Portainer

本来想直接用界面起一个 portainer 的,但发现它要挂载 /var/run/docker.sock,就只好用 docker-compose 来写了:

version: "3"
services:
    portainer:
        container_name: portainer
        image: portainer/portainer-ce
        restart: always
        ports:
            - "9000:9000"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - /share/Container/Portainer:/data

映射出来个 9000 端口用于 Web 管理,应该就 OK 了。

给 Docker 分配固定 IP

用 Container Station 的时候,里面有个功能比较喜欢:在「网络」部分,可以指定使用 bridge,可以给这个 docker 分配个固定 IP,这样可以把相同类别的 Docker 放在一块儿。但是在平常写 docker-compose 的时候,并没有这么干过。于是,干出事儿了……

照着 docker-compose 的文档,撸出来的 YAML 文件,提交上去,NAS 挂了……完全无响应……只好重置。重置好了之后,继续试验,又挂……总之,挂了四五遍之后,终于摸索出来了。

基本概念之类的东西,见 docker-compose 的文档。蛮……不清晰的……😂不想看文档的话,去 portainer 里面自己创建个网络,看看选项都有哪些。

首先,我们需要在 Container Station 里面随便创建一个 Container,网络类型选「Bridge」(因为只有这个可以使用自定义 IP),下方选「Static IP」,然后填写 IP,确定,创建 Docker

然后来到 Portainer,找到 Networks,会发现有个「qnet-static-eth0-xxxxxx」,记下这个名字。这个是 QNAP 替我们创建好的网络,后面其他 Container 可以直接加入它。有兴趣的话可以看看里面的设置:它的 Driver 是很特别的 qnet,而不是在 Docker-compose 里面列出的那些。并且似乎我们没办法自己创建出来一个相同的网络。

version: "3"

services:
  adguard:
    container_name: Adguard
    image: adguard/adguardhome
    volumes:
      - /share/Container/Adguard/conf:/opt/adguardhome/conf
      - /share/Container/Adguard/work:/opt/adguardhome/work
    networks:
      default:
        ipv4_address: 192.168.123.101
        
  clash:
    container_name: Clash
    image: dreamacro/clash-premium
    volumes:
      - /share/Container/Clash:/root/.config/clash
    networks:
      default:
        ipv4_address: 192.168.123.102

networks:
  default:
    external: true
    name: qnet-static-eth0-xxxxxx

限制资源使用量

对于 jellyfin 这种比较耗资源的应用,限制下 CPU 和 Memory 的使用还是很有必要的……

version: "3"
services:
    jellyfin:
        image: jellyfin/jellyfin
        container_name: jellyfin
        network_mode: "host"
        volumes:
            - /share/Container/Jellyfin/config:/config
            - /share/Container/Jellyfin/cache:/cache
            - /share/Multimedia:/media
        restart: "unless-stopped" # 手动停止的话,下次重启 NAS 的时候不会自动启动
        deploy:
            # 这部分我理解为「最大分配多少」
            resources:
                limits:
                cpus: "0.50"
                memory: 512M
            # 这部分我理解为「最少会分配多少」,我不太想开启
            # reservations: 
            #     cpus: "0.1"
            #     memory: 64M

这下子,如果需要升级镜像的话,就会方便很多:去拉一下 latest,然后所有 app/stack 无脑重建一下就好了。

哦对了,对于 docker-compose,container station 和 portainer 好像不能相互管理,即,用啥创建的,就得用啥管理……哎就这样吧~已经能方便不少了。

如果你啥啥东西搞错了……

Container Station 里面的逻辑很奇怪,就比如,如果 docker-compose 文件写错了导致 container 根本起不起来,那么你是删不掉这个 app/stack 的。

这个时候,就需要开启威联通的 SSH 模式,直接 SSH 进去将对应的东西干掉了。

使用 admin 账号,进入 QNAP。

如果你是想干掉某个 container,那么可以直接使用 docker 命令。

如果你是想管理 docker-compose,那么来到 /share/CACHEDEV1_DATA/Container/container-station-data/application/ 。你会看到,所有的 app/stack 都在这里了,每个 app/stack 是一个目录,里面有 docker-compose.yml 文件,还有个 qnap.json 文件。对于运行不起来的 app/stack,可以直接删除对应的文件夹,或者在这里修改 docker-compose.yml,直到运行起来为止。

PS:你会发现 Container Station 是用 Python 写的……(怪不得那么慢)

《在威联通上优雅地使用 Docker》有2条评论

  1. macvlan 能用主路由网段吗?我按照大神的配置设置后,adguard 已经 OK 了,但 clash 没能联上网,请教一下问题所在

    回复

发表评论