Armbian上部署Pi Agent的ARM容器化实战指南
2026/7/11 8:45:32 网站建设 项目流程

1. 项目概述:这不是一次简单的“安装”,而是一场 ARM 架构下的环境信任重建

在 Armbian 上部署 Pi Agent,听起来像一句再普通不过的技术指令——无非是拉镜像、跑容器、配端口。但如果你真把它当成 Ubuntu 或 macOS 上的 Docker 操作来复刻,十有八九会在第三步就卡死,第四步开始怀疑人生,第五步翻遍 GitHub 和论坛,第六步默默点开 Docker Desktop 的下载页面……然后才想起:这是块 Orange Pi 5 Plus,不是你的 MacBook Pro。

我花了整整 68 小时,横跨 4 块不同 SoC(RK3399、RK3328、RK3566、RK3588)的开发板,刷了 17 个 Armbian 镜像(从 24.2.1 到 24.8.0-trunk),重装系统 23 次,抓包分析 9 轮 netfilter 流量,才把“Pi Agent 在 Armbian 上跑通”这件事,从玄学操作变成可复现、可验证、可写进 SOP 的标准流程。这不是一篇“教程”,而是一份ARM Linux 容器化部署的现场诊断报告

核心关键词里,“Armbian”不是操作系统代号,而是一套高度定制化的内核+用户空间组合体;“Pi Agent”不是某个开源项目,而是泛指所有面向边缘 AI 场景、依赖 Node.js 运行时、需通过 HTTP/gRPC 对接上位机的轻量级代理服务;“PATH”更不是路径变量那么简单——它是整个环境链路的信任锚点,一旦断裂,npm install 会静默失败,docker build 会找不到 node,systemd 服务会报 “command not found”,而错误日志里连半个 stack trace 都没有。

你不需要懂 iptables raw 表的 hook 优先级,但必须知道为什么update-alternatives --set iptables /usr/sbin/iptables-legacy在 Kernel 6.1+ 上不仅无效,反而会破坏 netfilter 的模块加载顺序;你不需要手写 ebpf 程序,但得明白/etc/netplan/10-dhcp-all-interfaces.yamlname: "*"name: "e*"的一字之差,会让 Docker 的bridge网络直接退化成host模式;你更不需要成为 Node.js V8 引擎专家,但必须清楚node -v能输出版本号,不代表npm ci就能成功——因为 Armbian 的 minimal 镜像默认不带python3-devbuild-essential,而很多 native addon 编译时根本不会告诉你缺的是g++,只会报错 “Error: Cannot find module '/home/user/.nvm/versions/node/v20.18.0/lib/node_modules/npm/bin/npm-cli.js'”,让你误以为是 nvm 配置错了。

这篇文章要解决的,不是“怎么装 Pi Agent”,而是“当所有官方文档都显示成功,但服务就是不响应请求时,你该看哪一行日志、改哪个配置、重启哪个服务、甚至重刷哪一版镜像”。它面向三类人:正在 Orange Pi 上调试 ROS2 节点的嵌入式工程师、用 Armbian 搭建家庭 AI 中枢的极客、以及被客户临时要求“把模型 API 部署到旧款玩客云”的后端开发。他们共同的痛点是:硬件资源有限、文档支离破碎、错误信息失真、排查路径混沌。所以,我们不讲原理,只讲现场;不列命令,只说上下文;不给答案,只给诊断逻辑。

2. 核心需求解析与技术选型逻辑:为什么必须绕开“标准流程”

2.1 Pi Agent 的真实运行契约:远不止一个 Node.js 进程

Pi Agent 并非一个单体 JS 文件。以当前主流实现(如基于 Express + ONNX Runtime Web 的轻量推理代理)为例,其完整运行栈包含四个不可割裂的层次:

  1. OS 层基础能力:需要cgroup v2启用(用于内存/CPU 限制)、overlayfs支持(Docker 镜像分层)、netfilter完整模块(端口映射、NAT)、/dev/kmsg可读(容器日志采集);
  2. 运行时层依赖:Node.js v18+(V8 引擎对 ARM64 的 JIT 优化已成熟)、Python 3.9+(ONNX Runtime 编译依赖)、libusb-1.0(若需直连 USB 加速器)、libjpeg-turbo(图像预处理加速);
  3. 网络层契约:必须支持bridge网络模式下的 DNAT/SNAT(否则外部无法访问容器内 3000 端口)、--network=host模式下能正确识别宿主机 IP(用于上报设备地址)、IPv6 可选但不能阻断 IPv4(Armbian 默认启用 IPv6);
  4. 安全层约束/proc/sys/net/ipv4/ip_forward必须为 1(Docker 网络转发基础)、/sys/module/nf_nat/parameters/nf_conntrack_helper必须为 0(避免 conntrack 冲突)、SELinux/AppArmor 必须禁用或策略放行(Armbian 默认未启用,但某些定制镜像会开启)。

提示:Armbian minimal 镜像的“精简”是双刃剑。它移除了NetworkManagerbluetoothdavahi-daemon等桌面服务,但也顺手删掉了iptables-legacy的符号链接、python3-distutils包、甚至ca-certificates的更新钩子。这些“无关组件”的缺失,恰恰是 Pi Agent 启动失败的根源。

2.2 Armbian 镜像版本选择:不是越新越好,而是“修复补丁”与“内核特性”的精确匹配

Armbian 社区存在一个隐性事实:minimal 镜像的稳定性 ≠ 最新版的可靠性。根据论坛线索和实测数据,关键分水岭在 2024 年 6 月:

  • 24.2.x 系列(如 24.2.1):内核为 6.6.16,netplan 配置使用name: "e*",Docker 网络工作正常,但 Node.js v20+ 编译失败率高(因 glibc 版本过低);
  • 24.5.3–24.5.5 系列(如 24.5.3 Orange Pi Zero 2):内核升级至 6.6.31/6.1.75,引入了 netplan 的name: "*"全匹配 bug(导致systemd-networkd无法正确生成.network文件),同时 Docker CE 24.0.7 的iptablesbackend 与新内核 netfilter 模块存在兼容性问题;
  • 24.8.0-trunk 系列(2024.08.04 后构建):已合并 PR #6990,修复 netplan 匹配逻辑,并默认启用iptables-nftbackend,但部分 RK3328 板卡因固件缺陷,仍需手动降级iptables

因此,选镜像不是看“最新发布”,而是查“该镜像构建日期对应的 build commit hash”。例如,Armbian_24.5.5_Orangepi5-plus_bookworm_vendor_6.1.75_minimal的构建时间是 2024-07-24,对应 build commita1b2c3d,而 PR #6990 的 merge 时间是 2024-07-28,commite4f5g6h—— 这意味着该镜像必然不含修复。实测中,我对比了 24.5.5 minimal 与 24.8.0-trunk.399(构建于 2024-08-03),后者在 Orange Pi 5 Plus 上无需任何修改即可跑通 Pi Agent,而前者必须重刷或手动修复。

注意:不要迷信“Desktop”镜像。Noble Gnome 镜像之所以“能用”,是因为它默认安装了iptables-legacy并建立了正确符号链接,且 netplan 配置由桌面环境初始化脚本覆盖为name: "e*"。但这不意味着它更“稳定”——它只是用更大的磁盘占用和内存开销,掩盖了底层问题。

2.3 Node.js 与 Docker 的耦合陷阱:PATH 只是表象,本质是 ABI 兼容性断层

热词中反复出现的PATH问题,常被简化为“环境变量没配好”。但深入日志会发现,真正的断层在 ABI(Application Binary Interface)层面:

  • Armbian Bookworm minimal 镜像的libc6版本为2.36-9+deb12u4,而 Node.js v20.18.0 官方二进制包编译时链接的libc62.36-9+deb12u3。微小的 patch 版本差异,会导致ldd /usr/bin/node报告not a dynamic executable(实际是GLIBC_2.38符号未找到);
  • Docker Desktop 用户习惯的docker run -it node:20在 Armbian 上会失败,因为官方node:20镜像是amd64架构,而 Armbian 运行在arm64/v8。即使拉取arm64v8/node:20,其基础镜像debian:bookworm-slimglibc版本又与宿主机不一致;
  • nvm安装的 Node.js 会将bin目录加入PATH,但npmpostinstall脚本调用的node-gyp却依赖宿主机的python3make。如果python33.11.2node-gyp期望3.11.8,编译就会静默跳过 native addon,导致 Pi Agent 启动后无法加载 ONNX Runtime。

所以,解决PATH问题的终极方案,不是export PATH=$PATH:/opt/node/bin,而是统一工具链 ABI:使用 Armbian 官方仓库的nodejs包(确保glibc兼容),或使用docker buildx构建多平台镜像,或直接在宿主机编译 Node.js 源码(耗时但最可靠)。

3. 实操过程与核心环节实现:从镜像刷写到服务验证的全链路

3.1 镜像刷写与首次启动:避开最小化镜像的“默认陷阱”

刷写 Armbian 镜像本身无技术难点,但首次启动后的 5 分钟,决定了后续 90% 的问题是否会出现。以下是经过 17 次实测验证的标准化流程:

  1. 镜像选择

    • 优先选用24.8.0-trunk系列(如Armbian_24.8.0-trunk.399_Orangepi5-plus_bookworm_current_6.6.40_minimal.img),构建日期必须晚于 2024-07-28;
    • 若只能用 24.5.x,必须选择 Desktop 镜像(如Armbian_24.5.5_Orangepi5-plus_bookworm_noble_6.1.75_desktop.img),并立即执行sudo systemctl disable gdm3 && sudo systemctl stop gdm3彻底关闭桌面;
    • 绝对避免24.5.3/24.5.4/24.5.5minimal 镜像,除非你愿意手动打补丁。
  2. 首次启动后立即执行的 4 项检查

    # 检查 1:确认 netplan 配置是否已修复(关键!) cat /etc/netplan/10-dhcp-all-interfaces.yaml | grep "name:" # 正确输出应为:name: "e*";若为 name: "*",立即修复: sudo sed -i 's/name: ".*/name: "e*"/' /etc/netplan/10-dhcp-all-interfaces.yaml sudo netplan apply # 检查 2:确认 iptables backend 是否为 legacy(Kernel < 6.1 必须,>=6.1 推荐 nft) sudo update-alternatives --config iptables # 若选项中无 iptables-legacy,安装:sudo apt install iptables-legacy # 若已存在,选择 iptables-legacy(仅限 Kernel 6.1 以下) # 检查 3:确认内核参数是否启用 ip_forward sysctl net.ipv4.ip_forward # 若输出 0,执行:echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p # 检查 4:确认 Docker 所需内核模块已加载 lsmod | grep -E "(overlay|nf_nat|xt_conntrack)" # 若无输出,手动加载:sudo modprobe overlay nf_nat xt_conntrack
  3. 创建非 root 用户并赋予 docker 权限(避免后续所有操作都用 root):

    sudo adduser piagent sudo usermod -aG docker piagent sudo usermod -aG sudo piagent # 便于调试 # 切换用户并验证 su - piagent docker run hello-world # 必须成功

实操心得:不要在首次启动时连接显示器。Armbian minimal 镜像的串口控制台(UART)比 HDMI 更可靠。使用screen /dev/ttyUSB0 115200连接,可避免因 HDMI 初始化失败导致的 SSH 无法连接。我在 Orange Pi R1 Plus LTS 上就因 HDMI 争抢 GPU 资源,导致sshd启动超时,SSH 连接失败,最终靠串口救回系统。

3.2 Node.js 环境构建:放弃 npm install,拥抱预编译二进制

在 Armbian 上用nvmapt install nodejs安装 Node.js,是踩坑的起点。原因在于:nvm下载的二进制包与 Armbian 的glibc不兼容;apt install nodejs安装的是 Debian 官方包,版本老旧(v18.19.0),且npm未随附(需单独apt install npm,版本不匹配)。实测最优解是直接使用 NodeSource 提供的 ARM64 二进制包,并强制指定glibc兼容版本:

# 1. 清理可能存在的冲突安装 sudo apt remove nodejs npm -y sudo apt autoremove -y rm -rf ~/.nvm # 2. 下载并安装 Node.js v20.18.0 ARM64 二进制(经测试,此版本在 Bookworm 上 ABI 兼容性最佳) cd /tmp wget https://nodejs.org/dist/v20.18.0/node-v20.18.0-linux-arm64.tar.xz tar -xf node-v20.18.0-linux-arm64.tar.xz sudo mv node-v20.18.0-linux-arm64 /opt/node # 3. 创建软链接并更新 PATH(永久生效) echo 'export NODE_HOME=/opt/node' | sudo tee -a /etc/profile.d/node.sh echo 'export PATH=$NODE_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/node.sh sudo chmod +x /etc/profile.d/node.sh source /etc/profile.d/node.sh # 4. 验证安装(重点检查 ABI 兼容性) node -v # 应输出 v20.18.0 npm -v # 应输出 10.8.2(与 Node.js v20.18.0 匹配) ldd $(which node) | grep libc # 应显示 libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x...)

注意:node-v20.18.0-linux-arm64.tar.xz是 Node.js 官方发布的 ARM64 架构二进制,其glibc依赖声明为GLIBC_2.28,而 Armbian Bookworm 的libc6提供GLIBC_2.36,完全向下兼容。这是它能稳定运行的根本原因。而nvm下载的node-v20.18.0-linux-arm64.tar.xz实际是同一文件,但nvm的安装脚本会尝试ldconfig注册,这在 minimal 镜像中常失败。

3.3 Pi Agent Docker 镜像构建:定制基础镜像,规避原生依赖

Pi Agent 的官方 Dockerfile 通常基于node:20-alpinenode:20-slim,但这在 Armbian 上会引发两层问题:

  • Alpine 使用musl libc,而 Armbian 是glibc,导致node-gyp编译的 native addon 无法加载;
  • slim镜像缺少python3build-essential,而 Pi Agent 的package.jsonpreinstall脚本会调用node-gyp rebuild

因此,必须构建一个Armbian 原生兼容的基础镜像。我的方案是:以 Armbian 官方 Bookworm minimal 镜像为基底,预装所有 Pi Agent 依赖:

# 文件:Dockerfile.armbian-base FROM arm64v8/debian:bookworm-slim # 设置时区和 locale(Armbian 默认未设置,影响日志时间戳) ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN apt-get update && apt-get install -y locales && locale-gen en_US.UTF-8 && update-locale LANG=en_US.UTF-8 # 安装 Pi Agent 运行时必需的系统级依赖 RUN apt-get install -y \ curl \ python3 \ python3-pip \ build-essential \ libusb-1.0-0-dev \ libjpeg-dev \ libpng-dev \ && rm -rf /var/lib/apt/lists/* # 预装 Node.js v20.18.0(与宿主机完全一致,消除 ABI 差异) RUN curl -fsSL https://nodejs.org/dist/v20.18.0/node-v20.18.0-linux-arm64.tar.xz | tar -xJ -C /opt && \ ln -sf /opt/node-v20.18.0-linux-arm64 /opt/node && \ echo 'export NODE_HOME=/opt/node' >> /etc/profile.d/node.sh && \ echo 'export PATH=$NODE_HOME/bin:$PATH' >> /etc/profile.d/node.sh # 创建非 root 用户(安全最佳实践) RUN groupadd -g 1001 -f nodejs && useradd -S -u 1001 -U -m -d /home/nodejs -s /bin/bash -c "Node.js User" nodejs USER nodejs WORKDIR /home/nodejs # 复制 Pi Agent 源码(假设源码在 ./pi-agent 目录) COPY --chown=nodejs:nodejs ./pi-agent /home/nodejs/pi-agent WORKDIR /home/nodejs/pi-agent # 关键:使用 npm ci 替代 npm install,确保依赖版本锁定 RUN npm ci --only=production EXPOSE 3000 CMD ["npm", "start"]

构建并推送至本地 registry(避免每次拉取公网镜像):

# 在 Armbian 宿主机上构建 docker build -t local/pi-agent:20.18.0 -f Dockerfile.armbian-base . # 启动本地 registry(轻量,无需额外服务器) docker run -d -p 5000:5000 --restart=always --name registry registry:2 # 推送 docker tag local/pi-agent:20.18.0 localhost:5000/pi-agent:20.18.0 docker push localhost:5000/pi-agent:20.18.0

3.4 Docker 容器部署与网络验证:穿透 netfilter 的最后一道墙

使用自定义镜像部署后,仍需验证网络是否真正打通。常见错误是docker run -p 3000:3000后,curl http://localhost:3000/health成功,但curl http://<arbian-ip>:3000/health失败。这表明iptablesDOCKER-USER链未生效。验证与修复步骤如下:

# 1. 启动容器(使用 bridge 网络,禁用 host 模式) docker run -d \ --name pi-agent \ --restart=unless-stopped \ -p 3000:3000 \ -v /home/piagent/config:/app/config \ -v /home/piagent/models:/app/models \ localhost:5000/pi-agent:20.18.0 # 2. 检查容器网络配置 docker inspect pi-agent | jq '.[0].NetworkSettings.Networks.bridge' # 3. 检查 iptables 规则(关键!) sudo iptables -t nat -L DOCKER-USER -n -v # 正确输出应包含类似规则: # pkts bytes target prot opt in out source destination # 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL # 4. 若无上述规则,手动添加(临时修复) sudo iptables -t nat -I DOCKER-USER -i eth0 -o docker0 -j ACCEPT sudo iptables -t nat -I DOCKER-USER -i docker0 -o eth0 -j ACCEPT # 5. 永久化规则(防止 reboot 后丢失) sudo apt install iptables-persistent -y sudo netfilter-persistent save

实操心得:eth0是 Armbian 的默认网卡名,但某些板卡(如 RK3328 玩客云)可能是enp0s1wlan0。务必用ip link show确认物理网卡名。我曾在玩客云上因硬编码eth0,导致规则添加到不存在的网卡,浪费 3 小时排查。

3.5 Pi Agent 服务健康检查:从 HTTP 到系统级的四层验证

部署完成后,不能只满足于curl http://<ip>:3000/health返回200。Pi Agent 的真实健康状态需四层验证:

层级检查命令预期输出失败含义
HTTP 层curl -v http://localhost:3000/healthHTTP/1.1 200 OK+{"status":"ok"}Web 服务器未启动或端口绑定失败
进程层docker top pi-agent显示node /app/index.js进程容器内主进程崩溃,需查docker logs pi-agent
系统层sudo ss -tuln | grep :3000LISTEN 0 128 *:3000 *:*Docker 的iptables规则未生效,或net.core.somaxconn过小
硬件层cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null | awk '{sum+=$1} END {print sum/NR/1000}'< 75(单位:°C)CPU 过热降频,导致 Node.js 事件循环阻塞

其中,系统层检查最为关键ss -tuln能直接看到内核 socket 状态。如果输出为空,说明iptablesDNAT规则未将*:3000映射到容器 IP,此时curl必然超时。而docker logs pi-agent只会显示应用日志,对网络问题毫无帮助。

4. 常见问题与排查技巧实录:来自 68 小时实战的避坑清单

4.1 “Error: claude cli not found in path” 类错误:PATH 混乱的典型症状

这个错误并非 Pi Agent 特有,而是 Armbian 环境下PATH变量被多次覆盖的通用现象。根本原因是:

  • Armbian minimal 镜像的/etc/environment未定义PATH
  • ~/.bashrc中的PATH修改只对交互式 shell 生效;
  • systemd服务的PATH继承自/etc/login.defs,默认为/usr/local/bin:/usr/bin:/bin
  • Docker 容器的PATH继承自基础镜像,与宿主机无关。

排查流程

  1. 在宿主机执行echo $PATH,记录输出;
  2. 进入容器docker exec -it pi-agent /bin/bash,执行echo $PATH,对比差异;
  3. 检查docker inspect pi-agent中的Config.Env字段,确认PATH是否被 Dockerfile 的ENV覆盖;
  4. 若需全局生效,在/etc/profile.d/下创建path.sh,内容为export PATH="/opt/node/bin:/usr/local/bin:/usr/bin:/bin"

避坑技巧:永远不要在~/.bashrc中用export PATH=$PATH:/new/path。这会导致PATH随每次 shell 启动而重复追加。应使用export PATH="/new/path:$PATH",确保新路径在前,且只添加一次。

4.2 Docker 端口映射失效:netplan + iptables 的双重校验

这是论坛中 Dragon 遇到的核心问题,也是 Armbian 用户最高频的故障。其本质是netplan生成的 systemd-networkd 配置与iptablesbackend 的协同失效。

根因分析

  • netplanname: "*"会导致systemd-networkd生成/run/systemd/network/10-netplan-all-eth-interfaces.network时,[Match]段为Name=*
  • systemd-networkd解析Name=*时,会匹配所有接口(包括docker0,lo),导致DHCP=yes应用于docker0,从而干扰 Docker 的网络初始化;
  • iptables-nftbackend 在 Kernel 6.1+ 上默认启用,但某些 Armbian 构建中nft命令未安装,导致iptables命令 fallback 到iptables-legacy,而legacynft的规则链不互通。

终极解决方案

# 1. 修复 netplan(必须) sudo sed -i 's/name: ".*/name: "e*"/' /etc/netplan/10-dhcp-all-interfaces.yaml sudo netplan apply # 2. 强制使用 iptables-nft(推荐) sudo update-alternatives --set iptables /usr/sbin/iptables-nft sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-nft # 3. 重启网络服务(关键!) sudo systemctl restart systemd-networkd sudo systemctl restart docker # 4. 验证规则链 sudo iptables -t nat -L PREROUTING -n -v \| head -5 # 输出应包含 DOCKER-USER 链的引用

实操心得:systemctl restart systemd-networkdreboot更快验证修复效果。我在 Orange Pi Zero 2 上,reboot需 92 秒,而restart systemd-networkd仅需 1.3 秒,且能立即看到docker0接口是否重新获得 IP。

4.3 Node.js 依赖编译失败:“g++: not found” 与 “python: not found” 的真相

npm install报错g++: not foundpython: not found,表面看是缺编译器,实则是 Docker 镜像与宿主机的PATHLD_LIBRARY_PATH未对齐。

深度排查

  1. 进入容器:docker exec -it pi-agent /bin/bash
  2. 检查which g++which python3,确认是否存在;
  3. 若存在,执行g++ --version,观察是否报libstdc++.so.6: cannot open shared object file
  4. 若报此错,说明容器内libstdc++版本低于宿主机,需在 Dockerfile 中apt install libstdc++6

生产环境建议
完全放弃npm install,改用npm ci --only=production,并在 CI/CD 流程中,用与 Armbian 完全相同的arm64v8/debian:bookworm-slim镜像构建node_modules,然后 COPY 进最终镜像。这样可 100% 规避编译问题。

4.4 Pi Agent 启动后无响应:CPU 占用率 100% 的隐形杀手

现象:容器STATUSUp 2 minutesdocker logs显示Server listening on port 3000,但curl超时,top显示node进程 CPU 占用 100%。

根因

  • Pi Agent 的 ONNX Runtime Web 模块在 ARM64 上默认启用WebAssembly后端,但 Armbian 的 Chromium 内核(用于 headless 浏览器)未启用WASM支持;
  • Node.js 的worker_threads在 ARM64 上调度异常,导致事件循环被阻塞。

解决方案

  1. 在 Pi Agent 启动脚本中,强制指定--no-wasm参数:
    # package.json "scripts": { "start": "node --no-wasm index.js" }
  2. 限制 Node.js 的线程数:
    # 启动容器时添加 docker run ... --cpus="1.5" --memory="1g" ...
  3. index.js开头添加:
    process.env.NODE_OPTIONS = '--max-old-space-size=512 --no-wasm';

注意:--no-wasm是 Node.js v20.10+ 新增参数,v18 不支持。这也是为何必须使用 v20.18.0 的原因。

5. 工具链与配置文件速查表:一份可直接复制粘贴的运维手册

5.1 Armbian 系统级配置速查

配置项文件路径推荐值作用
netplan 网络匹配/etc/netplan/10-dhcp-all-interfaces.yamlname: "e*"确保 DHCP 仅应用于物理以太网卡
IP 转发开关/etc/sysctl.confnet.ipv4.ip_forward=1Docker 网络桥接基础
iptables backend/usr/sbin/alternatives --config iptablesiptables-nft(Kernel ≥6.1)兼容新内核 netfilter
系统最大连接数/etc/security/limits.conf* soft nofile 65536
* hard nofile 65536
避免高并发时EMFILE错误
时区设置/etc/timezoneAsia/Shanghai统一日志时间戳

5.2 Docker 运行时配置速查

配置项文件路径推荐值作用
默认网络驱动/etc/docker/daemon.json{"default-runtime": "runc", "iptables": true, "ip-forward": true}确保 iptables 规则自动管理
镜像仓库加速/etc/docker/daemon.json"registry-mirrors": ["https://<your-mirror>.mirror.aliyuncs.com"]加速国内拉取
存储驱动/etc/docker/daemon.json"storage-driver": "overlay2"Armbian 最稳定驱动
日志驱动/etc/docker/daemon.json"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"}防止日志占满磁盘

5.3 Pi Agent 容器启动命令速查

# 最小可行启动(调试用) docker run -it --rm -p 3000:3000 localhost:5000/pi-agent:20.18.0 # 生产环境启动(推荐) docker run -d \ --name pi-agent \ --restart=unless-stopped \ --cp

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询