在威联通上优雅地使用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写的……(怪不得那么慢)


评论

  1. fd 的头像
    fd

    请问使用自定义 IP 会占用或者说与物理网卡IP冲突么

    1. 小金鱼儿 的头像
      小金鱼儿

      反正都是你自己指定的,避开就好了

  2. hp 的头像
    hp

    我也是用qnap类型ssh手动创建的与本地网络相同子网的网格,发现除了威联通物理机本身和虚拟机能与该网络连通,与相同网络下的其它物理机却不能通。

  3. randolphling 的头像
    randolphling

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

    1. 小金鱼儿 的头像
      小金鱼儿

      我更新了一下……现在可以了

    2. hp 的头像
      hp

      我也发现不能用于主路由同网段。

发表回复

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