<?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 Margrop Blog</title>
    <link>https://blog.margrop.net/en/tag/docker/</link>
    <description>Recent content in Docker on Margrop Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-US</language>
    <lastBuildDate>Wed, 15 Jul 2026 19:30:00 +0800</lastBuildDate>
    <atom:link href="https://blog.margrop.net/en/tag/docker/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Docker Pulls Keep Timing Out? How to Choose, Configure, and Verify Chinese Registry Mirrors</title>
      <link>https://blog.margrop.net/en/post/docker-mirror-source-selection-guide/</link>
      <pubDate>Wed, 15 Jul 2026 19:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-mirror-source-selection-guide/</guid>
      <description>The short answer&#xA;When Docker image pulls fail on a mainland China network, the image is not necessarily missing and DNS is not always the culprit. More often, the public registry path is congested, a mirror is temporarily unavailable, or the configuration was edited but Docker was never restarted.&#xA;My practical recommendation is simple: open status.anye.xyz first and treat it as a “weather report” for Docker mirrors; select a recently healthy HTTPS endpoint; edit the correct daemon configuration for your operating system; validate the JSON; restart Docker; and finally verify with a real pull of a small image.</description>
    </item>
    <item>
      <title>You Bought an Overseas VPS and a Domain. Now What? 12 Things That Make a Public IP Worth Owning</title>
      <link>https://blog.margrop.net/en/post/vps-domain-personal-internet-infrastructure/</link>
      <pubDate>Sat, 11 Jul 2026 13:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/vps-domain-personal-internet-infrastructure/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short answer&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;An overseas VPS by itself is a powered, connected room without a memorable street address. A top-level domain by itself is only a sign. Put the domain on Cloudflare DNS and point carefully chosen records at the VPS, and you finally own the sign, the map, the storefront, and a standards-based public entrance.&lt;/p&gt;&#xA;&lt;p&gt;The result is much more useful than “a place to host a blog.” It is a small, always-on piece of Internet infrastructure where you control the code and the migration path: websites, APIs, webhooks, status pages, monitoring, controlled file sharing, password management, remote-access relays, automation jobs, and a personal AI gateway can all grow from the same foundation.&lt;/p&gt;&#xA;&lt;p&gt;A public IP is also a door facing a busy street. Automated scanners may try the handle shortly after the server appears. This guide therefore covers both the useful projects and the services that should never be exposed directly.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Take Back Your Remote Desktop: Deploying an All-in-One RustDesk Server Safely</title>
      <link>https://blog.margrop.net/en/post/rustdesk-all-in-one-server-guide/</link>
      <pubDate>Fri, 10 Jul 2026 22:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/rustdesk-all-in-one-server-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;RustDesk is an open-source remote desktop application designed with self-hosting in mind. When two clients can reach each other directly, screen and input traffic can use a peer-to-peer path. When that direct path fails, a relay server forwards the encrypted traffic. Hosting the server yourself does not eliminate servers; it puts device registration, relay routing, keys, accounts, and logs back under your control.&lt;/p&gt;&#xA;&lt;p&gt;This guide uses the community-maintained &lt;code&gt;lejianwen/rustdesk-server-s6&lt;/code&gt; image to place the RustDesk OSS &lt;code&gt;hbbs&lt;/code&gt; and &lt;code&gt;hbbr&lt;/code&gt; services together with a community API and web administration layer in one container. It is a convenient option for homes, labs, and small teams, but it is &lt;strong&gt;not an official RustDesk all-in-one distribution&lt;/strong&gt;. Evaluate the community image, pin a tested tag or digest, back up its persistent data, and rehearse upgrades and rollbacks before treating it as production infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;Every address in this article uses &lt;code&gt;example.com&lt;/code&gt;. No real IP address, private domain, hostname, device ID, account, key, token, cookie, or private registry is shown. The screenshots come from public official or community project pages.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>I Put Docker in a Control Room: Portainer CE 2.39.4 Deployment, Daily Use, and Real Traps</title>
      <link>https://blog.margrop.net/en/post/portainer-ce-docker-deployment-guide/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/portainer-ce-docker-deployment-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Portainer does not replace Docker. It is a control room for a Docker host. Docker Engine remains the machinery; Portainer organizes containers, images, networks, volumes, and Compose stacks into a web dashboard.&lt;/p&gt;&#xA;&lt;p&gt;I ran an isolated deployment of &lt;code&gt;portainer/portainer-ce:2.39.4&lt;/code&gt;, initialized it, connected the local Docker environment, inspected the dashboard, filtered a disposable container, and created a demonstration stack. The installation is one &lt;code&gt;docker run&lt;/code&gt; command. The important lessons are broader: persist &lt;code&gt;/data&lt;/code&gt;, understand that &lt;code&gt;/var/run/docker.sock&lt;/code&gt; is highly privileged, and never expose the management interface to an untrusted network without protection.&lt;/p&gt;&#xA;&lt;p&gt;This article contains no complete IP address, real host name, private domain, administrator password, token, cookie, private registry address, or production container name. The screenshots use disposable names, and the container address is redacted.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Sprinkling API Keys Everywhere: My Self-Hosted NewAPI Relay Station</title>
      <link>https://blog.margrop.net/en/post/newapi-self-hosted-relay-station/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/newapi-self-hosted-relay-station/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;NewAPI is not a free-model trick and it is not a mysterious proxy. In my setup, it is the front desk for AI usage: every app talks to one endpoint, while the gateway routes requests to authorized upstream providers and handles tokens, quotas, groups, model limits, logs, and usage accounting. For a personal deployment, the big win is not “one more dashboard”; it is no longer scattering upstream keys across every client, script, and agent.&lt;/p&gt;&#xA;&lt;p&gt;This post explains why I wanted a self-hosted model relay, what people usually misunderstand, how to deploy a minimal Docker Compose version, why I add persistent storage, and how to use one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26. It also includes an agent-driven setup prompt with strict boundaries. No private address, complete machine name, private domain, or real secret is included.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Self-Hosted Web Clipboard I Kept Is Just One Text Box</title>
      <link>https://blog.margrop.net/en/post/minimalist-web-notepad-lightweight-clipboard/</link>
      <pubDate>Fri, 10 Jul 2026 15:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/minimalist-web-notepad-lightweight-clipboard/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After trying many cross-device clipboard and note tools, the one I kept for personal use is almost embarrassingly small: &lt;code&gt;minimalist-web-notepad&lt;/code&gt;. When you open it, there is essentially one text box. It supports plain text only. There is no account system, no rich text editor, no image upload, no folder tree, no dashboard, and no collaboration layer.&lt;/p&gt;&#xA;&lt;p&gt;That is exactly why it works as a lightweight self-hosted web clipboard. It is good for moving a short command from one device to another, dropping a temporary note into a browser, reading or writing a tiny text value with &lt;code&gt;curl&lt;/code&gt;, or keeping a disposable piece of text for a few minutes. It is not a knowledge base. It is not a password vault. It is a piece of scratch paper on the network.&lt;/p&gt;&#xA;&lt;p&gt;This post uses the &lt;code&gt;ahfeil/minimalist-web-notepad:latest&lt;/code&gt; image with Docker Compose. It also includes one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26, plus two operating modes: manual automatic execution and agent-driven configuration. No private network address, private domain, full machine name, or real secret is shown in this article.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Do Not Just Copy QingLong Into BaiHu: A Real Safe Migration Drill</title>
      <link>https://blog.margrop.net/en/post/qinglong-to-baihu-safe-migration/</link>
      <pubDate>Thu, 09 Jul 2026 10:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/qinglong-to-baihu-safe-migration/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Migrating from QingLong Panel to BaiHu Panel is not a directory-copy exercise. I ran a real migration drill in an isolated Docker environment: a fresh QingLong instance with sample environment variables, scripts, labels, and cron jobs; then a fresh BaiHu instance; then an actual conversion and verification pass.&lt;/p&gt;&#xA;&lt;p&gt;The reliable migration unit is not the whole QingLong data directory. It is a set of assets: script files, environment variables, scheduled tasks, tags, enabled/disabled state, and task-variable relations. QingLong uses numeric IDs; BaiHu uses string IDs and relation tables. QingLong commands such as &lt;code&gt;task daily_check.py&lt;/code&gt; also need to become executable BaiHu commands such as &lt;code&gt;python /app/data/scripts/qinglong-migrated/daily_check.py&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This article contains no full private IP address, private registry address, host name, token, cookie, or production secret. The screenshots come from a disposable lab, and the variables are redacted sample data.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Should QingLong Panel Still Face the Public Internet? After the 2026 Bypass, I Would Start With BaiHu</title>
      <link>https://blog.margrop.net/en/post/qinglong-baihu-panel-security/</link>
      <pubDate>Thu, 09 Jul 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/qinglong-baihu-panel-security/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Bottom line first&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;QingLong Panel used to be the default answer for many self-hosted scheduled-script setups. It can run scripts, manage environment variables, show logs, synchronize repositories, and wrap crontab-like workflows in a friendly web UI. But the critical QingLong issues publicly discussed in early 2026 changed the risk calculation: &lt;strong&gt;a task scheduler panel is not just another web admin page. It often holds scripts, secrets, notification tokens, and execution privileges. If authentication can be bypassed, the attacker is not merely viewing a dashboard; they may be standing in front of a machine that can run jobs.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;For new lightweight deployments, I would now evaluate BaiHu Panel first. BaiHu is a Go + Vue3 automation task scheduling platform focused on low overhead and high performance. Its public README describes Docker / Docker Compose deployment, Mise-based runtime management, repository task synchronization, logs, notifications, and secret handling. It is not a perfect one-to-one replacement for every QingLong workflow, but it is a better starting point for many personal script-hosting cases.&lt;/p&gt;&#xA;&lt;p&gt;If you must keep using QingLong temporarily because of old jobs, migration cost, or compatibility constraints, do not expose it directly to the public Internet. Put a protection layer in front of it: VPN, zero-trust access, reverse-proxy Basic Auth, an allowlist, WAF rules, or equivalent access control. This article includes one-click scripts for Windows 11, Ubuntu 26.04, and macOS 26. They deploy BaiHu by default, require an explicit switch to deploy QingLong, and put either panel behind Caddy Basic Auth.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker Container Crash Loop After v3.7.0? You&#39;re Missing One Word: serve</title>
      <link>https://blog.margrop.net/en/post/siyuan-v370-docker-restart-loop-fix/</link>
      <pubDate>Thu, 02 Jul 2026 19:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/siyuan-v370-docker-restart-loop-fix/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;After upgrading Siyuan (SiYuan Note) from v3.6.x to v3.7.0, the Docker container entered an infinite restart loop. &lt;code&gt;docker logs&lt;/code&gt; showed &lt;code&gt;Error: unknown flag: --accessAuthCode&lt;/code&gt;. The root cause: v3.7.0 introduced a CLI subcommand architecture. The old top-level flags now require a &lt;code&gt;serve&lt;/code&gt; subcommand. The fix is adding one word — &lt;code&gt;&#39;serve&#39;&lt;/code&gt; — to the beginning of the &lt;code&gt;command&lt;/code&gt; array in docker-compose.yml. Seven characters. From crash loop to running.&lt;/p&gt;&#xA;&lt;p&gt;This article covers the complete troubleshooting process, one-command fix scripts for Windows 11, Ubuntu 26.04, and macOS 26, plus both manual and AI Agent approaches. All scripts use only Docker CLI and SSH — no third-party services required.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Docker Images, No More Begging: Build Your Own 13 GB Private Registry From Scratch</title>
      <link>https://blog.margrop.net/en/post/build-private-docker-registry-without-hassle/</link>
      <pubDate>Fri, 26 Jun 2026 12:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/build-private-docker-registry-without-hassle/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;My home server runs a single &lt;code&gt;registry:2&lt;/code&gt; container that currently holds &lt;strong&gt;13 GB of cached blobs across 95 repositories&lt;/strong&gt;. Every NAS, Proxmox node, Mac, and Windows machine on my LAN pulls through it. A cold start of &lt;code&gt;alpine:3.19&lt;/code&gt; finishes in under a second, with zero traffic going out to the public Docker Hub.&lt;/p&gt;&#xA;&lt;p&gt;This isn&amp;rsquo;t a one-line &amp;ldquo;install Docker and run a container&amp;rdquo; tutorial. I&amp;rsquo;ll show you the &lt;strong&gt;production-grade deployment script I actually run&lt;/strong&gt;, walk through the Docker v2 auth flow, and call out the four reverse-proxy pitfalls that turn every &lt;code&gt;docker login&lt;/code&gt; into a 401 mystery. You&amp;rsquo;ll leave able to: ① bring up an authenticated registry in 10 minutes; ② explain why the &lt;code&gt;WWW-Authenticate&lt;/code&gt; header is sacred; ③ describe the whole thing to a non-technical family member without losing accuracy.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Letting Agents Burn Tokens: Wiring Headroom into NewAPI, OpenClaw, and HermesAgent</title>
      <link>https://blog.margrop.net/en/post/headroom-newapi-openclaw-hermesagent-token-compression-guide/</link>
      <pubDate>Sat, 20 Jun 2026 12:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/headroom-newapi-openclaw-hermesagent-token-compression-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I did not replace NewAPI, and I did not point OpenClaw or HermesAgent at an unproven gateway. The actual design is simpler: place Headroom in front of NewAPI, then move only the already validated OpenAI-compatible providers to &lt;code&gt;http://&amp;lt;headroom-host&amp;gt;:8787/v1&lt;/code&gt;. The original NewAPI endpoint stays available. Long agent context now goes through Headroom first, gets compressed, then continues to NewAPI for the same routing and model management as before.&lt;/p&gt;&#xA;&lt;p&gt;The rule that kept the rollout boring was: &lt;strong&gt;test first, edit second; migrate only OpenAI-compatible providers that pass; leave non-OpenAI fallbacks alone.&lt;/strong&gt; This post is both a write-up and a runbook you can hand to an Agent or follow manually.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>I dockerized AnythingLLM and the container turned into a wound-up squirrel — restarting forever until I handed it that magic 1000:1000</title>
      <link>https://blog.margrop.net/en/post/anythingllm-docker-deploy/</link>
      <pubDate>Wed, 17 Jun 2026 20:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/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, Mintplex Labs&amp;rsquo; &amp;ldquo;stuff-anything-in-a-LLM&amp;rdquo; desktop, ships an official Docker image. In the happy path one &lt;code&gt;docker run&lt;/code&gt; is all you need. But the in-container user &lt;code&gt;anythingllm&lt;/code&gt; is picky: the host directory you bind-mount has to be owned by &lt;code&gt;1000:1000&lt;/code&gt;, otherwise it can&amp;rsquo;t write its own SQLite file, the Prisma migration step on startup crashes, and the container enters a &lt;em&gt;restart-crash-restart&lt;/em&gt; loop. The fix takes under a minute: &lt;code&gt;chown -R 1000:1000 /your/data/dir&lt;/code&gt;, then &lt;code&gt;docker compose up -d&lt;/code&gt; again, and it dutifully listens on &lt;code&gt;3001&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll also explain why Prisma&amp;rsquo;s &lt;code&gt;file:../storage/anythingllm.db&lt;/code&gt; relative path is a footgun, give you a Portainer-ready stack file, and finish with a Q&amp;amp;A on the most common gotchas.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>PhotoPrism Stuck for 5 Minutes on First Boot? A Postmortem on PHOTOPRISM_INIT=intel</title>
      <link>https://blog.margrop.net/en/post/photoprism-init-intel-stuck/</link>
      <pubDate>Sat, 13 Jun 2026 08:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/photoprism-init-intel-stuck/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR (The Short Version)&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;PHOTOPRISM_INIT: &amp;quot;intel&amp;quot;&lt;/code&gt; line in PhotoPrism&amp;rsquo;s Plus Docker image is &lt;strong&gt;not&lt;/strong&gt; just a flag to enable Intel hardware acceleration at runtime — it&amp;rsquo;s a one-shot &lt;strong&gt;system-level installer&lt;/strong&gt; that runs &lt;code&gt;apt-get dist-upgrade&lt;/code&gt; against &lt;code&gt;archive.ubuntu.com&lt;/code&gt; and then installs 8 Intel/VA-API packages before the main process is allowed to start. On a fresh container this takes &lt;strong&gt;5–10 minutes&lt;/strong&gt; (sometimes more), during which nothing inside the container listens on port &lt;code&gt;2342&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Meanwhile: &lt;code&gt;docker ps&lt;/code&gt; says &lt;code&gt;Up&lt;/code&gt;, Portainer is green, &lt;code&gt;ss -ltn&lt;/code&gt; on the host shows &lt;code&gt;:2342&lt;/code&gt; LISTEN — but your browser gets &lt;code&gt;ERR_CONNECTION_RESET&lt;/code&gt; / &lt;code&gt;Connection reset by peer&lt;/code&gt;. Because host-side &lt;code&gt;docker-proxy&lt;/code&gt; accepts the connection and then tries to forward to a port inside the container that has no listener, the kernel sends back an RST.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; just remove or empty that one line. If you already pass &lt;code&gt;/dev/dri/renderD128&lt;/code&gt; via &lt;code&gt;devices:&lt;/code&gt;, the host&amp;rsquo;s drivers and userland libraries are perfectly usable from the container — there&amp;rsquo;s nothing to &amp;ldquo;install&amp;rdquo; in there.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>The Portainer 500 Error That Wasn&#39;t the YAML — A Two-librespeed_default-Network Story</title>
      <link>https://blog.margrop.net/en/post/portainer-500-duplicate-compose-network-enigma/</link>
      <pubDate>Sat, 13 Jun 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/portainer-500-duplicate-compose-network-enigma/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;The short version&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You update a stack in Portainer. The browser slaps you with a red &lt;code&gt;500 Internal Server Error&lt;/code&gt;. You assume the YAML is wrong, fix the indentation, swap the quotes, drop the image tag. You hit Update again. Same 500. And again. And again.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;The real culprit is buried at the deepest level of the HTTP response body: &lt;code&gt;network librespeed_default is ambiguous (2 matches found on name)&lt;/code&gt;.&lt;/strong&gt; Two networks with the same name exist in the same Docker engine—two IDs, two &lt;code&gt;Created&lt;/code&gt; timestamps, two &lt;code&gt;com.docker.compose.config-hash&lt;/code&gt; labels, but a single shared name. Compose asks the engine to look up that name; the engine refuses to pick between them; &lt;code&gt;compose up&lt;/code&gt; fails; Portainer wraps the error as a 500 and returns it to your browser.&lt;/p&gt;&#xA;&lt;p&gt;The fix is embarrassingly simple: &lt;strong&gt;delete one of the two orphan networks&lt;/strong&gt; (&lt;code&gt;docker network rm &amp;lt;id&amp;gt;&lt;/code&gt; or click Remove in Portainer&amp;rsquo;s Networks page), then re-run Update the stack with the exact same content. It just works.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post is a real debugging session: a stack update that was supposed to be a 30-second mount-path change turned into a 1-hour investigation. All private details (internal addresses, registry URLs, volume paths, container names, credentials) have been replaced with &lt;code&gt;&amp;lt;PLACEHOLDER&amp;gt;&lt;/code&gt;. Only public source code, official docs, and the error text itself are preserved.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Docker Container Is Running, the Port Is Dead: A Complete Walkthrough of a Silent Host-Bind Failure</title>
      <link>https://blog.margrop.net/en/post/docker-port-bind-half-silent/</link>
      <pubDate>Sat, 13 Jun 2026 07:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-port-bind-half-silent/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; says everything is fine. &lt;code&gt;docker inspect&lt;/code&gt;&amp;rsquo;s &lt;code&gt;HostConfig.PortBindings&lt;/code&gt; clearly says &lt;code&gt;203.0.113.14:3001:3000&lt;/code&gt;. But on the host, &lt;strong&gt;no &lt;code&gt;docker-proxy&lt;/code&gt; is listening&lt;/strong&gt;, the iptables &lt;code&gt;nat/DOCKER&lt;/code&gt; chain has &lt;strong&gt;no DNAT rule&lt;/strong&gt;, and &lt;code&gt;NetworkSettings.Networks&lt;/code&gt; and &lt;code&gt;Ports&lt;/code&gt; are both &lt;strong&gt;empty &lt;code&gt;{}&lt;/code&gt;&lt;/strong&gt;. This &amp;ldquo;container alive, port dead&amp;rdquo; state is what happens when libnetwork silently rolls back the endpoint creation because the target interface wasn&amp;rsquo;t up at attach time — and Docker doesn&amp;rsquo;t bother to tell you that the port publish never actually happened. &lt;strong&gt;The fix is a single 30-second command&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>From 5m14s to 0.6s: How I Rebuilt My Docker Hub Mirror After Hitting Three Walls</title>
      <link>https://blog.margrop.net/en/post/docker-registry-mirror-rebuild-2026/</link>
      <pubDate>Sat, 13 Jun 2026 07:20:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-registry-mirror-rebuild-2026/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;My home lab had a &lt;code&gt;registry:2&lt;/code&gt; pull-through cache fronting Docker Hub for years, and it was fine. Then one day pulling a 5 MB &lt;code&gt;alpine:3.19&lt;/code&gt; took 5 minutes and 14 seconds. This post is the full forensic log of how I traced the slowdown, evaluated 8 candidate mirrors with real measurements (not vibes), and finished with a 5-line bash script on cron that &lt;strong&gt;auto-fails-over&lt;/strong&gt; when the primary mirror goes down. Every number in this article was captured on my own hardware, in my own network, at one specific moment in time.&lt;/p&gt;&#xA;&lt;p&gt;If you also self-host a Docker Hub mirror, or your team runs an internal registry, the Q&amp;amp;A at the bottom will probably save you 3 hours of pain.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Stop Using Old Methods! Deploying the Latest Docker CE on Ubuntu 26.04 LTS with Ultra-fast Mirror Setup</title>
      <link>https://blog.margrop.net/en/post/ubuntu-2604-docker-install-guide/</link>
      <pubDate>Tue, 26 May 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/ubuntu-2604-docker-install-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Foreword&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;With the official release of Ubuntu 26.04 LTS (Resolute Raccoon), developers and system administrators worldwide are upgrading their development, testing, and production environments to this long-term support version. However, setting up Docker—the cornerstone of modern containerization and microservices architecture—on a brand-new LTS release can sometimes present unexpected friction.&lt;/p&gt;&#xA;&lt;p&gt;If you are still relying on legacy commands like &lt;code&gt;apt-get install docker.io&lt;/code&gt;, or copy-pasting outdated tutorials meant for Ubuntu 20.04 or 22.04, you are likely to run into issues. These issues range from outdated software packages to APT repository format mismatches (especially with the widespread adoption of the new DEB822 format), or network timeouts when pulling images from container registries in restricted environments.&lt;/p&gt;&#xA;&lt;p&gt;This article provides a comprehensive, step-by-step, and highly detailed guide to installing Docker Community Edition (Docker CE) on Ubuntu 26.04 LTS. We will delve into modern DEB822 repository configurations, non-root system privilege separation, systemd service tweaks, and advanced network acceleration (both HTTP/HTTPS proxies and private registry mirrors).&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>New Chrome Could Not Log In to Bitwarden, but Old Machines Still Worked: A Vaultwarden Compatibility Trap</title>
      <link>https://blog.margrop.net/en/post/chrome-bitwarden-vaultwarden-login-failure-prelogin/</link>
      <pubDate>Mon, 18 May 2026 10:05:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/chrome-bitwarden-vaultwarden-login-failure-prelogin/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The failure looked like a Chrome or Bitwarden extension problem: newly installed computers could not log in to a self-hosted Vaultwarden instance, while existing computers continued to work with the same Bitwarden &lt;code&gt;2026.4.1&lt;/code&gt; browser extension. The actual root cause was server-side compatibility: the clients were using a newer prelogin endpoint, while the Vaultwarden server was still running &lt;code&gt;vaultwarden/server:1.35.4-alpine&lt;/code&gt;, which did not provide &lt;code&gt;/identity/accounts/prelogin/password&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Existing machines were likely protected by an already established login state and local cache. They did not prove that the full first-login API path was still compatible. The correct fix was to back up the Vaultwarden data, upgrade the server image to &lt;code&gt;1.36.0&lt;/code&gt; or newer, and confirm from logs that the prelogin endpoint no longer returned 404.&lt;/p&gt;&#xA;&lt;p&gt;All domains, paths, usernames, and deployment details in this article are sanitized. Examples use placeholders such as &lt;code&gt;vault.example.com&lt;/code&gt; and &lt;code&gt;/opt/vaultwarden&lt;/code&gt;; no internal network or private information is included.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>When Docker Networks Collide with the Home LAN: Moving Auto-Allocated Subnets Back to 172</title>
      <link>https://blog.margrop.net/en/post/docker-network-subnet-conflict-migration-record/</link>
      <pubDate>Mon, 13 Apr 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-network-subnet-conflict-migration-record/</guid>
      <description>&lt;p&gt;This post records a very practical Docker networking failure: the number of containers kept growing, Docker&amp;rsquo;s auto-assigned user-defined bridge networks eventually started landing in &lt;code&gt;192.168.x.x&lt;/code&gt;, and those networks began colliding with the real home LAN. The symptoms were not dramatic at first. Nothing looked “broken” in the usual sense. Containers were still running, the host was still alive, and the dashboard still looked normal. But parts of the home network became unreliable, and once I dug into it on my NAS, the root cause turned out to be the Docker network allocation strategy rather than any single bad container.&lt;/p&gt;&#xA;&lt;p&gt;The fix was straightforward in principle, but important in practice: I moved Docker&amp;rsquo;s automatic network pool to &lt;code&gt;172.16.0.0/12&lt;/code&gt;, migrated the existing &lt;code&gt;192.168.*&lt;/code&gt; networks onto the 172 private range, and made sure future networks created through Portainer, Dockhand, or plain &lt;code&gt;docker compose&lt;/code&gt; would follow the same rule.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Cloudflare Workers to Solve Docker Image Pull Issues</title>
      <link>https://blog.margrop.net/en/post/cloudflare-workers-slove-docker-mirrors-blocked/</link>
      <pubDate>Mon, 10 Jun 2024 14:16:26 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/cloudflare-workers-slove-docker-mirrors-blocked/</guid>
      <description>&lt;p&gt;Due to certain reasons, Docker images cannot be pulled normally in China. The method I wrote last year for accelerating image pulls is also no longer functional. Where there&amp;rsquo;s a will, there&amp;rsquo;s a way (not really). So I&amp;rsquo;ve written a new tutorial to solve the Docker image pull issue using Cloudflare Workers.&lt;/p&gt;&#xA;&lt;p&gt;This article uses Cloudflare Workers to solve the problem of being unable to pull images. I won&amp;rsquo;t go into too much detail about Cloudflare here, and Cloudflare Workers is also a free service. If you&amp;rsquo;re not familiar with it, you can check out previous articles like &amp;ldquo;&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;&amp;rdquo;. &lt;strong&gt;If you don&amp;rsquo;t want to follow this guide, you can reply with &amp;ldquo;jsdc&amp;rdquo; in the background to get the public service address I&amp;rsquo;ve set up.&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Transfer] How to set up xiaoya’s docker and tvbox configuration</title>
      <link>https://blog.margrop.net/en/post/deploy-xiaoya-docker-and-tvbox/</link>
      <pubDate>Tue, 30 Apr 2024 21:18:55 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/deploy-xiaoya-docker-and-tvbox/</guid>
      <description>Article source: https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f&#xA;How to set up xiaoya&amp;rsquo;s docker To get the latest information about Xiaoya, please follow Xiaoya’s tg channel https://t.me/xiaoyaliu&#xA;If you have any difficulties in using it, you can come here to find me or others for help https://t.me/PlutoPlayer&#xA;Table of contents&#xA;What do you need to install xiaoya&amp;rsquo;s docker The soft routing box is similar to n1, etc., with openwrt environment (can be configured with one click on the terminal) NAS and other devices have docker plug-ins (it is impossible or difficult to log in to the terminal and requires graphical self-configuration) Cloud servers are also commonly known as vps (can be configured with one click on the terminal) How to install Install under openwrt or vps, call up the terminal command line The left side of the openwrt control panel (find &amp;ldquo;TTY Terminal&amp;rdquo; under &amp;ldquo;System&amp;rdquo; or &amp;ldquo;Services&amp;rdquo;)</description>
    </item>
    <item>
      <title>How to Connect to the Host Machine&#39;s MySQL Server from Inside a Docker Container</title>
      <link>https://blog.margrop.net/en/post/docker-connect-mysql-in-host-machine/</link>
      <pubDate>Thu, 30 Sep 2021 13:08:50 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/docker-connect-mysql-in-host-machine/</guid>
      <description>&lt;p&gt;The blogger recently encountered a situation where they copied a database from a server onto the host machine&amp;rsquo;s MySQL server, wanting to use the local database to test the correctness of their code. However, the project programs are all deployed with a single click via Docker, so it&amp;rsquo;s necessary to access the local database from within the Docker container. During the exploration, they encountered problems and found solutions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enable Automatic Startup for Docker Services and Containers After Reboot</title>
      <link>https://blog.margrop.net/en/post/reboot-docker-server-auto-start/</link>
      <pubDate>Tue, 06 Apr 2021 14:39:32 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/reboot-docker-server-auto-start/</guid>
      <description>&lt;p&gt;After rebooting the operating system, I found that the Docker service did not start and the containers did not start either. How do you make them start automatically after reboot?&lt;/p&gt;&#xA;&lt;h1 id=&#34;solve-two-problems&#34;&gt;Solve Two Problems&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Enable automatic restart for the Docker service&lt;/li&gt;&#xA;&lt;/ol&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>Deploy Your Own Bitwarden Password Management Server</title>
      <link>https://blog.margrop.net/en/post/deploy-open-source-password-manager-bitwarden/</link>
      <pubDate>Wed, 17 Feb 2021 20:20:06 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/deploy-open-source-password-manager-bitwarden/</guid>
      <description>&lt;p&gt;Many people are not comfortable storing their passwords online with services like LastPass. Even though the official claim is that passwords are encrypted and the server cannot see user passwords, some still feel uneasy. In that case, you can deploy the open-source Bitwarden to set up your own password management server.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Prerequisites: A VPS server and a domain name with the IP address already resolved to the server.&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>How to Build an Open Source Web Flowchart Tool Diagrams.net (formerly draw.io)</title>
      <link>https://blog.margrop.net/en/post/how-to-install-docker-drawio/</link>
      <pubDate>Sat, 30 Jan 2021 17:59:08 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/how-to-install-docker-drawio/</guid>
      <description>&lt;p&gt;&lt;code&gt;ProcessOn&lt;/code&gt; are now well-known web &lt;code&gt;流程图&lt;/code&gt;, &lt;code&gt;UML&lt;/code&gt; drawing tools. However, &lt;code&gt;ProcessOn&lt;/code&gt; is a paid service with too many free-tier restrictions. So, is there a free option available?&lt;/p&gt;&#xA;&lt;p&gt;Yes, it&amp;rsquo;s &lt;code&gt;Diagrams.net&lt;/code&gt;. &lt;strong&gt;Completely free with powerful features~&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Docker on CentOS 7 and Configuring Aliyun Mirror Source</title>
      <link>https://blog.margrop.net/en/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/en/post/centos-7-install-docker-ce-and-update-source/</guid>
      <description>&lt;h1 id=&#34;docker-version&#34;&gt;Docker Version&lt;/h1&gt;&#xA;&lt;p&gt;Since Docker version 1.13, Docker has adopted a timeline-based versioning approach, dividing releases into Community Edition (CE) and Enterprise Edition (EE). Docker CE is the free community edition, while Docker EE is the paid enterprise version.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python3 web environment, including third-party and self-built</title>
      <link>https://blog.margrop.net/en/post/python3-web-runtime-environment/</link>
      <pubDate>Sun, 24 Jan 2021 13:07:30 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/python3-web-runtime-environment/</guid>
      <description>I needed to use the Python3 Web environment because of some family matters, so I collected them. The environment of the third-party website is very simple to use, but the shortcomings are also obvious. The last Python code cannot be saved.&#xA;Python3 environment provided by third-party websites So I built an environment myself, and after struggling for a long time, I finally used Docker to build it, and it was done in just a few lines of code.</description>
    </item>
    <item>
      <title>【Transfer】The latest method of half-washing Synology</title>
      <link>https://blog.margrop.net/en/post/synology-half-crack-way-docker-ddsm/</link>
      <pubDate>Tue, 19 Jan 2021 18:10:53 +0800</pubDate>
      <guid>https://blog.margrop.net/en/post/synology-half-crack-way-docker-ddsm/</guid>
      <description>I recently built a new NAS. After installing it, I found that the semi-whitewashing solution provided before no longer worked. Previous Posthttp://blog.lixx.vip/黑群晖（synology）nas-6-22-折腾记-半洗白/ Mainly because Synology’s new version of Docker 18.09.0-0506 has closed the installation of DDSM&#xA;Download old version of Docker *Old version of Docker download address (Docker-x64-17.05.0-0401.spk):&#xA;DDSM’s PAT download address (DSM_VirtualDSM_15284.pat): It can also be downloaded at 我的网盘&#xA;You need to uninstall the newly installed Docker in the package center, and then install the downloaded old version</description>
    </item>
  </channel>
</rss>
