<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Docker on 魔都水滴</title>
    <link>https://blog.margrop.net/tag/docker/</link>
    <description>Recent content in Docker on 魔都水滴</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 26 Jul 2026 06:00:00 +0800</lastBuildDate>
    <atom:link href="https://blog.margrop.net/tag/docker/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>7 个 AI 编程套餐，每天开 7 个标签页查额度？我写了个看板一屏搞定</title>
      <link>https://blog.margrop.net/post/coding-plan-dashboard/</link>
      <pubDate>Sun, 26 Jul 2026 06:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/coding-plan-dashboard/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果你同时订阅了 Codex、MiniMax、火山方舟、Kimi Code、LongCat、千问 AI、Google AI 等多家 AI 编程套餐，大概率体验过一种痛苦：每天要在 7 个不同网站、7 套不同的登录体系里反复查看&amp;quot;还剩多少额度&amp;quot;。我开源了一个自托管的配额看板 &lt;a href=&#34;https://github.com/margrop/coding-plan-dashboard&#34;&gt;coding-plan-dashboard&lt;/a&gt;，一条 &lt;code&gt;docker compose up -d&lt;/code&gt; 启动后，所有平台的额度百分比、重置倒计时、多账号信息全部聚合在一个深色页面上，打开浏览器就能看到。本文写作与截图时间为 2026 年 7 月 26 日。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker 拉不动别急着换 DNS：国内镜像加速源挑选、配置与避坑全指南</title>
      <link>https://blog.margrop.net/post/docker-mirror-source-selection-guide/</link>
      <pubDate>Wed, 15 Jul 2026 19:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/docker-mirror-source-selection-guide/</guid>
      <description>先说结论&#xA;国内网络环境下，Docker 拉取镜像失败，往往不是镜像不存在，也不一定是 DNS 的锅。更常见的原因是：公共仓库的访问链路拥堵、某个加速源临时故障，或者配置文件改对了却没有重启 Docker。&#xA;我的建议是：先打开 status.anye.xyz，把它当作“镜像源天气预报”，看多个源最近是否可用；再根据自己的系统改对配置文件；改完先校验 JSON，再重启 Docker，最后用一个小镜像做真实拉取验证。&#xA;一、问题背景：为什么昨天能拉，今天就超时？ 很多人第一次遇到这个问题，是在部署一个很普通的服务：nginx、redis、postgres，或者 NAS 上的媒体服务。命令可能只有一句：&#xA;docker pull nginx:alpine 但终端却出现了超时、context deadline exceeded、TLS handshake timeout、connection reset by peer，甚至长时间停在下载层。换一个镜像标签、重启路由器、修改本地 DNS，有时能暂时恢复，于是大家容易得出一个结论：Docker 太玄学。&#xA;其实 Docker 拉镜像像是“从仓库借书”：&#xA;Docker 客户端先找到仓库地址； 再通过网络连接仓库； 仓库返回镜像清单； 客户端逐层下载内容； 最后校验每一层是否完整。 这条链路中任何一段堵住，都会表现为“拉不下来”。所以，镜像加速源不是魔法按钮，而是给这条路增加一条更顺畅的入口。&#xA;二、问题表现：不要只看网页能不能打开 一个镜像源网页能打开，不等于 Docker 一定能用。选择加速源时，至少要看四件事：&#xA;1. 地址是否真的可达 浏览器打开首页，只能证明首页响应了。Docker 还要访问 Registry API、鉴权接口和镜像层下载接口。网页正常、拉取失败，是完全可能的。&#xA;2. 是否支持完整的 Docker Hub 加速链路 有些地址只是一个网页代理或搜索页面，并不是 Docker Registry mirror。配置到 registry-mirrors 后，如果 docker info 看不到它，或者 docker pull 仍然直接访问默认仓库，就要怀疑它并非真正的加速服务。&#xA;3. 是否持续稳定，而不是刚好今天在线 镜像源很像城市道路：今天通车，不代表明天不施工。稳定性比某一次测速的峰值更重要。家用 NAS 可以接受偶尔切换，CI 构建和生产环境则应该准备备用方案。</description>
    </item>
    <item>
      <title>买了海外 VPS 又有顶级域名，然后呢？这 12 件事，才是公网 IP 真正的含金量</title>
      <link>https://blog.margrop.net/post/vps-domain-personal-internet-infrastructure/</link>
      <pubDate>Sat, 11 Jul 2026 13:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/vps-domain-personal-internet-infrastructure/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;单独一台海外 VPS，只是一间通了电、接了网、却没有门牌号的小房间；单独一个顶级域名，只是一块漂亮招牌。把域名托管到 Cloudflare，再将 DNS 指向 VPS，才等于同时拥有“门牌、导航、店面和公网入口”。&lt;/p&gt;&#xA;&lt;p&gt;它真正的价值并不是“可以搭一个博客”这么简单，而是让普通人第一次拥有一块全天在线、能被全世界标准互联网访问、能运行自己代码的数字土地：博客、API、Webhook、状态页、密码库、监控、文件入口、自动化任务、远程访问中转，甚至个人 AI 服务的统一入口，都可以从这里长出来。&lt;/p&gt;&#xA;&lt;p&gt;但公网 IP 也像一扇开在闹市区的门：你刚装好门锁，互联网上的扫描器可能已经来拧过门把手。因此本文既讲“能做什么”，也讲“哪些东西千万别直接暴露”。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>受够远程控制被限速？我把 RustDesk 服务端搬回自己家：多合一部署、避坑与安全加固</title>
      <link>https://blog.margrop.net/post/rustdesk-all-in-one-server-guide/</link>
      <pubDate>Fri, 10 Jul 2026 22:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/rustdesk-all-in-one-server-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;RustDesk 是一款强调开源与自托管的远程桌面工具。客户端之间能直接连接时，画面和键鼠数据优先点对点传输；直连失败时，才由中继服务转发。把服务端部署在自己控制的机器上，最大的价值不是“完全不要服务器”，而是把设备登记、中继路径、密钥、账号和日志重新放回自己的控制范围。&lt;/p&gt;&#xA;&lt;p&gt;本文使用社区维护的 &lt;code&gt;lejianwen/rustdesk-server-s6&lt;/code&gt; 多合一镜像，把 RustDesk OSS 的 &lt;code&gt;hbbs&lt;/code&gt;、&lt;code&gt;hbbr&lt;/code&gt; 与社区 API、Web 管理功能放进一个容器。它适合家庭、实验室和小团队简化部署，但&lt;strong&gt;不是 RustDesk 官方发行的多合一服务端&lt;/strong&gt;。生产环境仍需自行评估社区镜像、固定版本或镜像摘要、备份数据，并测试升级和回滚。&lt;/p&gt;&#xA;&lt;p&gt;本文所有域名都使用 &lt;code&gt;example.com&lt;/code&gt;，没有展示真实 IP、私有域名、主机名、设备 ID、账号、密钥、Token、Cookie 或镜像仓库地址。公开截图来自项目官方页面或社区仓库公开素材。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>别把 API Key 到处塞了：我用 NewAPI 搭了一个自用 AI 中转站</title>
      <link>https://blog.margrop.net/post/newapi-self-hosted-relay-station/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/newapi-self-hosted-relay-station/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;NewAPI 不是一个“白嫖模型”的工具，也不是一个神秘代理。它更像我家里的“AI 前台”：所有 App 只认一个入口，前台负责转发到合法授权的上游模型，顺手做令牌、额度、分组、日志、模型限制和用量统计。对自用场景来说，最舒服的地方不是“多了一个网页”，而是终于不用把每个上游 Key 分散塞进十几个客户端。&lt;/p&gt;&#xA;&lt;p&gt;本文会按我自己搭自用中转站的思路写：为什么需要它、容易误解在哪里、最小可用 Docker Compose 怎么跑、为什么我建议加持久化目录、Windows 11 / Ubuntu 26.04 / macOS 26 三套一键脚本怎么写，以及让 Agent 自动配置时应该给它什么边界。全文不放真实内网地址、完整主机名、私有域名和任何密钥。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>我把 Docker 命令行装进了“驾驶舱”：Portainer 2.39.4 从部署到避坑，一篇就够</title>
      <link>https://blog.margrop.net/post/portainer-ce-docker-deployment-guide/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/portainer-ce-docker-deployment-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Portainer 不是 Docker 的替代品，它更像 Docker 主机的“驾驶舱”：底层发动机仍然是 Docker Engine，Portainer 只是把容器、镜像、网络、卷和 Compose Stack 整理成网页按钮、表格与状态卡片。&lt;/p&gt;&#xA;&lt;p&gt;我用 &lt;code&gt;portainer/portainer-ce:2.39.4&lt;/code&gt; 做了一次隔离部署，完成初始化、接入本机 Docker、查看仪表盘、筛选容器、创建演示 Stack，并记录了真实截图。部署本身只要一条 &lt;code&gt;docker run&lt;/code&gt;，真正需要认真理解的却是三件事：&lt;code&gt;/data&lt;/code&gt; 必须持久化、&lt;code&gt;/var/run/docker.sock&lt;/code&gt; 权限非常高、生产环境不要把管理页面毫无遮挡地暴露到公网。&lt;/p&gt;&#xA;&lt;p&gt;本文没有展示完整 IP 地址、真实主机名、内网域名、管理员密码、Token、Cookie、私有镜像地址或生产容器名称。截图里的实验资源使用专门的演示名称，容器地址已遮盖。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>我最后留下的自用 Web 剪贴板，居然只有一个文本框</title>
      <link>https://blog.margrop.net/post/minimalist-web-notepad-lightweight-clipboard/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/minimalist-web-notepad-lightweight-clipboard/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;我试过不少“跨设备剪贴板”“在线便签”“临时文本同步”工具，最后反而留下了一个看起来最寒酸的东西：&lt;code&gt;minimalist-web-notepad&lt;/code&gt;。它打开之后几乎什么都没有，只有一个文本编辑框，只支持纯文本，不支持登录用户、不支持富文本、不支持图片、不支持标签分类，甚至连“保存按钮”都不明显。&lt;/p&gt;&#xA;&lt;p&gt;但正是这种“功能少到没什么可炫耀”的设计，让它特别适合做自用轻量级 Web 剪贴板：临时从手机传一段命令到电脑、从电脑丢一段说明到平板、给自己留一段短文本、用 &lt;code&gt;curl&lt;/code&gt; 在脚本里读写一小段状态。它不像知识库，也不像团队协作文档，更像桌面旁边那张随手撕下来的便签纸。&lt;/p&gt;&#xA;&lt;p&gt;本文会用 &lt;code&gt;ahfeil/minimalist-web-notepad:latest&lt;/code&gt; 镜像演示 Docker Compose 部署；同时给出 Windows 11、Ubuntu 26.04、macOS 26 三套一键脚本，以及人工自动执行和 Agent 自动配置两种方法。全文不展示任何完整内网地址、内网域名、完整计算机名称或真实隐私数据。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>别把青龙数据直接硬搬！我实测了一次青龙迁白虎，真正的坑在这 5 个地方</title>
      <link>https://blog.margrop.net/post/qinglong-to-baihu-safe-migration/</link>
      <pubDate>Thu, 09 Jul 2026 10:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/qinglong-to-baihu-safe-migration/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;从青龙面板迁移到白虎面板，最危险的做法不是“不会迁”，而是“以为复制目录就等于迁移成功”。这次我在一台隔离 Docker 实验环境里实际跑了一遍：新建青龙容器，造了两条环境变量、两个定时任务和几份脚本；再把它们迁到一套全新白虎面板里，最后用 API 和白虎页面截图核对。&lt;/p&gt;&#xA;&lt;p&gt;最终可稳定迁移的是三类核心资产：&lt;code&gt;scripts&lt;/code&gt; 脚本文件、环境变量、定时任务。真正需要转换的是：青龙的数字 ID 要变成白虎的字符串 ID；青龙任务里的 &lt;code&gt;task xxx.py&lt;/code&gt; 要变成白虎能执行的命令；青龙的标签、启停状态、环境变量关系要写进白虎自己的表结构。迁移前必须备份白虎库，迁移时最好停掉白虎容器，迁移后必须做数量核对和页面验证。&lt;/p&gt;&#xA;&lt;p&gt;本文不展示任何真实内网地址、主机名、私有镜像仓库、真实 Cookie、真实 Token 或生产路径。截图来自实验环境，变量值也只使用脱敏样例。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>青龙面板还能公网裸奔吗？几个月前那次致命漏洞后，我更建议你看白虎面板</title>
      <link>https://blog.margrop.net/post/qinglong-baihu-panel-security/</link>
      <pubDate>Thu, 09 Jul 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/qinglong-baihu-panel-security/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;青龙面板曾经是很多人自托管定时任务的默认选择：跑脚本、管环境变量、看日志、定时同步仓库都很方便。但 2026 年初公开爆出的青龙面板致命漏洞，把一个老问题重新摆到台面上：&lt;strong&gt;定时任务面板不是普通网页，它往往握着脚本、变量、通知密钥和执行权限。一旦认证被绕过，攻击者看到的不是一个登录页，而是一台可以被调度的机器。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果你只是新装一个轻量任务面板，我现在更建议优先评估白虎面板。白虎面板采用 Go + Vue3，主打轻量、高性能、低系统开销，并且官方 README 已经明确支持 Docker / Docker Compose 部署、Mise 运行时管理、仓库任务同步、执行日志和多渠道通知。它不是“青龙的一比一复制品”，但对很多个人脚本托管场景已经够用。&lt;/p&gt;&#xA;&lt;p&gt;如果你因为兼容旧脚本、历史任务或迁移成本，必须临时继续用青龙面板：&lt;strong&gt;不要把它直接暴露在公网。&lt;/strong&gt; 至少在前面加 VPN、零信任访问、反向代理二次认证、IP allowlist、WAF 或其它访问控制。本文给出 Windows 11、Ubuntu 26.04、macOS 26 三套一键脚本，默认部署白虎；只有显式指定时才部署青龙，并且都会把面板放到 Basic Auth 保护后面。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker 容器无限重启？只因 v3.7.0 少了一个 serve —— 思源笔记 CLI 破坏性变更修复实录</title>
      <link>https://blog.margrop.net/post/siyuan-v370-docker-restart-loop-fix/</link>
      <pubDate>Thu, 02 Jul 2026 19:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/siyuan-v370-docker-restart-loop-fix/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;把思源笔记从 v3.6.x 升级到 v3.7.0 后，Docker 容器陷入无限重启循环。&lt;code&gt;docker logs&lt;/code&gt; 显示 &lt;code&gt;Error: unknown flag: --accessAuthCode&lt;/code&gt;。根因是 v3.7.0 引入了 CLI 子命令架构，原来的顶级 flag 现在需要加一个 &lt;code&gt;serve&lt;/code&gt; 子命令。修复只需在 docker-compose.yml 的 &lt;code&gt;command&lt;/code&gt; 字段最前面加上 &lt;code&gt;&#39;serve&#39;&lt;/code&gt;，多 7 个字符，从无限重启到正常运行。&lt;/p&gt;&#xA;&lt;p&gt;本文给出完整排查过程、三种操作系统下的一键修复脚本（Windows 11 / Ubuntu 26.04 / macOS 26），以及人工执行和 AI Agent 自动配置两种方法。所有脚本只调用 Docker CLI 和 SSH，不依赖第三方服务。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker 镜像不求人:从 0 到 1 在自己家里搭一个 13GB 的私有仓库</title>
      <link>https://blog.margrop.net/post/build-private-docker-registry-without-hassle/</link>
      <pubDate>Fri, 26 Jun 2026 12:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/build-private-docker-registry-without-hassle/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;我家那台小服务器上跑着一个 &lt;code&gt;registry:2&lt;/code&gt; 镜像仓库,已经攒了 &lt;strong&gt;13 GB 缓存、95 个仓库&lt;/strong&gt;。它在局域网里给我所有的 NAS、PVE、Mac、Windows 提供 Docker Hub 镜像加速,&lt;strong&gt;冷启动一个 alpine 不到 1 秒,完全不走公网 Docker Hub&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这篇文章不讲&amp;quot;先装 Docker 然后跑个容器&amp;quot;这种一句废话教程。我会把&lt;strong&gt;真实在生产环境跑&lt;/strong&gt;的部署脚本、登录鉴权流程、反向代理最容易踩的 4 个坑、htpasswd 密码文件怎么管理、缓存怎么排错,一次性摊开。&lt;/p&gt;&#xA;&lt;p&gt;看完你应该能做的:① 在 10 分钟内起一个带登录的 registry;② 解释清楚 &lt;code&gt;WWW-Authenticate&lt;/code&gt; 头为啥不能丢;③ 给老板、给家人讲明白这个仓库到底在干什么。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>别再让 Agent 吞掉你的 Token：我把 Headroom 接到 NewAPI、OpenClaw 和 HermesAgent 的完整实战</title>
      <link>https://blog.margrop.net/post/headroom-newapi-openclaw-hermesagent-token-compression-guide/</link>
      <pubDate>Sat, 20 Jun 2026 12:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/headroom-newapi-openclaw-hermesagent-token-compression-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这次我没有替换原来的 NewAPI，也没有让 OpenClaw / HermesAgent 直接改用一个不确定的新网关。真正做法是：在 NewAPI 前面加一层 Headroom 代理，把所有已经使用 OpenAI-compatible 协议的调用改到 &lt;code&gt;http://&amp;lt;headroom-host&amp;gt;:8787/v1&lt;/code&gt;，而原来的 NewAPI 入口继续保留。这样 Agent 发来的长上下文先经过 Headroom 压缩，再转发给 NewAPI，最后仍由 NewAPI 统一路由到后端模型。&lt;/p&gt;&#xA;&lt;p&gt;最关键的原则只有一句：&lt;strong&gt;先测试，后修改；只迁移测试通过的 OpenAI-compatible 项；非 OpenAI 协议的 fallback 不碰。&lt;/strong&gt; 这篇文章既是复盘，也是一份可以直接交给 Agent 或人工照着执行的操作指南。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>我把 AnythingLLM 装进 Docker 之后，容器像一只上紧发条的小松鼠——反复重启直到我把那个 1000:1000 给它</title>
      <link>https://blog.margrop.net/post/anythingllm-docker-deploy/</link>
      <pubDate>Wed, 17 Jun 2026 20:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/anythingllm-docker-deploy/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR（先说结论）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;AnythingLLM 这只&amp;quot;啥都能塞进去的 LLM 口袋书&amp;quot;官方就有 Docker 镜像，正常情况下 &lt;code&gt;docker run&lt;/code&gt; 一行就能起；但它里面那位 &lt;code&gt;anythingllm&lt;/code&gt; 用户很挑剔——挂给它的宿主机目录必须属于 &lt;code&gt;1000:1000&lt;/code&gt;，否则它写不动自己的 SQLite 数据库，Prisma 启动迁移会直接挂掉，容器就会进入&amp;quot;重启—挂掉—再重启&amp;quot;的死循环。修起来不到一分钟：&lt;code&gt;chown -R 1000:1000 /你的数据目录&lt;/code&gt;，再 &lt;code&gt;docker compose up -d&lt;/code&gt; 一次，它就乖乖听 &lt;code&gt;3001&lt;/code&gt; 了。&lt;/p&gt;&#xA;&lt;p&gt;本文顺道把&amp;quot;Prisma 那个 &lt;code&gt;file:../storage/anythingllm.db&lt;/code&gt; 相对路径为什么能坑死人&amp;quot;讲清楚，最后附上 Portainer stack 写法、几条常见坑、以及中英两个 demo 地址。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>PhotoPrism 启动 5 分钟还在装系统包？一次 PHOTOPRISM_INIT=intel 的踩坑与正确配置</title>
      <link>https://blog.margrop.net/post/photoprism-init-intel-stuck/</link>
      <pubDate>Sat, 13 Jun 2026 08:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/photoprism-init-intel-stuck/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR（先说结论）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;PhotoPrism Plus 镜像的 &lt;code&gt;docker-compose.yml&lt;/code&gt; 里有一行 &lt;code&gt;PHOTOPRISM_INIT: &amp;quot;intel&amp;quot;&lt;/code&gt;，看似只是给 Intel 核显开加速，实际上它在容器&lt;strong&gt;第一次启动&lt;/strong&gt;时会去 &lt;code&gt;archive.ubuntu.com&lt;/code&gt; 跑一次完整的 &lt;code&gt;apt-get dist-upgrade&lt;/code&gt;，再装 7 个 GPU / VA-API 包。这套流程 &lt;strong&gt;5–10 分钟起步&lt;/strong&gt;，整个期间容器内部没有任何进程在监听 &lt;code&gt;2342&lt;/code&gt; 端口。你的 &lt;code&gt;docker ps&lt;/code&gt; 显示 &lt;code&gt;Up&lt;/code&gt;、Portainer 一切绿、&lt;code&gt;ss -ltn&lt;/code&gt; 也看到 &lt;code&gt;0.0.0.0:2342&lt;/code&gt; 在 LISTEN——但浏览器一访问就是 &lt;strong&gt;ERR_CONNECTION_RESET / Connection reset by peer&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;解法非常简单：&lt;strong&gt;删掉或清空那一行&lt;/strong&gt;。你 &lt;code&gt;devices&lt;/code&gt; 里已经挂上 &lt;code&gt;/dev/dri/renderD128&lt;/code&gt; 直通，驱动和 VA-API 用户态工具由宿主机提供，容器里再装一遍是纯浪费。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Portainer 改个 stack 一直 500？我花了一晚上才明白，是 Docker 引擎里多了一个「重影」网络</title>
      <link>https://blog.margrop.net/post/portainer-500-duplicate-compose-network-enigma/</link>
      <pubDate>Sat, 13 Jun 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/portainer-500-duplicate-compose-network-enigma/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Portainer 改一个 stack，浏览器上弹出 &lt;code&gt;500 Internal Server Error&lt;/code&gt;。你以为又是 YAML 写错了，回去检查 compose 语法、缩进、引号、镜像 tag，全部都对。但每次重试都是同一个 500。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;真正的问题藏在 HTTP response body 的 &lt;code&gt;message&lt;/code&gt; 字段最深处：&lt;code&gt;network librespeed_default is ambiguous (2 matches found on name)&lt;/code&gt;。&lt;/strong&gt; 也就是说，Docker 引擎里同时存在两个 &lt;code&gt;librespeed_default&lt;/code&gt; 网络——两个 ID、两个 &lt;code&gt;Created&lt;/code&gt; 时间、两个 &lt;code&gt;com.docker.compose.config-hash&lt;/code&gt;，但名字一模一样。Compose 启动时让引擎去 lookup 名字，引擎说「我选不出来」，compose up 失败，Portainer 把这条错误原样包成 500 退给浏览器。&lt;/p&gt;&#xA;&lt;p&gt;修复办法朴素到尴尬：在引擎上&lt;strong&gt;删掉其中一个孤儿网络&lt;/strong&gt;（&lt;code&gt;docker network rm &amp;lt;id&amp;gt;&lt;/code&gt; 或在 Portainer 的 Networks 里点 Remove），再原样点一次 Update the stack，就过了。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章源于一次真实的 stack 改挂载路径的过程。全程我已经把所有内网地址、镜像仓库地址、卷挂载路径、容器名、用户名密码用 &lt;code&gt;&amp;lt;PLACEHOLDER&amp;gt;&lt;/code&gt; 替换，只保留公开信息、官方源码、错误文本这些可分享的内容。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker 容器跑得好好的，端口死活访问不了：一次 HostIp 绑定&#39;半残&#39;的完整复盘</title>
      <link>https://blog.margrop.net/post/docker-port-bind-half-silent/</link>
      <pubDate>Sat, 13 Jun 2026 07:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/docker-port-bind-half-silent/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;一句话总结：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; 看着一切正常，&lt;code&gt;docker inspect&lt;/code&gt; 的 &lt;code&gt;HostConfig.PortBindings&lt;/code&gt; 也写好了 &lt;code&gt;203.0.113.14:3001:3000&lt;/code&gt;——但 host 上&lt;strong&gt;没有 docker-proxy 在监听&lt;/strong&gt;、iptables &lt;code&gt;nat/DOCKER&lt;/code&gt; 链里&lt;strong&gt;没有 DNAT 规则&lt;/strong&gt;、&lt;code&gt;NetworkSettings.Networks&lt;/code&gt; 和 &lt;code&gt;Ports&lt;/code&gt; &lt;strong&gt;两个字段都是空 &lt;code&gt;{}&lt;/code&gt;&lt;/strong&gt;。这种&amp;quot;容器活着、端口死了&amp;quot;的诡异状态，本质是 libnetwork 在 attach 网络时因为目标接口尚未就绪而&lt;strong&gt;静默回滚了 endpoint 创建&lt;/strong&gt;，但容器进程已经起好，docker 也没把&amp;quot;端口没生效&amp;quot;这件事主动告诉我们。&lt;strong&gt;30 秒一行命令就能让端口重新回来&lt;/strong&gt;：&lt;code&gt;docker network connect &amp;lt;net&amp;gt; &amp;lt;ctr&amp;gt;&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>把一台慢成蜗牛的 Docker 镜像代理从 5 分 14 秒干到 0.6 秒:我踩过的三个坑和一段 5 行的 cron</title>
      <link>https://blog.margrop.net/post/docker-registry-mirror-rebuild-2026/</link>
      <pubDate>Sat, 13 Jun 2026 07:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/docker-registry-mirror-rebuild-2026/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;我在家里的自建小集群上跑着一个 &lt;code&gt;registry:2&lt;/code&gt; 的 pull-through 代理,平时给局域网里的几台机器和 NAS 当 Docker Hub 镜像源用,用了快两年一直挺稳。&lt;strong&gt;直到有一天,它拉一个 5MB 的 alpine 镜像要 5 分 14 秒。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这篇文章记录我&lt;strong&gt;怎么查到根因&lt;/strong&gt;、&lt;strong&gt;换了哪些方案&lt;/strong&gt;、&lt;strong&gt;为什么每一版都没让我满意&lt;/strong&gt;、&lt;strong&gt;最后怎么用一个 5 行的 bash 脚本 + 每天一次的 cron 把它彻底稳下来&lt;/strong&gt;。整个排查过程 100% 是我在自己的机器上跑出来的真实数据,不是我抄 README、不是我看博客道听途说。&lt;/p&gt;&#xA;&lt;p&gt;关键决策点都贴了实测数据。如果你也在自建 docker 镜像代理,或者你公司的 devops 团队在维护一个内部 registry 镜像,文末的 Q&amp;amp;A 段能帮你省掉至少 3 小时的踩坑。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>别再用旧方法了！Ubuntu 26.04 LTS 一键搞定最新 Docker 社区版与极速镜像源配置</title>
      <link>https://blog.margrop.net/post/ubuntu-26-docker-install-guide/</link>
      <pubDate>Tue, 26 May 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/ubuntu-26-docker-install-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;写在前面&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;随着 Ubuntu 26.04 LTS（Resolute Raccoon）的正式发布，许多开发者和系统管理员都开始将他们的开发与生产环境迁移至这个最新的长期支持版本。然而，作为容器化技术的基石，Docker 在新系统上的安装与配置却给不少人带来了困扰。&lt;/p&gt;&#xA;&lt;p&gt;如果你还在使用传统的 &lt;code&gt;apt-get install docker.io&lt;/code&gt; 或者套用几年前的 Ubuntu 20.04/22.04 旧教程来配置 APT 源与镜像加速，那么你可能会面临软件包版本陈旧、源格式冲突（DEB822 新格式带来的困惑）、或者因网络阻断导致镜像无法拉取的窘境。&lt;/p&gt;&#xA;&lt;p&gt;本文将手把手带你深度剖析 Ubuntu 26.04 下 Docker 社区版（Docker CE）的正确安装姿势，并结合最新的 DEB822 源规范、非 Root 用户安全权限划分、以及在当前复杂网络环境下的极速代理与私有镜像源配置，为你奉上一份真正结构化、高可用的实战指南。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>新电脑 Bitwarden 登不上，旧电脑却正常：一次 Vaultwarden 版本兼容坑的完整复盘</title>
      <link>https://blog.margrop.net/post/chrome-bitwarden-vaultwarden-login-failure-prelogin/</link>
      <pubDate>Mon, 18 May 2026 10:05:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/chrome-bitwarden-vaultwarden-login-failure-prelogin/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这次问题表面上看是“新安装的 Chrome + Bitwarden 扩展登录失败”，但根因并不在 Chrome，也不是账号密码输错，而是 &lt;strong&gt;Bitwarden 2026.4.1 客户端登录流程调用了新的 prelogin 接口，而自建 Vaultwarden 服务端还停留在 &lt;code&gt;1.35.4-alpine&lt;/code&gt;，缺少 &lt;code&gt;/identity/accounts/prelogin/password&lt;/code&gt; 接口&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;旧电脑之所以还能用，是因为它大概率已有登录态和本地缓存，并没有重新触发完整的首次登录流程。真正的修复不是反复重装浏览器，而是先备份，再把 Vaultwarden 升级到 &lt;code&gt;1.36.0&lt;/code&gt; 或更新版本，然后用日志确认新接口不再 404。&lt;/p&gt;&#xA;&lt;p&gt;本文所有域名、路径、账号、部署目录均已脱敏，示例中统一使用 &lt;code&gt;vault.example.com&lt;/code&gt;、&lt;code&gt;/opt/vaultwarden&lt;/code&gt; 等占位值，不包含任何内网地址或私人信息。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker 容器太多导致网段冲突：把自动分配网络统一迁回 172 私有段的完整记录</title>
      <link>https://blog.margrop.net/post/docker-network-subnet-conflict-migration-record/</link>
      <pubDate>Mon, 13 Apr 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/docker-network-subnet-conflict-migration-record/</guid>
      <description>&lt;p&gt;这篇文章记录的是一次很典型、也很容易被忽略的 Docker 网络故障：容器越来越多，Docker 自动分配出来的 user-defined bridge 网段，最后落进了 &lt;code&gt;192.168.x.x&lt;/code&gt;，并且和家里的真实局域网发生了冲突。问题本身不算复杂，但它有一个很讨厌的特点：它不是那种“容器起不来”或者“端口没映射”的显性错误，而是把整个家庭网络拖进一个很别扭的半瘫痪状态。&lt;/p&gt;&#xA;&lt;p&gt;当时在我的 NAS 上，家里部分设备开始出现访问异常。表面上看，像是某个设备离线，或者某个交换机、AP、路由器出了毛病；但我沿着 Docker 的网络一路排查下去后，最终确认，真正的根因不是单个容器坏了，而是 Docker 网络池的自动分配策略，已经把局域网挤到了一个危险的位置。&lt;/p&gt;</description>
    </item>
    <item>
      <title>cloudflare workers 解决docker无法拉取镜像问题</title>
      <link>https://blog.margrop.net/post/cloudflare-workers-slove-docker-mirrors-blocked/</link>
      <pubDate>Mon, 10 Jun 2024 14:16:26 +0800</pubDate>
      <guid>https://blog.margrop.net/post/cloudflare-workers-slove-docker-mirrors-blocked/</guid>
      <description>&lt;p&gt;由于某些原因，目前国内无法正常拉取docker镜像，去年写的加速拉取镜像的办法也没法用，困难总比办法多（不是），干脆新写一篇教程，利用cloudflare workers 解决docker无法拉取镜像问题。&lt;/p&gt;&#xA;&lt;p&gt;本篇利用cloudflare workers来解决无法拉取镜像问题，关于cloudflare这里不再过多介绍，cloudflare workers服务也是免费，不懂的童鞋可以自行翻看往期文章《&lt;a href=&#34;http://mp.weixin.qq.com/s?__biz=MzIxMjE1NDQxNA==&amp;mid=2247484002&amp;idx=1&amp;sn=5cf3b8876df7d871774641c5f24261d7&amp;chksm=974b2323a03caa35e053659efda5e285635f83d011cadf54e7c05288f40a4df1811fcf0338ff&amp;scene=21#wechat_redirect&#34;&gt;cloudflare加快github下载&lt;/a&gt;》。&lt;strong&gt;如果看完本篇也不想动手，也可以在后台回复“jsdc”获取我搭建好的公共服务地址&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【转】如何设置xiaoya的docker，及tvbox配置</title>
      <link>https://blog.margrop.net/post/deploy-xiaoya-docker-and-tvbox/</link>
      <pubDate>Tue, 30 Apr 2024 21:18:55 +0800</pubDate>
      <guid>https://blog.margrop.net/post/deploy-xiaoya-docker-and-tvbox/</guid>
      <description>&lt;p&gt;文章来源：&lt;a href=&#34;https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f&#34;&gt;https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;如何设置xiaoya的docker&#34;&gt;如何设置xiaoya的docker&lt;/h1&gt;&#xA;&lt;p&gt;要获得最新小雅的资讯请关注小雅的tg频道 &lt;a href=&#34;https://t.me/xiaoyaliu&#34;&gt;https://t.me/xiaoyaliu&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;平时有什么使用上遇到的困难可以来这里找我或其他人帮助 &lt;a href=&#34;https://t.me/PlutoPlayer&#34;&gt;https://t.me/PlutoPlayer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;目录&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h1 id=&#34;你需要什么才能安装-xiaoya-的docker&#34;&gt;你需要什么才能安装 xiaoya 的docker&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;软路由盒子类似 n1 等，具有 openwrt环境 （可以终端上一键配置）&lt;/li&gt;&#xA;&lt;li&gt;NAS 等具有docker插件 （无法或很难登入终端，需要图形化自行配置）&lt;/li&gt;&#xA;&lt;li&gt;云服务器也就是俗称的 vps （可以终端上一键配置）&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Docker容器内如何连接宿主机的MySQL服务器</title>
      <link>https://blog.margrop.net/post/docker-connect-mysql-in-host-machine/</link>
      <pubDate>Thu, 30 Sep 2021 13:08:50 +0800</pubDate>
      <guid>https://blog.margrop.net/post/docker-connect-mysql-in-host-machine/</guid>
      <description>&lt;p&gt;博主最近遇到一种情况，从服务器拷贝了一份数据库在宿主机Mysql服务器上，想要用本地的数据库测试自己的代码正确性，但是项目程序都是靠docker一键部署的，于是必定要在docker容器里访问到本地的数据库。在探索中遇到了问题并得到了解决。&lt;/p&gt;</description>
    </item>
    <item>
      <title>reboot 后 Docker服务及容器自动启动设置</title>
      <link>https://blog.margrop.net/post/reboot-docker-server-auto-start/</link>
      <pubDate>Tue, 06 Apr 2021 14:39:32 +0800</pubDate>
      <guid>https://blog.margrop.net/post/reboot-docker-server-auto-start/</guid>
      <description>&lt;p&gt;重启reboot操作系统后，发现docker 服务未启动，容器也未启动，天生反骨，怎么才能重启后自动启动呢？&lt;/p&gt;&#xA;&lt;h1 id=&#34;解决问题两个问题&#34;&gt;解决问题两个问题：&lt;/h1&gt;&#xA;&lt;p&gt;1、docker服务自动重启设置&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable docker.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.margrop.net/post-images/external/cd1b1425e8c3d0f4.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>搭建自己的密码管理服务器 Bitwarden</title>
      <link>https://blog.margrop.net/post/deploy-open-source-password-manager-bitwarden/</link>
      <pubDate>Wed, 17 Feb 2021 20:20:06 +0800</pubDate>
      <guid>https://blog.margrop.net/post/deploy-open-source-password-manager-bitwarden/</guid>
      <description>&lt;p&gt;很多人对于把密码放在网上，比如 lastpass 虽然官方说是提供加密了，服务器上看不到用户密码，但是还是不太放心，那么就可以搭建开源的 Bitwarden 搭建一个自己的密码管理服务器。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;准备：一个 vps 服务器和一个域名且解析 IP 地址到服务器&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>如何搭建开源的Web流程图工具 Diagrams.net（原draw.io）</title>
      <link>https://blog.margrop.net/post/how-to-install-docker-drawio/</link>
      <pubDate>Sat, 30 Jan 2021 17:59:08 +0800</pubDate>
      <guid>https://blog.margrop.net/post/how-to-install-docker-drawio/</guid>
      <description>&lt;p&gt;&lt;code&gt;ProcessOn&lt;/code&gt;目前已经是大家熟知的Web的&lt;code&gt;流程图&lt;/code&gt;，&lt;code&gt;UML&lt;/code&gt;等绘图工具了。但 &lt;code&gt;ProcessOn&lt;/code&gt; 是收费服务，免费的又限制太多，那还有免费的午餐吗？&lt;/p&gt;&#xA;&lt;p&gt;有，就是&lt;code&gt;Diagrams.net&lt;/code&gt;。&lt;strong&gt;完全免费，功能强大~&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>CentOS 7 安装Docker并设置国内阿里源</title>
      <link>https://blog.margrop.net/post/centos-7-install-docker-ce-and-update-source/</link>
      <pubDate>Fri, 29 Jan 2021 11:40:18 +0800</pubDate>
      <guid>https://blog.margrop.net/post/centos-7-install-docker-ce-and-update-source/</guid>
      <description>&lt;h1 id=&#34;docker版本&#34;&gt;docker版本&lt;/h1&gt;&#xA;&lt;p&gt;docker从1.13版本之后采用时间线的方式作为版本号，分为社区版CE和企业版EE。Docker CE即社区免费版，Docker EE即企业版,付费使用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python3的Web环境，含第三方以及自建</title>
      <link>https://blog.margrop.net/post/python3-web-runtime-environment/</link>
      <pubDate>Sun, 24 Jan 2021 13:07:30 +0800</pubDate>
      <guid>https://blog.margrop.net/post/python3-web-runtime-environment/</guid>
      <description>&lt;p&gt;之前因为某件家事，需要使用&lt;code&gt;Python3&lt;/code&gt;的Web环境，于是收集了一下。&#xA;第三方网站的环境使用起来很简单，但缺点也很明显，不能保存上次的&lt;code&gt;Python&lt;/code&gt;代码。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【转】黑群晖（Synology）半洗白最新方法</title>
      <link>https://blog.margrop.net/post/synology-half-crack-way-docker-ddsm/</link>
      <pubDate>Tue, 19 Jan 2021 18:10:53 +0800</pubDate>
      <guid>https://blog.margrop.net/post/synology-half-crack-way-docker-ddsm/</guid>
      <description>&lt;p&gt;最近新搭一个&lt;code&gt;NAS&lt;/code&gt;，安装好发现之前提供的半洗白方案已经不起作用了&#xA;之前的帖子&lt;a href=&#34;http://blog.lixx.vip/%E9%BB%91%E7%BE%A4%E6%99%96%EF%BC%88synology%EF%BC%89nas-6-22-%E6%8A%98%E8%85%BE%E8%AE%B0-%E5%8D%8A%E6%B4%97%E7%99%BD/&#34;&gt;http://blog.lixx.vip/黑群晖（synology）nas-6-22-折腾记-半洗白/&lt;/a&gt;&#xA;主要是群晖新版的&lt;code&gt;Docker 18.09.0-0506&lt;/code&gt;关闭了&lt;code&gt;DDSM&lt;/code&gt;安装&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
