标签: docker

  • qBittorrent 设置教程

    qBittorrent 设置教程

    最近在用seedbox刷一个PT站的数据,发现transmission的上传速递一直上不去,

    所以就测试了下qBittorrent,发现果真给力

    但是也有一些问题,就是太吃系统资源了

    最开始是CPU一直接近 100% ,那还好不影响使用

    结果下来一个3T的种子后开始内存 100% ,就导致完全没办法用了

    WEB UI 打不开,主机SSH也很难连上,关键还没了上传速度

    加大了SWAP也没用,最好找到了这片教程

    试了下,效果立竿见影,推荐给大家

     

    [c-alert type=”success”]原文地址:作者:EvineDeng   链接:https://www.jianshu.com/p/ac70172767ed[/c-alert]

    以下内容以4.3.7为例。

    1行为.png

    可用的UI主题清单:https://github.com/qbittorrent/qBittorrent/wiki/List-of-known-qBittorrent-themes

    2下载.png

    本人制作的docker镜像:https://hub.docker.com/r/nevinee/qbittorrent
    可实现下载完成通知、宕机通知、tracker出错超出阈值通知、自动分类、tracker出错打标签、批量修改tracker、检测指定文件夹下未在qbittorrent客户端中做种的文件夹/文件、配合IYUUAutoReseed实现自动重新校验和自动恢复做种、指定设备上线时自动限速、多时段限速、导出做种文件清单、导出未做种文件清单等等等等

    3连接.png
    4速度.png
    5BitTorrent.png

    匿名模式说明:https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode

    6RSS.png

    RSS正则表达式教程:https://www.jianshu.com/p/54e6137ea4e3

    7WebUI.png

    可用的备用WebUI清单见:https://github.com/qbittorrent/qBittorrent/wiki/List-of-known-alternate-WebUIs

    8高级.png

    作者:EvineDeng
    链接:https://www.jianshu.com/p/ac70172767ed
    来源:简书

  • 转载:彼寄-章鱼星球折腾记

    转载:彼寄-章鱼星球折腾记

    [c-alert type=”success”]https://lod.pub/   彼寄-章鱼星球折腾记   [/c-alert]

    [TOC]

    ATV固件 安装(含CE安装)

    硬件准备

    1. 双公USB数据线
    2. U盘
    3. windows系统的电脑
    4. 鼠标/键盘

    软件准备

    1. 晶晨官方的USB Burning Tool
    2. rufus/或者Linux系统的dd
    3. ATV ROM
    4. CoreELEC官方ROM
    5. CoreELEC的dtb
    6. 修改版bootloader

    简单整理了一下章鱼的资源,下载可以来这里

    操作步骤

    1.U盘烧录CoreELEC官方rom dd if=img of=/dev/mmcblk0 bs=1M

    2.将 CE专用的dtb 文件放置到u盘根目录

    3.将U盘插入盒子 通电启动 进入CE系统,配置网络和SSH等

    4.scp传输修改版bootloader到盒子

    5.SSH连接到盒子, 刷入修改版bootloader

    dd if=./bootloader of=/dev/mmcblk0 bs=1M

    5.打开USB Burning Tools 选择ATV镜像

    6.盒子断电,找跟牙签或者同样粗细的东西,插入RESET口,同时使用双公头连接电脑和盒子,几秒后松开RESET,开始刷机。

    7.等待数分钟后,刷机完成。重新通电 & enjoy.

    安装 armbian

    软硬件准备同上,我这里使用的是SD卡

    官方镜像一枚(建议桌面版,可以不需要但不能没有)

    操作步骤

    1.使用Rufus 或者 dd 刷入镜像

    sudo dd bs=4M if=Armbian_20.10_Arm-64_bionic_current_5.9.0.img of=/dev/sdb
    

    2.修改BOOT分区中 extlinux 目录下的extlinux.conf,aml s9xxx栏下 改为 meson-gxm-s912-libretech-pc.dtb 除本行和最后一行外多余部分用#号注释掉

    3.根目录下找到合适的SOC型号,文件名修改为u-boot.ext

    4.下载终端模拟器ansole.apk到U盘,插入章鱼盒子,通电开机

    5.安装ansole,并进入终端,输入reboot update 重启

    6.进入armbian,进行配置。

    armbian禁用zram

    参考这里

    armbian 安装和使用 docker

    安装

    root身份执行

    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh --mirror Aliyun
    

    启动

    service docker start
    

    docker 容器时差问题解决

    #方法一:重启容器,添加以下参数
    -v /etc/localtime:/etc/localtime:ro
    
    #方法二:不重启容器的话,复制文件到容器中
    docker cp /etc/localtime [containerId]:/etc/localtime
    
    #方法三:启动容器时,添加环境变量(推荐)
    -e LC_ALL="en_US.UTF-8" -e TZ="Asia/Shanghai"
    
    #查看容器内的时间和本机时间
    $docker exec [containerId] date
    $date
    

    镜像加速

    登录到阿里云容器面板 进入镜像加速界面

    操作文档 Ctrl CV

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["你的镜像加速链接"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

    安装 portainer

    docker pull portainer/portainer-ce:linux-arm64
    docker volume create portainer_data
    docker run --name portainer -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:linux-arm64
    docker update --restart=always portainer
    

    安装 openwrt

    # openwrt
    ip link set eth0 promisc on
    docker network create -d macvlan --subnet=10.10.10.0/24 --gateway=10.10.10.1 -o parent=eth0 -o macvlan_mode=bridge macnet
    docker import openwrt-bcm27xx-bcm2710-rpi-3-rootfs.tar.gz
    docker run --name openwrt --restart always -d --network macnet --privileged openwrt /sbin/init
    docker exec -it openwrt sh # 配置自身ipv4
    docker restart openwrt # web界面配置网关 关闭DHCP
    # 甜糖部署
    docker pull ericwang2006/ttnode
    docker run -itd   -v /mnt/data/ttnode:/mnts   --name ttnode   --net=macnet --ip=10.10.10.12 --dns=114.114.114.114 --mac-address C2:F2:9C:C5:B2:77   --privileged=true   --restart=always   ericwang2006/ttnode
    docker exec -it ttnode /bin/bash # 配置帐号
    # UPnP出现问题可以在主路由中设置dmz(防火墙) 配置文件如下
    #
      config redirect
            option src              wan
            option proto            all
            option dest_ip          10.10.10.12
            option target           DNAT
    

    vim /etc/network/interfaces

    # Wired adapter #1
    # 为 eth0 分配地址
    #auto eth0
    #allow-hotplug eth0
    #no-auto-down eth0
    #iface eth0 inet static
    #  address 10.10.10.11
    #  netmask 255.255.255.0
    #  gateway 10.10.10.1
    #  dns-nameservers 10.10.10.1
    #  pre-up ifconfig eth0 hw ether de:a5:bc:9c:b9:b4
    #  up ip link set eth0 promisc on
    
    # 不为 eth0 分配地址
    auto eth0
    #allow-hotplug eth0
    #no-auto-down eth0
    iface eth0 inet manual
    
    #iface eth0 inet static
    #address 192.168.1.100
    #netmask 255.255.255.0
    #gateway 192.168.1.1
    #dns-nameservers 192.168.1.1
    #       hwaddress ether # if you want to set MAC manually
    #       pre-up /sbin/ifconfig eth0 mtu 3838 # setting MTU for DHCP, static just: mtu 3838
    
    auto macvlan
    iface macvlan inet static
      hostname Octopus
      address 10.10.10.11
      netmask 255.255.255.0
      gateway 10.10.10.1
      dns-nameservers 10.10.10.1
      pre-up ip link add macvlan link eth0 type macvlan mode bridge
      post-down ip link del macvlan link eth0 type macvlan mode bridge
    
    # Wireless adapter #1
    # Armbian ships with network-manager installed by default. To save you time
    # and hassles consider using 'sudo nmtui' instead of configuring Wi-Fi settings
    # manually. The below lines are only meant as an example how configuration could
    # be done in an anachronistic way:
    # 
    #allow-hotplug wlan0
    #iface wlan0 inet dhcp
    #address 192.168.0.100
    #netmask 255.255.255.0
    #gateway 192.168.0.1
    #dns-nameservers 8.8.8.8 8.8.4.4
    #   wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    # Disable power saving on compatible chipsets (prevents SSH/connection dropouts over WiFi)
    #wireless-mode Managed
    #wireless-power off
    
    # Local loopback
    auto lo
    iface lo inet loopback
    

    修复SSH欢迎界语句无IP显示问题

    vim /etc/update-motd.d/30-armbian-sysinfo

    #SHOW_IP_PATTERN="^bond.*|^[ewr].*|^br.*|^lt.*|^umts.*|^lan.*"
    # Add pattern for macvlan match by Chen on 2021-2-1.
    SHOW_IP_PATTERN="^bond.*|^[ewr].*|^br.*|^lt.*|^umts.*|^lan.*|^mac.*"
    

    宿主机与 docker 容器互联

    ip route add 10.10.10.10 dev macvlan

    宿主机设置网关为docker openwrt

    #修改默认路由
    route del default
    ip route add default via 10.10.10.10 dev macvlan
    #恢复原配置
    route del default
    ip route add default via 10.10.10.1 dev eth0
    

    定时调整灯光

    crontab -e

    #夜间模式灯光
    40 22 * * *     /usr/bin/bash -c 'cd /home/用户目录/python-yeelight && python /home/用户目录/python-yeelight/light_auto_night_mode.py' >> Light.log
    #日间模式灯光
    40 6 * * *      /usr/bin/bash -c 'cd /home/用户目录/python-yeelight && python /home/用户目录/python-yeelight/light_auto_day_mode.py' >> Light.log
    

    保持网络链接

    当章鱼所在的网络状态出现变化(如自身断电重启或主路由重启)章鱼很可能出现无法正确配置网卡的情况(其实是自己懒得去找方法配置),于是通过定时执行脚本的方式去重启故障网络状态下的章鱼。

    vim /root/network-status-check.sh

    #! /bin/bash
    #检测网络连接
    log=/root/log/network$(date +%Y%m%d-%H).log
    #判断输出日志文件是否存在
    ping -c 1 10.10.10.1 > /dev/null 2>&1
    if [ $? -eq 0 ];then
        echo `date` 检测网络正常 
    else
        if [ ! -f ${log} ]
        then
            touch ${log}
        fi
        echo `date` 检测网络异常 >> ${log}
        ifdown eth0
        ifup eth0
        ifdown macvlan
        ifup macvlan
        systemctl restart networking
        #systemctl restart network-manager
        systemctl start docker
     #   ip route del default
      #  ip route add default via 10.10.10.1 dev eth0
        ip route show >> ${log}
        ifconfig >> ${log}
        sleep 5
        ping -c 1 10.10.10.1 > /dev/null 2>&1
        if [ $? -eq 0 ];then
            echo `date` 检测网络恢复到正常 >> ${log}
            ifup macvlan
            systemctl start docker
        else
            echo `date` 网络故障将进行重启操作 >> ${log}
            ip route show >> ${log}
            ifconfig >> ${log}
            reboot
        fi
    fi
    

    vim /etc/crontab

    */5 *   * * *   root    bash /root/network-status-check.sh
    

    参考文章

    Bitwardenrs密码管理器服务

    docker run -itd \
    --restart=always \
    --name bitwarden \
    -e PGID=1000 \
    -e PUID=1000 \
    -e TZ="Asia/Shanghai" \
    -e 'SERVER_ADMIN_EMAIL'='[email protected]' \
    -e 'SIGNUPS_ALLOWED'='false' \
    -e 'INVITATIONS_ALLOWED'='true' \
    -e 'WEBSOCKET_ENABLED'='true' \
    -e 'ADMIN_TOKEN'='' \ ###openssl rand -base64 48 
    -e ROCKET_TLS='{certs="/ssl/uhttpd.crt",key="/ssl/uhttpd.key"}' \
    -v /mnt/data/keys/:/ssl/ \
    -v /mnt/data/bitwarden/:/data/ \
    -p 443:80 \
    bitwardenrs/server:aarch64
    

    参考视频

    Radicale CalDAV服务

    ## 默认安全等级
     docker run -d --name radicale \
        -p 5232:5232 \
        --health-cmd="curl --fail http://localhost:5232 || exit 1" \
        --health-interval=30s \
        --health-retries=3 \
        -v ~/radicale/data:/data \
        -v ~/radicale/config:/config:ro \
        tomsquest/docker-radicale
    
    ## 高安全等级
    docker run -d --name radicale \
        -p 127.0.0.1:5232:5232 \
        --read-only \
        --init \
        --security-opt="no-new-privileges:true" \
        --cap-drop ALL \
        --cap-add CHOWN \
        --cap-add SETUID \
        --cap-add SETGID \
        --cap-add KILL \
        --pids-limit 50 \
        --memory 256M \
        --health-cmd="curl --fail http://localhost:5232 || exit 1" \
        --health-interval=30s \
        --health-retries=3 \
        -v ~/radicale/data:/data \
        -v ~/radicale/config:/config:ro \
        tomsquest/docker-radicale
    

    通过 nginx 添加 SSL反向代理

    server
    {
        listen 5443 ssl http2;
        server_name cal.lod.pub;
        client_max_body_size 4096M;
        # 定义主页url
        index .web;
        # 定义反向代理地址和端口
        location / {
            proxy_pass http://172.17.0.6:5232;
        }
        #HTTP_TO_HTTPS_END
        ssl_certificate   /var/www/html/config/uhttpd.crt;                           
        ssl_certificate_key    /var/www/html/config/uhttpd.key;                        
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        # 497状态码自动跳转 以5443端口打开https
        error_page 497 https://$host:5443$uri;
        # You may need this to prevent return 404 recursion.
        location = /404.html {
            internal;
        }
    }
    

    OneIndex

    docker run -d \
        --name oneindex \
        -p 8085:80 \
        -p 5443:5443 \
        -p 8333:8333 \
        -p 4443:4443 \
        -p 3443:3443 \
        -p 2443:2443 \
        -p 3333:3333 \
        -p 2333:2333 \
        -p 2233:2233 \
        -p 7773:7773 \
        -p 6443:6443 \
        --restart=always \
        -v ~/oneindex/config:/var/www/html/config \
        -v ~/oneindex/cache:/var/www/html/cache \
        -e REFRESH_TOKEN='0 * * * *' \
        -e REFRESH_CACHE='*/10 * * * *' \
        lstcml/oneindex
    

    SSL证书和伪静态支持

    docker exec -it oneindex bash

    vi /etc/nginx/nginx.conf

    修改末尾 virtual host 配置

    # Includes virtual hosts configs.
    include /var/www/html/config/nginx/*.conf;  
    

    将证书文件传至配置文件夹

    vim ~/oneindex/config/nginx/nginx-oneindex.conf

    server
    {
        listen 8085;
        listen 80 ssl http2;
        server_name pan.lod.pub;
        client_max_body_size 4096M;
        index index.html index.php;
        location / {
            index index.html;
            root /var/www/html;
            #Implementing PHP pseudo static
            try_files $uri /index.php?$args;
        }
        #HTTP_TO_HTTPS_END
        # 定义SSL证书位置
        ssl_certificate   /var/www/html/config/uhttpd.crt;                           
        ssl_certificate_key    /var/www/html/config/uhttpd.key;                        
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        # 497状态码自动跳转 以8085端口打开https
        error_page 497 https://$host:8085$uri; 
        # You may need this to prevent return 404 recursion.
        location = /404.html {
            internal;
        }
        #Add PHP support
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
            include fastcgi_params;
        }
        # 加载OneIndex伪静态配置
        include /var/www/html/config/urlRewrite.conf;
    }
    

    vim ~/oneindex/config/urlRewrite.conf

    if (!-f $request_filename){
        set $rule_0 1$rule_0;
    }
    if (!-d $request_filename){
        set $rule_0 2$rule_0;
    }
    if ($rule_0 = "21"){
        rewrite ^/(.*) /?/$1 last;
    }
    

    ShareList

    git clone https://github.com/reruin/sharelist
    cd sharelist
    vim Dockerfile
    docker build -t sharelist:arm64 ./
    
    # ~/sharelist/Dockerfile
    FROM alpine:latest
    
    ADD . /sharelist/
    WORKDIR /sharelist
    VOLUME /sharelist/cache
    
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    RUN apk add --no-cache nodejs
    RUN apk add --no-cache npm 
    
    RUN npm install
    
    ENV HOST 0.0.0.0
    ENV PORT 33001
    
    EXPOSE 33001
    
    CMD ["npm", "start"]
    

    Docker 中文文档

    ArchiveBox

    #创建一个新的空目录并初始化你的收藏集(可以指定任何目录)。
    mkdir ~/archivebox && cd ~/archivebox
    curl -O 'https://raw.githubusercontent.com/ArchiveBox/ArchiveBox/master/docker-compose.yml'
    docker-compose run archivebox init --setup
    
    #启动web服务
    docker-compose up
    docker run -v $PWD:/data -p 8000:8000 archivebox/archivebox:master
    # completely optional, CLI can always be used without running a server
    # docker run -v $PWD:/data -it [subcommand] [--args]
    

    wallabag

    部署服务

    docker run --name wallabag -p 9090:80 -v $HOME/docker/wallabag/data:/var/www/wallabag/data -v $HOME/docker/wallabag/images:/var/www/wallabag/web/assets/images -e LC_ALL="en_US.UTF-8" -e TZ="Asia/Shanghai" -e SYMFONY__ENV__DOMAIN_NAME=https://域名 ugeek/wallabag:arm
    

    添加规则

    docker exec -it wallabag /bin/bash

    vi /var/www/wallabag/vendor/j0k3r/graby-site-config/sspai.com.txt

    # By:ScarletCollar
    # This filter is tested on:
    # https://sspai.com/post/61235
    # https://sspai.com/post/66539 
    
    http_header(user-agent): Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
    
    author: //span[@class='nickname']/text()
    title://dev[@id='article-title']/text()
    date://div[@class='timer']/text()
    body://div[@class='content wangEditor-txt minHeight']
    
    #去除前文matrix首页推荐,有概率误杀正文内容
    strip://hr/preceding-sibling::*
    
    test_url: https://sspai.com/post/61235
    

    crond 资料备份/杂项

    /etc/crontab

    */10 *  * * *   root    bash /root/network-status-check.sh
    7 3     * * 7   root    apt update;apt upgrade -y
    7 */12  * * *   root    RESTIC_PASSWORD=Cret1Owquohot, restic -r rclone:OneIndex:restic backup /home/用户目录/radicale
    0 1     */7 * * root    RESTIC_PASSWORD=Cret1Owquohot, restic -r rclone:OneIndex:restic backup /home/用户目录
    1 4     */15 * *        root    scp root@10.10.10.1:/etc/uhttp* /home/用户目录/oneindex/config/;systemctl restart docker
    

    crontab -e

    #信息推送
    */30 * * * *      /usr/bin/bash -c 'cd /home/用户目录/ && python3 /home/用户目录/etaa_exam_news_wxpush.py' >> wxpush.log 2>&1
    
    #坚果云KeePass文件同步
    7 1 * * *       /usr/bin/bash -c 'curl --user 用户名:应用密钥 https://dav.jianguoyun.com/dav/KeePass/kp.kdbx > /home/用户目录/KeePass/kp$(date "+\%Y\%m\%d").kdbx' && /usr/bin/bash -c 'curl -u 用户名:密码\\) -T /home/用户目录/KeePass/kp$(date "+\%Y\%m\%d").kdbx https://ise.teracloud.jp:443/dav/KeePass/kp$(date "+\%Y\%m\%d").kdbx'
    
    #和彩云签到
    1 6 * * *      /usr/bin/bash -c 'cd /home/用户目录/HeCaiYun && python3 /home/用户目录/HeCaiYun/HeCaiYunSign.py' >> wxpush.log 2>&1
  • Hassio添加Home Assistant Community Add-ons

    Hassio升级了几次,偶然发现原来的supervisor里的Node-Red变成了灰色且无法通过WEBUI升级,而且只显示Official add-ons

    然后google一下找到了,添加Home Assistant Community Add-ons的办法

    在supervisor-加载商店-仓库(Repo)(WEB界面右上角三点 . )

    添加:https://github.com/hassio-addons/repository

     

    参考:https://community.home-assistant.io/t/cant-install-node-red/226245/15

  • Watchtower – 如何优雅地刷 PT

    Watchtower – 如何优雅地刷 PT

    [start-plane type=”2″]转载至:DOV ,原文地址:如何优雅地刷 PT [/start-plane]

    前言

    各大 PT 站一直是我下载高清影视资源、动漫 BD 的好帮手,玩了几年了,虽然没买啥设备,但是当刷子还是有了不少经验(PT(英语:Private Tracker)是一种改良自 BitTorrent 协议 的P2P下载方式,“Private Tracker”指私有种子服务器。与 BT 最大的不同点为:可进行私密范围下载,并且记录每一个用户的详细数据。

    From Wikipedia

    [icon-url href=”https://github.com/Aniverse/inexistence” target=”_blank”]inexistence[/icon-url]

    以前刷 PT 都是用的星大的一键脚本,安装好后就基本上有了需要的环境,自己在安装一下Autoremove-torrents,基本可以满足我的需求。

    不过每次更换服务器都需要很多时间再次编译安装,总归还是麻烦了。最近发现了一个 大佬的项目,基本上把自动 RSS 免费热种、自动删除旧种子、自动签到做齐了,功能十分强大。

    我最终采用的是 qBittorrent+Flexget 的方案,用 Docker 搭建,上述大佬的项目为 Flexget 插件。

    qBittorrent

    由于用 Deluge 总是把机器刷死机,可能是 3O 配置太差了。。。所以我就改用 qBittorrent 了。同时也建议将 Flexget 搭建在不同的机器,因为 Flexget 也很吃内存和 CPU(毕竟是万恶的 Python)。

    首先安装好 Docker Docker Compose,这里就不赘述。

    然后写docker-compose.yml

    version: '3'
    
    services:
      qbittorrent:
        image: linuxserver/qbittorrent:14.2.3.99202004172232-6962-29e9594ubuntu18.04.1-ls73
        container_name: qbittorrent
        restart: unless-stopped
        ports:
          - 8080:8080
          - 53168:53168/udp
          - 53168:53168
        environment:
          PUID: 1000
          PGID: 1000
          TZ: Asia/Shanghai
          UMASK_SET: 022
          WEBUI_PORT: 8080
        volumes:
          - /path/to/config:/config
          - /path/to/downloads:/downloads

    注意 qBittorrent 要看你的 PT 站具体要求什么版本,我用的是 4.2.3,其他的可以去 这里 查。

    然后输入命令:

    docker-compose up -d

    登录 qBittorrent 的 Web 后记得将用于传入连接的端口改为53168

    Flexget

    Flexget 安装

    在一台配置较好的 VPS 上(我用的是 GCP)安装Flexget

    docker-compose.yml

    version: '3'
    
    services:
      flexget:
        image: madwind/flexget
        container_name: flexget
        restart: unless-stopped
        ports:
          - 3539:3539
        environment:
          PUID: 1000
          PGID: 1000
          TZ: Asia/Shanghai
          FG_WEBUI_PASSWD: password  # 替换为你自己的密码,登录 Web 用
          FG_LOG_LEVEL: INFO
        volumes:
          - /path/to/config:/config
        logging:
          driver: "json-file"
          options:
            max-size: "200k"
    
      standalone-chrome:
        image: selenium/standalone-chrome
        container_name: standalone-chrome
        restart: unless-stopped
        ports:
          - 4444:4444
        shm_size: '2gb'

    然后输入命令:

    docker-compose up -d

    Flexget将监听在 3539 端口。

    Flexget 安装插件

    Flexget 的插件安装十分简单,只需要把文件丢进插件文件夹即可。

     config 文件夹下创建名为 plugins 的文件夹,并将 这个项目 的所有 .py 文件和 ptsites 文件夹丢进去,并将 另一个项目 nexusphp.py丢进去。

    然后重新启动Flexget

    docker restart flexget

    Flexget 配置

    以下是我的 Flexget 配置文件的示例:

    web_server:
      bind: '0.0.0.0'
      port: 3539
    
    schedules:
      - tasks: [U2, MTeam]
        interval:
          minutes: 1
    
      - tasks: [ol_resume, nas_resume, ol_delete, nas_delete, ol_modify, nas_modify, ol_clean, nas_clean]
        interval:
          minutes: 5
      
      - tasks: [sign_in]
        schedule:
          hour: 8-23/1
    
    variables:
      headers:
        user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
    
    templates:
      ## Online
      # 从 qBittorrent 获取数据
      ol_from_qbittorrent_template:
        from_qbittorrent_mod: &ol_from_qbittorrent_mod
          host: <OL_HOST>
          port: <OL_PORT>
          use_ssl: false
          username: <OL_USERNAME>
          password: <OL_PASSWORD>
    
      # 基础
      ol_qbittorrent_base_template:
        qbittorrent_mod:
          <<: *ol_from_qbittorrent_mod
    
      # 添加
      ol_qbittorrent_add_template:
        qbittorrent_mod:
          action:
            add:
              category: RSS
              autoTMM: yes
              reject_on:
                dl_limit: 5242880
                dl_speed: no
    
      # 删除
      ol_qbittorrent_delete_keeper_template:
        qbittorrent_mod:
          action:
            remove:
              keeper:
                delete_files: yes
                keep_disk_space: 36
                dl_limit_interval: 900
      
      ## NAS
      # 从 qBittorrent 获取数据
      nas_from_qbittorrent_template:
        from_qbittorrent_mod: &nas_from_qbittorrent_mod
          host: <NAS_HOST>
          port: <NAS_PORT>
          use_ssl: false
          username: <NAS_USERNAME>
          password: <NAS_PASSWORD>
    
      # 基础
      nas_qbittorrent_base_template:
        qbittorrent_mod:
          <<: *nas_from_qbittorrent_mod
    
      # 添加
      nas_qbittorrent_add_template:
        qbittorrent_mod:
          action:
            add:
              category: RSS
              autoTMM: yes
              reject_on:
                dl_limit: no
                dl_speed: no
      
      # 删除
      nas_qbittorrent_delete_keeper_template:
        qbittorrent_mod:
          action:
            remove:
              keeper:
                delete_files: yes
                keep_disk_space: 90
                alt_dl_limit_on_succeeded: 5242880
                dl_limit_interval: 900
    
      ## 多种操作
      # 清理
      qbittorrent_delete_cleaner_template:
        qbittorrent_mod:
          action:
            remove:
              cleaner:
                delete_files: yes
    
      # 修改
      qbittorrent_modify_template:
        qbittorrent_mod:
          action:
            modify:
              tag_by_tracker: true
    
      # 恢复
      qbittorrent_resume_template:
        qbittorrent_mod:
          action:
            resume:
              recheck_torrents: true
    
      # 种子大小筛选
      content_size:
        content_size:
          min: 10
          max: 50000
          strict: no
    
    tasks:
      U2:
        rss: 
          url: https://u2.dmhy.org/torrentrss.php?rows=50&trackerssl=1&passkey=<PASSKEY>&linktype=dl
          other_fields:
            - link
        nexusphp:
          cookie: '<U2_COOKIE>'
          user-agent: '{? headers.user_agent ?}'
          comment: yes
          discount:
            - free
            - 2xfree
          seeders:
            min: 1
        verify_ssl_certificates: no
        content_size:
          min: 10
          max: 120000
          strict: no
        template:
          - nas_qbittorrent_base_template
          - nas_qbittorrent_add_template
    
      MTeam:
        rss: https://pt.m-team.cc/
        accept_all: true
        verify_ssl_certificates: no
        content_size:
          min: 10
          max: 50000
          strict: no
        template:
          - ol_qbittorrent_base_template
          - ol_qbittorrent_add_template
    
      resume: &resume
        priority: 2
        disable: [seen, seen_info_hash, retry_failed]
        if:
          - qbittorrent_state == 'pausedUP' and qbittorrent_downloaded == 0 and qbittorrent_added_on > now - timedelta(hours=1): accept
    
      delete: &delete
        priority: 3
        disable: [seen, seen_info_hash, retry_failed]
        if:
          - qbittorrent_category in ['RSS'] and (qbittorrent_last_activity < now - timedelta(days=2) or qbittorrent_added_on < now - timedelta(days=7)): accept
          - qbittorrent_state == 'missingFiles' or (qbittorrent_state in ['pausedDL'] and qbittorrent_completed == 0): accept
        sort_by: qbittorrent_last_activity
    
      modify: &modify
        priority: 4
        disable: [seen, seen_info_hash, retry_failed]
        accept_all: yes
    
      clean: &clean
        priority: 5
        disable: [seen, seen_info_hash, retry_failed]
        regexp:
          accept:
            - '[Tt]orrent not registered with this tracker'
            - 'Torrent banned'
            - 'Unregistered torrent'
          from: qbittorrent_tracker_msg
    
      ol_resume:
        <<: *resume
        template:
          - ol_from_qbittorrent_template
          - ol_qbittorrent_base_template
          - qbittorrent_resume_template
      
      nas_resume:
        <<: *resume
        template:
          - nas_from_qbittorrent_template
          - nas_qbittorrent_base_template
          - qbittorrent_resume_template
    
      
      ol_delete:
        <<: *delete 
        template:
          - ol_from_qbittorrent_template
          - ol_qbittorrent_base_template      
          - ol_qbittorrent_delete_keeper_template
      
      nas_delete:
        <<: *delete
        template:
          - nas_from_qbittorrent_template
          - nas_qbittorrent_base_template
          - nas_qbittorrent_delete_keeper_template
      
      ol_modify:
        <<: *modify
        template:
          - ol_from_qbittorrent_template
          - ol_qbittorrent_base_template
          - qbittorrent_modify_template
      
      nas_modify:
        <<: *modify
        template:
          - nas_from_qbittorrent_template
          - nas_qbittorrent_base_template
          - qbittorrent_modify_template
    
      ol_clean:
        <<: *clean
        template:
          - ol_from_qbittorrent_template
          - ol_qbittorrent_base_template
          - qbittorrent_delete_cleaner_template
      
      nas_clean:
        <<: *clean
        template:
          - nas_from_qbittorrent_template
          - nas_qbittorrent_base_template
          - qbittorrent_delete_cleaner_template
      
      # 自动签到
      sign_in:
        auto_sign_in:
          user-agent: '{? headers.user_agent ?}'
          # command_executor: 'http://standalone-chrome:4444/wd/hub'
          max_workers: 4
          # baidu ocr 参数
          aipocr:
            app_id: '<BAIDU_APP_ID>'
            api_key: '<BAIDU_API_KEY>'
            secret_key: '<BAIDU_SECRET_KEY>'
          sites:
            pthome: '<PTHOME_COOKIE>'
        accept_all: yes
        seen:
          fields:
            - title

    [c-alert type=”warning”]注意:[/c-alert]

    • 自行将形如 <foobar> 的变量替换为自己的信息,关于 Cookie 的获取可以看 此教程
    • 务必要申请自行 Baidu OCR,申请网址: 百度 AI 开放平台
    • 自动签到已经适配的站点可在 此文件夹 中找到。
    • 如无其他需求可直接用我的配置,否则请自行参考 项目 wiki

    这样子 Flexget 就会定时自行下载 PT 站的免费种子、自行删除旧种,全自动辅种,还能够帮我们签到等,无需其他额外的软件。

    qBittorrent不建议经常更新。如果需要自动更新 Flexget,可以用Watchtower

    docker run -d \
        --name watchtower \
        --restart unless-stopped \
        -e TZ=Asia/Shanghai \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        --cleanup

    后记

    经过这一波折腾,可以说是彻底的解放了双手,同时有需要的话还可以用 TG 通知签到情况、机器占用情况等,可以说是十分好用了。

    感谢各位大佬们写的好用的插件~

  • Watchtower – 自动更新 Docker 镜像与容器

    Watchtower – 自动更新 Docker 镜像与容器

    前言

    在早前部署Awesome TTRSS时,作者在docker-compose里配置了Watchtower,于是找到 Github 官方项目研究了下,根据官方文档简单整理了一下常用参数以备用.

    [icon-url href=”Watchtower” target=”_blank”]Watchtower[/icon-url]

     

    [start-plane type=”1″]本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.[/start-plane]

    部署

    快速启动

    执行以下标准命令启动 Watch­tower 容器,并每 5 分钟一次检查所有容器的镜像是否为最新版,如发现镜像更新将会自动停止容器,删除容器,拉取最新镜像,在以之前启动容器的命令启动容器.

    docker run -d \
        --name watchtower \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower

    清理旧镜像

    镜像在更新后旧镜像标签会变为none,长期自动更新会导致过多的none镜像占用空间,加入--cleanup参数可以在每次更新后自动删除none镜像.

    docker run -d \
        --name watchtower \
        --restart always \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        --cleanup

    指定容器更新

    如无需自动更新所有稳定运行的容器,可以配置仅更新指定容器,只需要在命令后加上容器名.例如只更新nginxredis.

    docker run -d \
        --name watchtower \
        --restart always \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        --cleanup \
        nginx redis
    注意指定容器需填写 容器名 ,并非镜像名.由于部分容器启动时可能没有定义 –name 参数,请执行 docker ps 查询核对容器名.

    配置自动更新频率

    Watch­tower 默认每 5 分钟轮询一次,可以使用以下参数配置更新的频率.

    • --interval,-i 配置更新周期,默认300秒.
    • --schedule,-s 配置定时更新,使用Cron表达式,例如"0 0 1 * * *".即每天凌晨1点更新.
    注意:当使用 -s 参数来配置定时更新时,由于容器内默认为 UTC 时间,上述设置的 凌晨1点 实际上是北京时间 早上9点 .可以通过加上 -e TZ=Asia/Shanghai 环境变量来定义时区,此时配置的时间则为北京时间.

    每小时更新一次

    docker run -d \
        --name watchtower \
        --restart always \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        --cleanup \
        -i 3600

    每天凌晨1点更新(北京时间)

    docker run -d \
        --name watchtower \
        --restart always \
        -e TZ=Asia/Shanghai \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        --cleanup \
        -s "0 0 1 * * *"

    手动更新

    使用手动更新的方式,运行一次Watch­tower容器来更新所需的容器,更新后会自动删除本次运行的Watch­tower容器.只需要加上--rm--run-once参数即可.同时也可以配合以上指定容器或指定排除容器的参数来使用.

    手动更新所有容器

    docker run --rm \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        --cleanup \
        --run-once

    手动更新指定容器

    docker run --rm \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        --cleanup \
        --run-once \
        nginx redis
    注意指定容器需填写 容器名 ,并非镜像名.由于部分容器启动时可能没有定义 –name 参数,请执行 docker ps 查询核对容器名.

    手动运行更新时会出现以下消息,表示正在更新,请耐心等待几分钟.

    time="2020-02-18T03:58:24Z" level=info msg="Running a one time update."

    随后提示找到更新镜像,停止容器,更新镜像,重启容器并移除旧镜像.至此更新完毕.

    time="2020-02-18T04:02:45Z" level=info msg="Found new xxxx/xxxx:latest image (sha256:10383f5b5720d7e1fxxxx137034c69b7f6xxxxxxafcc4e9d508b561af77)"
    time="2020-02-18T04:02:45Z" level=info msg="Stopping /xxxx (2e9ce1ebe319f3a35d80bxxxxxxxxxx6763ada155da957acb24fe76fc8a8c5) with SIGTERM"
    time="2020-02-18T04:02:46Z" level=info msg="Creating /xxxx"
    time="2020-02-18T04:02:46Z" level=info msg="Removing image sha256:ff4ee4caaa237174080c0d545xxxxxxxxxxxxxxx5d740ddc51e7737839cb5"

    结语

    其他更多参数以及功能请参考官方文档:

  • Docker 空间使用分析与清理

    用户在使用 Docker 部署业务一段时间后,可能会发现宿主节点的磁盘容量持续增长,甚至将磁盘空间耗尽进而引发宿主机异常,进而对业务造成影响。 本文先对 Docker 的空间分析与清理进行说明,然后对容器的磁盘容量限制与使用建议做简要说明。

    典型问题场景

    用户发现 Docker 宿主机的磁盘空间使用率非常高。通过 du 逐层分析,发现是 Volume 或 overlay2 等目录占用了过高空间。示例如下:

    # 根据使用的存储驱动的不同,相应目录会有所不同:
    [root@node3 docker]# du -h --max-depth=1 |sort
    104K    ./network
    13M    ./image
    20K    ./plugins
    24G    ./overlay2   # 这个目录占用了非常高的磁盘磁盘空间
    25G    .
    283M    ./volumes
    4.0K    ./swarm
    4.0K    ./tmp
    4.0K    ./trust
    518M    ./containers

    空间使用分析

    遇到此类问题,可以参阅如下步骤进行空间分析,定位占用过高空间的业务来源。

    分析 Docker 空间分布

    Docker 的内置 CLI 指令 docker system df ,可用于查询镜像(Images)、容器(Containers)和本地卷(Local Volumes)等空间使用大户的空间占用情况。 示例输出如下:

    [root@node3 docker]# docker system df
    TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
    Images              17                  12                  2.713 GB            1.144 GB (42%)
    Containers          15                  12                  10.75 GB            0 B (0%)
    Local Volumes       8                   4                   282.9 MB            241.8 MB (85%)

    查看空间占用细节

    可以进一步通过 -v 参数查看空间占用细节,以确定具体是哪个镜像、容器或本地卷占用了过高空间。示例输出如下:

    [root@node3 docker]# docker system df -v
    # 镜像的空间使用情况
    Images space usage:
    
    REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE                SHARED SIZE         UNIQUE SIZE         CONTAINERS
    busybox                                                      latest              6ad733544a63        5 days ago          1.129 MB            0 B                 1.129 MB            1
    nginx                                                        latest              b8efb18f159b        3 months ago        107.5 MB            107.5 MB            0 B                 4
    ubuntu                                                       latest              14f60031763d        3 months ago        119.5 MB            0 B                 119.5 MB            0
    alpine                                                       3.3                 606fed0878ec        4 months ago        4.809 MB            0 B                 4.809 MB            0
    tutum/curl                                                   latest              01176385d84a        3 years ago         224.4 MB            0 B                 224.4 MB            1
    
    # 容器的空间使用情况
    Containers space usage:
    
    CONTAINER ID        IMAGE                                                                    COMMAND                  LOCAL VOLUMES       SIZE                CREATED             STATUS                     NAMES
    d1da451ceeab        busybox                                                                  "ping 127.0.0.1"         0                   10.7 GB             About an hour ago   Up About an hour           dstest
    956ae1d241e8        nginx:latest                                                             "nginx -g 'daemon ..."   0                   26 B                3 months ago        Up 3 months                localTest_restserver_2
    74973d237a06        nginx:latest                                                             "nginx -g 'daemon ..."   0                   2 B                 3 months ago        Up 3 months                
    
    # 本地卷的空间使用情况
    Local Volumes space usage:
    
    VOLUME NAME                                                        LINKS               SIZE
    83ba8747f4172a3c02a15f85b71e1565affca59f01352b4a94e0d28e65c26d1c   0                   830 B
    a479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b648   0                   22.16 MB
    79a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503   1                   18.83 MB
    

    空间清理

    自动清理

    可以通过 Docker 内置的 CLI 指令 docker system prune 来进行自动空间清理。

    Tips 

    不同状态的镜像

    • 已使用镜像(used image): 指所有已被容器(包括已停止的)关联的镜像。即 docker ps -a 看到的所有容器使用的镜像。
    • 未引用镜像(unreferenced image):没有被分配或使用在容器中的镜像,但它有 Tag 信息。
    • 悬空镜像(dangling image):未配置任何 Tag (也就无法被引用)的镜像,所以悬空。这通常是由于镜像 build 的时候没有指定 -t 参数配置 Tag 导致的。比如:
    REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE
    <none>                                                      <none>              6ad733544a63        5 days ago          1.13 MB   # 悬空镜像(dangling image)

    挂起的卷(dangling Volume)
    类似的,dangling=true 的 Volume 表示没有被任何容器引用的卷。

    docker system prune 自动清理说明

    • 该指令默认会清除所有如下资源:
      • 已停止的容器(container)
      • 未被任何容器所使用的卷(volume)
      • 未被任何容器所关联的网络(network)
      • 所有悬空镜像(image)。
    • 该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。
    • 添加 -a 或 --all 参数后,可以一并清除所有未使用的镜像和悬空镜像。
    • 可以添加 -f 或 --force 参数用以忽略相关告警确认信息。
    • 指令结尾处会显示总计清理释放的空间大小。

    操作示例:

    [root@node3 docker]# docker system prune --help
    
    Usage:    docker system prune [OPTIONS]
    
    Remove unused data
    
    Options:
      -a, --all     Remove all unused images not just dangling ones
      -f, --force   Do not prompt for confirmation
          --help    Print usage
    [root@node3 docker]# docker system prune -a
    WARNING! This will remove:
        - all stopped containers
        - all volumes not used by at least one container
        - all networks not used by at least one container
        - all images without at least one container associated to them
    Are you sure you want to continue? [y/N] y
    Deleted Containers:
    c09c31c49491ee7f2324160e43947917940221b4e6cc1274906def640a7a631f
    2aa0180e1a0f4c2c64349a6ed969651052373e7a9471050dce9015701cf1b957
    6d18003b06823c5d76d807a319387b06680fc93d0a32bc29c1cea4c07e8d515d
    
    Deleted Volumes:
    a479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b648
    79a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503
    
    Deleted Images:
    untagged: tutum/curl:latest
    untagged: tutum/curl@sha256:b6f16e88387acd4e6326176b212b3dae63f5b2134e69560d0b0673cfb0fb976f
    deleted: sha256:01176385d84aeb1d40ed18c6d3f952abf40d2d2b4aa98fcf0a8a4b01010fb9a9
    deleted: sha256:c84f85637212412c1d46d1dd50f789df2c3b44678ee3fee6a820888e734f9b5a
    untagged: test:lastest
    deleted: sha256:794ff09332586a091514eb3d1c44990244e57e34adc71d4b4334c0674a1377e9
    deleted: sha256:636a1e7769d2242556243e9a21fb96bb878ab5b94c41ff485667252c968b375e
    
    Total reclaimed space: 1.565 GB

    手工清理

    网络清理

    网络配置通常占用的空间非常低,略过。

    镜像清理

    如果通过 docker system df 分析,是镜像占用了过高空间。则可以根据业务情况,评估相关镜像的使用情况。对于悬空和未使用的镜像, 可以使用如下指令手工清理:

    # 删除所有悬空镜像,但不会删除未使用镜像:
    docker rmi $(docker images -f "dangling=true" -q)
    
    # 删除所有未使用镜像和悬空镜像。
    # 【说明】:轮询到还在被使用的镜像时,会有类似"image is being used by xxx container"的告警信息,所以相关镜像不会被删除,忽略即可。
    docker rmi $(docker images-q)

    卷清理

    如果通过 docker system df 分析,是卷占用了过高空间。则可以根据业务情况,评估相关卷的使用情况。对于未被任何容器调用的卷(-v 结果信息中,”LINKS” 显示为 0),可以使用如下指令手工清理:

    # 删除所有未被任何容器关联引用的卷:
    docker volume rm $(docker volume ls -qf dangling=true)
    
    # 也可以直接使用如下指令,删除所有未被任何容器关联引用的卷(但建议使用上面的方式)
    # 【说明】轮询到还在使用的卷时,会有类似"volume is in use"的告警信息,所以相关卷不会被删除,忽略即可。
    docker volume rm $(docker volume ls -q)

    容器清理

    如果通过 docker system df 分析,是某个容器占用了过高空间。则可以根据业务情况,评估相关容器的业务归属并进行处理。对于已停止或其它异常状态的容器,可以结合  -f 或 --filter 筛选器,使用类似如下指令来手工清理:

    # 删除所有已退出的容器
    docker rm -v $(docker ps -aq -f status=exited)
    # 删除所有状态为 dead 的容器
    docker rm -v $(docker ps -aq -f status=dead)

    更多关于 ps 指令支持的筛选器信息,可以参阅官方文档

    在用空间资源分析

    对于还在使用的空间资源,可以参阅如下说明做进一步排查分析。

    镜像空间分析

    如果某个镜像占用了过高空间,则可以通过如下方式做进一步空间分析:

    1. 通过 docker system df 获取占用过高空间的镜像信息。
    2. 基于相应镜像创建测试容器。
    3. exec 进入容器后,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。
    4. 结合业务情况做进一步处理,重新 build 镜像。

    示例:

    [root@node3]# docker exec -it dstest sh
    / # du -h | head
    8.0K    ./root
    32.0K    ./etc
    4.0K    ./usr/sbin
    8.0K    ./usr
    10.0G    ./home/java/logs
    10.0G    ./home/java
    10.0G    ./home
    1.1M    ./bin
    0    ./dev/shm
    0    ./dev/mqueue

    容器空间分析

    如果某个运行中的容器占用了过高空间,则可以通过如下方式做进一步空间分析:

    Tips 

    容器的只读层与镜像层的空间占用情况
    一个容器的占用的总空间,包含其最顶层的读写层(writable layer)和底部的只读镜像层(base image layer,read-only)。更多相关说明,可以参阅官方文档
    可以通过 docker ps 的 -s 参数来分别显示二者的空间占用情况,进而判断相应容器的空间占用主要是来自原始镜像,还是运行中产生。

    容器空间占用示意图
    示例:

    # 如下容器的原始镜像占用了 422MB 空间,实际运行过程中只占用了 2B 空间:
    CONTAINER ID        IMAGE                                                                                                                                COMMAND                  CREATED             STATUS              PORTS                                           NAMES                                                                                    SIZE
    ac39128ccbc0        registry.aliyuncs.com/acs-sample/wordpress:4.6                                                                                       "/entrypoint.sh ap..."   3 months ago        Up 11 days          0.0.0.0:32779->80/tcp                           Web_web_4                                                                                2 B (virtual 422 MB)

    容器空间占用的分析步骤:

    1. 通过 docker system df 获取占用过高空间的容器信息。
    2. 通过前述 -s 参数确认到底是底层镜像,还是运行过程中产生的数据占用了过高空间。
    3. exec 进入容器,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。
    4. 结合业务情况做进一步处理。

    引申:Docker 磁盘空间限制与使用建议

    磁盘空间限制

    使用 Device Mapper 存储驱动限制容器磁盘空间

    如果使用 Device Mapper 作为底层存储驱动,则可以通过 Docker daemon 的如下参数来全局限制单个容器占用空间的大小:

    • --storage-opt dm.basesize=20G 表示限制单个容器最多占用 20G 空间,将应用于任何新建容器。

    更多关于 Device Mapper 存储驱动的说明,可以参阅官方文档

    使用 btrfs 存储驱动限制容器磁盘空间

    btrfs 驱动主要使用 btrfs 所提供的 subvolume 功能来实现。一个容器会对应一个 subvolume。针对容器对应的 subvolume 启用并配置 quota 即可限制其磁盘空间。示例配置:

    btrfs qgroup limit -e 50G /var/lib/docker/btrfs/subvolumes/<CONTAINER_ID>

    btrfs 还有其它很好的特性,比如可以在线扩容(在线加入一块新的块设备,来扩充整个文件系统的大小)。更多关于 btrfs 存储驱动的说明,可以参阅官方文档

    外挂 LVM 卷

    如果使用的是其它不支持对单个容器的磁盘容量进行限制的存储驱动,则可以考虑如下通用方案:

    • 通过 LVM 方式创建一个指定容量的卷,然后挂载到宿主操作系统上特定目录。最后通过 –volume 参数来让容器来挂载使用相应目录。

    注意:该方案的前提条件是,容器中所有落盘操作要全部落到上述 “–volume” 参数指定的卷中,否则容器还会占用默认 aufs 所在盘的空间,进而造成统计不准。

    Docker 存储使用建议

    细化的存储使用最佳实践与采用的存储驱动(storage driver)类型强相关,您可以参阅官方文档做相关了解,本文不做进一步细化说明。
    通用的存储使用建议如下:

    • 容器内的业务日志务必配置轮询覆写,或者使用日志驱动将日志输出到外部存储。避免日志文件持续增长,占用过高磁盘空间。
    • 结合外部监控对宿主机的磁盘空间使用情况进行监控和告警。
    • 可以参阅文档 如何给容器服务的Docker增加数据盘来扩容默认 Docker 存储空间