使用 Docker Registry 自托管一个缓存镜像源

部署

由于是在一个 1C1G 的机器上部署,就不用 K3s 了,直接用 Docker Compose 拉起一个实例。官方文档有提供 docker-compose.yml,这里也给出一份示例:

version: '3'

services:
  registry-docker:
    image: registry:2
    restart: unless-stopped
    environment:
      REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io
      REGISTRY_PROXY_USERNAME: username
      REGISTRY_PROXY_PASSWORD: dckr_pat_value
      # REGISTRY_AUTH: htpasswd
      # REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      # REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    ports:
      - 127.0.0.1:50000:5000
    volumes:
      - ./data/auth:/auth
      - ./data/docker:/var/lib/registry

这里的账密可以提高拉取限频,但是根据官方文档,使用镜像的用户就可以读到该账号下的私有镜像了,最好是一个独立的账号。

服务拉起来之后,Nginx 反代一下就可以使用了。

拉取

有两种方式可以使用,首先是最普遍且最优的做法,在 /etc/docker/daemon.json 中加入 registry-mirrors 选项。例如:

{
  "registry-mirrors": [
    "https://<docker-registry-host>"
  ]
}

然后重启 Docker Engine 即可。

不过此种方式不支持 HTTP Basic 身份验证,这也就意味着无法通过事先 docker login 的方式来拉取私有的镜像源。目前各镜像站通常的做法是使用泛域名,在域名中提供唯一身份信息,显然这种方式并不安全,只是对当下现状的妥协。

这种情况应该在下一个版本的 Docker 中应该可以得到解决,在即将发布的 24.08/25.0 版本中,我们可以在 [24.0 backport] registry: allow mirror path prefix in config by thaJeztah · Pull Request #46944 · moby/moby (github.com) 中看到,可以支持填带路径的镜像源了,这就意味着可以在路径上实现类似的认证,因为 HTTPS 中路径是受保护的,这样的话就不会有问题了。

另一种方式是手动拉取,这需要以 docker pull <docker-registry-host>/library/nginx:stable 的格式进行拉取。这种方式支持 HTTP Basic 认证。

认证

Docker Registry 上支持认证,可以参照上面的 docker-compose.yml 处理;也可以在反代上面认证,其官方文档给出了 Apache/Nginx 上面的配置示例,具体请参考 Authenticate proxy with nginx | CNCF Distribution

引用

Registry as a pull through cache | Docker Docs

Docker daemon won’t start if a registry-mirror is configured in /etc/docker/daemon.json · Issue #36598 · moby/moby (github.com)

registry: allow mirror path prefix in config · thaJeztah/docker@3d8f7d0 (github.com)

Pull-through cache is not working for private registry: Challenge established with upstream · Issue #3081 · distribution/distribution (github.com)

Implement Basic authentication to upstream registry in proxy mode by ArthurMelin · Pull Request #3256 · distribution/distribution (github.com)

Private Docker registry in pull through cache mode return “invalid authorization credential” – Stack Overflow

Private docker registry behind a subpath : r/docker (reddit.com)

Private Docker registry in pull through cache mode return “invalid authorization credential” – Stack Overflow

在威联通 QTS 的 Container Station 上使用类似虚拟机的桥接网络

日常使用时,我们可以注意到:在创建容器时,Web UI 上其实是允许容器使用虚拟交换机网络而非 NAT 的。这个选项的效果类似于虚拟机平台的虚拟交换机(或者有些时候称之为桥接网络),和直接使用 network_mode: "bridge" 有显著区别。

出于好奇,索性这样创建一个容器,然后直接 SSH 到机器上面看看生成的东西是啥样的。这个容器的实现也很直接,SSH 上去可以直接使用现成的 Docker 的命令行客户端,所以直接看看 Docker 的网络。

可以注意到这里使用了一个定制的 Docker 网络驱动。这下就明白了,然后我们可以来搜一下怎么在 Docker Compose 里调用它。

也比较顺利,直接搜到了官方的文档:Qnet — Container Station documentation (qnap-dev.github.io),这里面给出了示例:

那么直接复制粘贴就可以了。不过也发现一个问题,重新创建应用会导致 MAC 变化,DHCP 服务器上配置的静态分配不生效。此时可以直接给 services.qnet_dhcp 下设置一个 mac_address 属性来指定 MAC 地址,就不会有问题了。

引用

Qnet — Container Station documentation (qnap-dev.github.io)

WordPress 接入 CDN 后升级插件或 WP 失败

现象

近期将博客接入腾讯云 CDN 后发现更新插件和更新 WordPress 版本这种耗时较长的请求都会失败。一开始还没在意,以为是后端请求的下载地址不在国内所以下载超时。

后面发现 Grafana 的服务在没有预热 CDN 缓存的时候,很多大的 JS 文件也都会请求失败,页面无法打开,F12 控制台有一些 net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)。此时考虑 CDN 上面是否有限制回源请求的超时限制。

解决方案

如果使用腾讯云 CDN

发现腾讯云 CDN 有给出回源超时时间配置,见内容分发网络 CDN 回源超时时间配置-配置指南-文档中心-腾讯云 (tencent.com)

默认 TCP 超时限制 5 秒没有问题,但是回源加载时间 10 秒这个限制,对于更新插件和 WP 这种场景,以及 1Mbps 带宽加载 JS 大文件(开启 Gzip 后仍然有 4M+)的情况来说完全不够,因此酌情将回源时间限制放宽。在 CDN 控制台上刷新缓存之后,再次验证更新 WP 版本和访问 Grafana 已没有问题。

如果使用腾讯云 EdgeOne

先前往控制台选择相应站点,然后可以找到规则引擎。在匹配类型为 Host 的规则里新增操作来延长超时时间即可。

更新历史

24/3/12

新增 EdgeOne 相关。

domain 的自言自语 2312

云原生

istio服务网格进阶最佳实践 (qq.com)

没错,数据库确实应该放入 K8s 里! (qq.com)

微服务全做错了!谷歌提出新方法,成本直接降9倍! (qq.com)

华为 kubernetes管理员实训课_哔哩哔哩_bilibili

【助力CKA全球认证】奔走相告!kubernetes管理员实训课火热开启!!!_云容器_华为云论坛 (huaweicloud.com)

互联网故障背后的草台班子们 (qq.com)

开发

microsoft/qlib: Qlib is an AI-oriented quantitative investment platform that aims to realize the potential, empower research, and create value using AI technologies in quantitative investment, from exploring ideas to implementing productions. Qlib supports diverse machine learning modeling paradigms. including supervised learning, market dynamics modeling, and RL. (github.com)

How to update git commit author, but keep original date when amending? – Stack Overflow
[deleted by user]:git (reddit.com)
重置一些 Git 提交的作者,但保留日期等信息。

前端monorepo大仓权限设计的思考与实现|得物技术 (qq.com)

szu17dmy/panabit-ddns-go-manager: 在 Panabit 智能应用网关上运行 jeessy2/ddns-go (github.com)
给 Panabit 网关写了两个插件,或许有空的时候会写个过程吧。

算法

蓄水池抽样算法(Reservoir Sampling) – 简书 (jianshu.com)

无聊

是那一趟红红火火的地铁耶!!! (xiaohongshu.com)
年终周六福在地铁发礼品。

一台为家里干了近8年的买菜车 – 原创分享(新) – Chiphell – 分享与交流用户体验

国内AI绘画著作权第一案➡️判决已出_哔哩哔哩_bilibili

domain 的自言自语 2311

云原生

滴滴弹性云基于 K8S 的调度实践 (qq.com)

滴滴11.27 P0级故障 (qq.com)

设计面向微服务的应用程序 – .NET | Microsoft Learn

网络

Using NGINX as a DoT or DoH Gateway – NGINX

privacy-protection-tools/anti-AD: 致力于成为中文区命中率最高的广告过滤列表,实现精确的广告屏蔽和隐私保护。anti-AD现已支持AdGuardHome,dnsmasq, Surge,Pi-Hole,smartdns等网络组件。完全兼容常见的广告过滤工具所支持的各种广告过滤列表格式 (github.com)

在家也要玩BGP 之 Mikrotik Fan Boy版 | 主题帖 – 梨园 (liyuans.com)

惨不忍睹的Wi-Fi FEM赛道 (qq.com)

Linux

Filesystem Hierarchy Standard – Wikipedia

安全

微信PC客户端存在@全体逻辑错误 (qq.com)

好玩的

[氵]可安装PCIe卡的1L小主机 v6 (qq.com)

Workspace Storage Cleanup – Visual Studio Marketplace

威联通 QTS 启动 Jellyfin,使用 Container Station 容器工作站

左侧栏新建“应用程序”,下面给出可用的 docker-compose.yml

version: '3.5'
services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: 0:0
    network_mode: 'host'
    volumes:
      - /share/Container/jellyfin/config:/config
      - /share/Container/jellyfin/cache:/cache
      - /share/Media:/mnt/media:ro
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    restart: 'unless-stopped'
    environment:
      - http_proxy=http://<proxy-host>:<proxy-port>
      - https_proxy=http://<proxy-host>:<proxy-port>
      - HEALTHCHECK_URL=http://<qts/jellyfin-host>:8096/health
    extra_hosts:
      - "host.docker.internal:host-gateway"

基于 Jellyfin 官方给出的 yml 修改而来,挂载设备以支持硬件解码。由于 QTS 上该设备所有者为 0:0,且权限为 600,无法通过添加 –group-add 参数来让同组不同用户使用该设备,因此只能让这个容器按 root:root 启动了,可能有些许风险。

添加环境变量以加速元数据刷新,修改健康检查地址使之状态正常。

引用

Container | Jellyfin

Intel GPU | Jellyfin

domain 的自言自语 2309

安全

GitHub – felix-pb/kfd: kfd, short for kernel file descriptor, is a project to read and write kernel memory on Apple devices.

开发

推出 RustRover – JetBrains 出品的独立 Rust IDE (qq.com)
JetBrains 发布 Rust 的独立版本 IDE 预览版,目前免费。

Port forwarding local services with VS Code (visualstudio.com)

网络

获取Tg的用户IP地址 (qq.com)
STUN 打洞泄露出口 IP。

https://support.fortinet.com/Download/VMImages.aspx
虚拟机版本的飞塔。

WireGuard Endpoint Discovery and NAT Traversal using DNS-SD | Jordan Whited
WireGuard 的一种 NAT 穿越方案。

无聊的东西

cs.uwaterloo.ca/~csk/slide/
不知道为什么很火的滑动解锁式游戏。

domain 的自言自语 2308

开发

面向插件开发者的语言服务器协议(LSP)| 技术解析 (qq.com)
JetBrains 自 2023.2 大版本开始引入 LSP 支持。

云原生

应用容器化后为什么性能下降这么多? (qq.com)

k8s无法删除namespace-腾讯云开发者社区-腾讯云 (tencent.com)

混沌故障演练如何尽可能保障生产环境不被破坏 (qq.com)

网络

Fortinet ZTNA远程办公解决方案全国首发评测_哔哩哔哩_bilibili
飞塔的 ZTNA。

MikroTik CRS310-8G+2S+IN 2.5G交换机 – YuS (irouteros.com)
MikroTik 发了个新的 2.5G 交换机,个人感觉性价比一般。

华为HN8145XR拆机,FTTR主光猫 (qq.com)

嵌入式

Github上的高热度嵌入式项目之——开源核辐射检测仪 (qq.com)

其它

xkcd: Security

在梅奥诊所查房,站友真的羡慕了! (qq.com)

domain 的自言自语 2307

开发

C++ Insights (cppinsights.io)

云原生

从 Istio 在 CNCF 毕业,看服务网格的架构变迁 (qq.com)

CNCF宣布CRI-O项目毕业 (qq.com)

是时候和 Jenkins 说再见了 (qq.com)

Linux

Linux 中不适用功能键切换TTY | 《Linux就该这么学》 (linuxprobe.com)

网络

Home (dn42.dev)
一直没有时间学 BGP…

光猫改桥接后速度降低的问题与运营商和厂商的探讨 – V2EX
时间错误导致丢包。

总结142款运营商定制WiFi6 mesh路由的配置,供大家参考(有几款可刷OPENWRT)-无线路由器硬件改造以及故障维修-恩山无线论坛 – Powered by Discuz! (right.com.cn)
运营商定制机是真的便宜。

AI

人类数据,要被 OpenAI 用完了,然后呢? (qq.com)
中文互联网的很多优质内容都被掌握在各大厂手里了。

智能家居

美的设备怎么进米家联动?教你如何通过易来Pro网关进行跨平台联动_哔哩哔哩_bilibili
那么,在哪里可以买到呢?

其它

GitHub – microsoft/win32-app-isolation: Tools and documentation for Win32 app isolation

thinking-in-se/《人件 原书第3版》.pdf at master · clsaa/thinking-in-se · GitHub

无法摆脱的干眼症,放不下手机的一代人 (qq.com)

节省数亿IT成本,B站FinOps实践 (qq.com)

如何理解 FinOps? (qq.com)