<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Docker &#x2F; Podman 容器运行一段时间后丢失网络的问题]]></title><description><![CDATA[<h2><a class="anchor-offset" name="docker-podman-容器运行一段时间后丢失网络的问题"></a>Docker / Podman 容器运行一段时间后丢失网络的问题</h2>
<blockquote>
<p dir="auto">本文大部分资料来自于 Podman Blog 和 GitHub issues</p>
</blockquote>
<p dir="auto">Podman 的一个长期存在的问题是，根容器可能会在一段时间后失去网络连接。对于许多用户来说，并不清楚是什么导致了这些问题。</p>
<p dir="auto">Netavark 配置 NAT 和端口转发防火墙规则。当另一个进程删除我们的防火墙规则时，容器将失去连接。其中一个进程是 firewalld，当执行 <code>firewall-cmd --reload</code> 时，它将删除所有防火墙规则，然后只添加 firewalld 已知的规则，从而使 Podman 容器失去连接。有趣的是，这个命令甚至不需要用户执行。一些应用程序在更新时运行此命令，例如，<code>dnf</code> 更新就可能导致 firewalld 重新加载，使用户更难知道发生了什么。</p>
<blockquote>
<p dir="auto">注意：从 firewalld 2.0 开始，它可能不再刷新所有规则，而只刷新 firewalld 特定的规则。</p>
</blockquote>
<p dir="auto">恢复规则的一个解决方案是简单地重新启动容器，因为所有必要的规则都将在容器启动时添加。然而，这是不期望的，因为一些容器应用可能需要很长时间来停止和/或启动。为了解决这个问题，Podman 很久以前就添加了 <code>podman network reload</code> 命令。此命令将删除网络配置，然后再添加回去。它最近运行得很好，但仍然有一个大问题：在规则丢失后，需要显式执行命令，因此，它不会帮助那些不知道规则何时丢失的用户。</p>
<p dir="auto">在 Netavark v1.9.0 中，添加了一个名为 <code>netavark-firewalld-reload.service</code> 的新 systemd 服务，它应该可以一劳永逸地解决这个问题。这个服务运行一个小的 netavark 命令，它在 dbus 上监听 `firewalld reload` 事件。每次重新加载 firewalld 并刷新 netavark 防火墙规则时都会发出此事件。如果收到事件，服务将添加回所有 netavark 防火墙规则。</p>
<p dir="auto">新的 systemd 服务被设计成只有在 firewalld 本身也在运行时才运行，除非需要，否则不会消耗资源。下面显示了如何启用该服务的示例。</p>
<p dir="auto">首先，启用服务，请注意，启用并不一定意味着在 boot 时启动。对于这个单元， Netavark 添加了一个 wants to firewalld，这意味着只有当 firewalld 启动时服务才会启动。这确保了在未使用或禁用 firewalld 的系统上，它不会不必要地运行。当 firewalld 停止时，服务也将停止。</p>
<pre><code>$ sudo systemctl enable --now netavark-firewalld-reload.service
Created symlink /etc/systemd/system/firewalld.service.wants/netavark-firewalld-reload.service → /usr/lib/systemd/system/netavark-firewalld-reload.service.
</code></pre>
<p dir="auto">现在重新启动 firewalld，服务也会启动。</p>
<pre><code>$ sudo systemctl restart firewalld.service
$ sudo systemctl status netavark-firewalld-reload.service 
● netavark-firewalld-reload.service - Listen for the firewalld reload event and reapply all netavark firewall rules.
     Loaded: loaded (/usr/lib/systemd/system/netavark-firewalld-reload.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Mon 2025-06-30 18:00:00 CET; 20s ago
   Main PID: 72000 (netavark)
      Tasks: 3 (limit: 38149)
     Memory: 15.0M
        CPU: 8ms
     CGroup: /system.slice/netavark-firewalld-reload.service
             └─72000 /usr/libexec/podman/netavark firewalld-reload

Jun 30 18:00:00 pholzing-fedora systemd[1]: Started netavark-firewalld-reload.service - Listen for the firewalld reload event and reapply all netavark firewall rules..
</code></pre>
<p dir="auto">这是一个 Netavark 特定的功能，如果仍然在使用旧的 CNI 后端，它将无法工作。</p>
<h2><a class="anchor-offset" name="docker-podman-容器运行一段时间后丢失网络的问题"></a>Docker / Podman 容器运行一段时间后丢失网络的问题</h2>
<blockquote>
<p dir="auto">本文大部分资料来自于 Podman Blog 和 GitHub issues</p>
</blockquote>
<p dir="auto">Podman 的一个长期存在的问题是，根容器可能会在一段时间后失去网络连接。对于许多用户来说，并不清楚是什么导致了这些问题。</p>
<p dir="auto">Netavark 配置 NAT 和端口转发防火墙规则。当另一个进程删除我们的防火墙规则时，容器将失去连接。其中一个进程是 firewalld，当执行 <code>firewall-cmd --reload</code> 时，它将删除所有防火墙规则，然后只添加 firewalld 已知的规则，从而使 Podman 容器失去连接。有趣的是，这个命令甚至不需要用户执行。一些应用程序在更新时运行此命令，例如，<code>dnf</code> 更新就可能导致 firewalld 重新加载，使用户更难知道发生了什么。</p>
<blockquote>
<p dir="auto">注意：从 firewalld 2.0 开始，它可能不再刷新所有规则，而只刷新 firewalld 特定的规则。</p>
</blockquote>
<p dir="auto">恢复规则的一个解决方案是简单地重新启动容器，因为所有必要的规则都将在容器启动时添加。然而，这是不期望的，因为一些容器应用可能需要很长时间来停止和/或启动。为了解决这个问题，Podman 很久以前就添加了 <code>podman network reload</code> 命令。此命令将删除网络配置，然后再添加回去。它最近运行得很好，但仍然有一个大问题：在规则丢失后，需要显式执行命令，因此，它不会帮助那些不知道规则何时丢失的用户。</p>
<p dir="auto">在 Netavark v1.9.0 中，添加了一个名为 <code>netavark-firewalld-reload.service</code> 的新 systemd 服务，它应该可以一劳永逸地解决这个问题。这个服务运行一个小的 netavark 命令，它在 dbus 上监听 `firewalld reload` 事件。每次重新加载 firewalld 并刷新 netavark 防火墙规则时都会发出此事件。如果收到事件，服务将添加回所有 netavark 防火墙规则。</p>
<p dir="auto">新的 systemd 服务被设计成只有在 firewalld 本身也在运行时才运行，除非需要，否则不会消耗资源。下面显示了如何启用该服务的示例。</p>
<p dir="auto">首先，启用服务，请注意，启用并不一定意味着在 boot 时启动。对于这个单元， Netavark 添加了一个 wants to firewalld，这意味着只有当 firewalld 启动时服务才会启动。这确保了在未使用或禁用 firewalld 的系统上，它不会不必要地运行。当 firewalld 停止时，服务也将停止。</p>
<pre><code>$ sudo systemctl enable --now netavark-firewalld-reload.service
Created symlink /etc/systemd/system/firewalld.service.wants/netavark-firewalld-reload.service → /usr/lib/systemd/system/netavark-firewalld-reload.service.
</code></pre>
<p dir="auto">现在重新启动 firewalld，服务也会启动。</p>
<pre><code>$ sudo systemctl restart firewalld.service
$ sudo systemctl status netavark-firewalld-reload.service 
● netavark-firewalld-reload.service - Listen for the firewalld reload event and reapply all netavark firewall rules.
     Loaded: loaded (/usr/lib/systemd/system/netavark-firewalld-reload.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Mon 2025-06-30 18:00:00 CET; 20s ago
   Main PID: 72000 (netavark)
      Tasks: 3 (limit: 38149)
     Memory: 15.0M
        CPU: 8ms
     CGroup: /system.slice/netavark-firewalld-reload.service
             └─72000 /usr/libexec/podman/netavark firewalld-reload

Jun 30 18:00:00 pholzing-fedora systemd[1]: Started netavark-firewalld-reload.service - Listen for the firewalld reload event and reapply all netavark firewall rules..
</code></pre>
<p dir="auto">这是一个 Netavark 特定的功能，如果仍然在使用旧的 CNI 后端，它将无法工作。</p>
]]></description><link>https://bbs.leaguetech.net/topic/33/docker-podman-容器运行一段时间后丢失网络的问题</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 23:03:17 GMT</lastBuildDate><atom:link href="https://bbs.leaguetech.net/topic/33.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Jun 2026 17:20:58 GMT</pubDate><ttl>60</ttl></channel></rss>