AMH 面板环境:Podman 容器 systemd 管理、自动更新与 Docker Hub 加速配置

Jinpeng
Jinpeng
Jinpeng
管理员
41
文章
0
粉丝
Linux 运维 容器技术评论6阅读模式

在 AMH 面板环境中,Podman 可能不是完全由 Debian 官方软件包提供,而是由 AMH/ampod 安装在 /usr/local/ampod-1.0/ 下。因此,配置容器开机启动、systemd 管理、镜像自动更新和 Docker Hub 加速时,需要特别注意 Podman、conmon 与 OCI runtime 的实际路径。

本文以 Debian 和 AMH 的 ampod 环境为例,并使用 frps 容器演示完整配置流程。

一、环境与目标

本文示例环境:

系统:Debian
面板:AMH
Podman:AMH/ampod 提供
Podman 目录:/usr/local/ampod-1.0/podman/bin/
conmon/runc 目录:/usr/local/ampod-1.0/conmon/bin/
Docker Hub 加速地址:https://registry.ixnic.net
示例容器:frps

最终实现:

  1. 使用 Podman 创建容器;
  2. 容器由 systemd 管理并随系统启动;
  3. 通过 podman auto-update 自动检查和更新镜像;
  4. Docker Hub 镜像通过 registry.ixnic.net 加速拉取;
  5. 自动更新失败时可通过 journalctl 排查。

二、确认 Podman、conmon 和 runc 路径

首先查看当前终端实际调用的 Podman:

command -v podman
readlink -f "$(command -v podman)"
podman --version

AMH/ampod 环境通常还存在以下文件:

ls -l /usr/local/ampod-1.0/podman/bin/
ls -l /usr/local/ampod-1.0/conmon/bin/

常见结果:

/usr/local/ampod-1.0/podman/bin/podman
/usr/local/ampod-1.0/conmon/bin/conmon
/usr/local/ampod-1.0/conmon/bin/runc

测试 conmon 和 runc:

/usr/local/ampod-1.0/conmon/bin/conmon --version
/usr/local/ampod-1.0/conmon/bin/runc --version

检查动态链接库是否缺失:

ldd /usr/local/ampod-1.0/conmon/bin/conmon | grep 'not found'
ldd /usr/local/ampod-1.0/conmon/bin/runc | grep 'not found'

没有输出通常表示未发现缺失的动态库。

解决 Podman 找不到 conmon 的问题

如果出现:

Error: could not find a working conmon binary

创建或修改 /etc/containers/containers.conf

mkdir -p /etc/containers

cat >/etc/containers/containers.conf <<'EOF'
[engine]
conmon_path = [
  "/usr/local/ampod-1.0/conmon/bin/conmon",
  "/usr/bin/conmon",
  "/usr/sbin/conmon"
]
runtime = "/usr/local/ampod-1.0/conmon/bin/runc"
EOF

如果该文件已经有其他有效配置,应将以上 [engine] 参数合并进去,不要盲目覆盖原配置。

验证:

podman info --debug | grep -Ei 'conmon|runtime'

正常结果应包含:

conmon:
  path: /usr/local/ampod-1.0/conmon/bin/conmon
ociRuntime:
  path: /usr/local/ampod-1.0/conmon/bin/runc

三、补全镜像签名策略 policy.json

如果 Podman 拉取镜像时出现:

Error: open /etc/containers/policy.json: no such file or directory

可以创建镜像签名策略文件。

下面的配置默认拒绝其他来源,只允许 Docker Hub 和自建加速地址中的镜像不经过签名验证:

mkdir -p /etc/containers

cat >/etc/containers/policy.json <<'EOF'
{
  "default": [
    {
      "type": "reject"
    }
  ],
  "transports": {
    "docker": {
      "docker.io": [
        {
          "type": "insecureAcceptAnything"
        }
      ],
      "registry.ixnic.net": [
        {
          "type": "insecureAcceptAnything"
        }
      ]
    }
  }
}
EOF

chmod 644 /etc/containers/policy.json

验证 JSON 格式:

python3 -m json.tool /etc/containers/policy.json

insecureAcceptAnything 表示不验证镜像的加密签名,不代表关闭 HTTPS。镜像传输仍可使用 TLS。


四、配置 Docker Hub 镜像加速

创建 Podman Registry 配置目录:

mkdir -p /etc/containers/registries.conf.d

创建 Docker Hub 加速配置:

cat >/etc/containers/registries.conf.d/10-docker-mirror.conf <<'EOF'
[[registry]]
prefix = "docker.io"
location = "docker.io"
insecure = false
blocked = false

[[registry.mirror]]
location = "registry.ixnic.net"
insecure = false
EOF

该配置表示:容器镜像仍使用标准名称,例如:

docker.io/xlousp/frps:latest

Podman 拉取时优先请求:

https://registry.ixnic.net

无需将容器的镜像名称改成 registry.ixnic.net/xlousp/frps:latest

检查重复或冲突配置

grep -RnsE 'docker\.io|registry\.ixnic\.net' \
  /etc/containers/registries.conf \
  /etc/containers/registries.conf.d 2>/dev/null

如果多个文件重复定义 docker.io,应合并或禁用旧配置,避免优先级和覆盖关系混乱。

测试加速服务

curl -I https://registry.ixnic.net/v2/

该 Registry 使用 v3,访问 /v2/ 返回 200 OK 属于正常行为。

使用 Podman 调试日志测试:

podman --log-level=debug pull docker.io/library/alpine:latest \
  2>&1 | tee /tmp/podman-pull-debug.log

确认日志包含加速域名:

grep -i 'registry.ixnic.net' /tmp/podman-pull-debug.log

Podman 没有常驻守护进程,修改 Registry 配置后通常不需要重启 Podman 服务。


五、创建带自动更新标签的容器

以 frps 为例,宿主机配置文件位于:

/home/usrdata/frps/frps.toml

确认文件存在:

ls -l /home/usrdata/frps/frps.toml

创建容器:

podman run -d \
  --name frps \
  --network host \
  --label io.containers.autoupdate=registry \
  -v /home/usrdata/frps/frps.toml:/etc/frp/frps.toml:ro \
  docker.io/xlousp/frps:latest

验证容器:

podman ps
podman logs --tail 100 frps

验证自动更新标签:

podman inspect frps \
  --format '{{index .Config.Labels "io.containers.autoupdate"}}'

预期输出:

registry

部分 Podman 版本不支持通过以下命令给已有容器追加标签:

podman container update --label ...

如果提示 unknown flag: --label,必须保留原端口、挂载、环境变量和权限参数,重新创建容器并在 podman run 阶段添加标签。


六、使用 systemd 管理容器

Podman 自动更新不仅需要标签,还需要 systemd 能够重新启动或重新创建对应容器。因此,应先为容器生成 systemd 单元。

1. 保存容器配置

podman inspect frps > /root/frps-inspect.json

确认挂载和镜像:

podman inspect frps --format '镜像={{.Config.Image}}'

podman inspect frps \
  --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}'

2. 生成服务文件

cd /root
podman generate systemd --name frps --new --files

正常会生成:

/root/container-frps.service

查看生成文件使用的是哪一个 Podman:

grep -E '^Exec(Start|Stop|StopPost)=' /root/container-frps.service

如果系统中同时存在 /usr/bin/podman 和 ampod Podman,应确保服务所调用的版本能够正确读取 /etc/containers/containers.conf,并识别前面配置的 conmon 和 runc。

3. 安装 systemd 单元

install -m 644 \
  /root/container-frps.service \
  /etc/systemd/system/container-frps.service

由于使用了 --new,systemd 启动时会按照单元文件重新创建容器。因此先停止并删除当前手工创建的同名容器:

podman stop frps
podman rm frps

这里不会删除宿主机文件 /home/usrdata/frps/frps.toml

重新加载并启动:

systemctl daemon-reload
systemctl enable --now container-frps.service

检查:

systemctl status container-frps.service --no-pager -l
podman ps
podman logs --tail 100 frps

再次确认自动更新标签:

podman inspect frps \
  --format '{{index .Config.Labels "io.containers.autoupdate"}}'

确认容器与 systemd 单元关联:

podman inspect frps \
  --format '{{index .Config.Labels "PODMAN_SYSTEMD_UNIT"}}'

正常应返回:

container-frps.service

七、补全 Podman 自动更新 service 和 timer

有些 AMH/ampod 安装不会自带:

podman-auto-update.service
podman-auto-update.timer

可以手动创建。

1. 确认自动更新使用的 Podman 路径

command -v podman

本文按 AMH/ampod 的路径示范:

/usr/local/ampod-1.0/podman/bin/podman

如果你的实际路径不同,必须替换下面 ExecStart=ExecStartPost= 中的路径。

2. 创建自动更新服务

cat >/etc/systemd/system/podman-auto-update.service <<'EOF'
[Unit]
Description=Podman automatic update service
Documentation=man:podman-auto-update(1)
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/ampod-1.0/podman/bin/podman auto-update

[Install]
WantedBy=multi-user.target
EOF

如果确认需要在更新后清理无用旧镜像,可在 [Service] 中增加:

ExecStartPost=/usr/local/ampod-1.0/podman/bin/podman image prune -f

为了便于回滚,建议首次配置时先不要自动清理旧镜像。

3. 创建自动更新定时器

下面设置每天凌晨 03:30 检查更新,并随机延迟最多 10 分钟:

cat >/etc/systemd/system/podman-auto-update.timer <<'EOF'
[Unit]
Description=Daily Podman automatic update
Documentation=man:podman-auto-update(1)

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
RandomizedDelaySec=10m
Unit=podman-auto-update.service

[Install]
WantedBy=timers.target
EOF

参数说明:

  1. OnCalendar:计划执行时间;
  2. Persistent=true:关机期间错过任务时,开机后补执行;
  3. RandomizedDelaySec=10m:随机延迟,避免多台设备同一时刻请求仓库。

4. 启用定时器

systemctl daemon-reload
systemctl enable --now podman-auto-update.timer

查看下一次运行时间:

systemctl status podman-auto-update.timer --no-pager
systemctl list-timers --all | grep podman-auto-update

八、测试自动更新

先执行模拟检查,不实际更新:

podman auto-update --dry-run

正常情况下应识别到:

container-frps.service
frps
docker.io/xlousp/frps:latest
registry

手动触发 systemd 自动更新服务:

systemctl start podman-auto-update.service

查看结果:

systemctl status podman-auto-update.service --no-pager -l
journalctl -u podman-auto-update.service -n 100 --no-pager -o cat

确认更新后容器仍在运行:

systemctl status container-frps.service --no-pager -l
podman ps
podman logs --tail 100 frps

九、常见故障排查

1. 找不到 conmon

错误:

could not find a working conmon binary

检查:

podman info --debug | grep -Ei 'conmon|runtime'

AMH 环境应识别:

/usr/local/ampod-1.0/conmon/bin/conmon
/usr/local/ampod-1.0/conmon/bin/runc

2. 缺少 policy.json

错误:

open /etc/containers/policy.json: no such file or directory

按照本文第三节创建 /etc/containers/policy.json

3. 修改标签提示 unknown flag

错误:

Error: unknown flag: --label

旧版本 Podman 不能给现有容器动态添加标签。保存挂载、端口、环境变量及权限参数后,删除并重新创建容器。

4. 自动更新找不到容器

依次检查:

podman inspect frps \
  --format '{{index .Config.Labels "io.containers.autoupdate"}}'

podman inspect frps \
  --format '{{index .Config.Labels "PODMAN_SYSTEMD_UNIT"}}'

podman auto-update --dry-run

容器既要有 io.containers.autoupdate=registry,也应由有效的 systemd 单元管理。

5. systemd 启动失败

查看完整日志:

journalctl -u container-frps.service -n 200 --no-pager -o cat

同时检查:

systemctl cat container-frps.service
podman ps -a
podman logs --tail 100 frps

6. 检查是否混用两套 Podman

/usr/bin/podman --version 2>/dev/null
/usr/local/ampod-1.0/podman/bin/podman --version 2>/dev/null
systemctl cat container-frps.service | grep -E 'Exec(Start|Stop)='
systemctl cat podman-auto-update.service | grep '^ExecStart='

容器服务、自动更新服务和日常管理命令应尽量使用同一套 Podman,避免不同版本读取不同配置或使用不兼容的 conmon/runtime。


十、最终检查清单

执行以下命令进行最终验收:

# Podman 运行环境
podman info --debug | grep -Ei 'conmon|runtime'

# 容器服务
systemctl is-enabled container-frps.service
systemctl is-active container-frps.service

# 自动更新定时器
systemctl is-enabled podman-auto-update.timer
systemctl is-active podman-auto-update.timer
systemctl list-timers --all | grep podman-auto-update

# 容器状态与标签
podman ps
podman inspect frps \
  --format '自动更新={{index .Config.Labels "io.containers.autoupdate"}} systemd={{index .Config.Labels "PODMAN_SYSTEMD_UNIT"}}'

# 自动更新模拟检查
podman auto-update --dry-run

预期结果:

container-frps.service:enabled、active
podman-auto-update.timer:enabled、active
自动更新标签:registry
systemd 单元:container-frps.service

总结

AMH 面板环境中的 Podman 配置重点不在容器命令本身,而在于保持整套运行组件一致:

  1. 使用 /etc/containers/containers.conf 指定 ampod 自带的 conmon 和 runc;
  2. 使用 /etc/containers/policy.json 补全镜像策略;
  3. 使用 registries.conf.d 将 Docker Hub 请求转发至 registry.ixnic.net
  4. 创建容器时添加 io.containers.autoupdate=registry
  5. 使用 systemd 单元管理容器;
  6. 使用 podman-auto-update.timer 定期检查并更新镜像;
  7. 容器服务和自动更新服务必须尽量调用同一套 Podman。

完成以上配置后,AMH/ampod 环境中的容器即可实现开机启动、异常恢复、Docker Hub 加速以及无人值守自动更新。

 

文章末尾固定信息

weinxin
我的微信
微信号已复制
我的微信
微信扫一扫
 
Jinpeng
  • 本文由 Jinpeng 发表于2026年9月3日 22:40:24
  • 转载请务必保留本文链接:https://www.ixmu.net/217.html

发表评论