Docker 与 USB 扩展存储

x86 软路由跑 OpenWrt 最大的好处就是性能有余量,可以当一台小型服务器用。挂硬盘、装 Docker、跑常驻服务,一台软路由顶路由器加迷你主机两台设备。本篇讲两个相互配合的基础设施:USB 存储扩展和 Docker 环境。

USB 存储挂载

OpenWrt 默认只读的系统分区装不下什么大文件,插一块 USB 硬盘或 U 盘几乎是软路由用户的标配操作。挂载涉及的组件如下表。

组件 作用 备注
内核驱动 USB 总线支持 大多固件已内置
文件系统 识别磁盘格式 ext4 挂载点稳定
block-mount 自动挂载服务 按需安装
fdisk / lsblk 分区工具 磁盘初始化用

挂载流程:插上磁盘 → 命令行 lsblk 看设备名 → 按需分区格式化 → 挂载点写进 /etc/config/fstab → 重启验证自动挂载。建议用 ext4 而不是 NTFS 或 exFAT:Linux 原生文件系统权限和稳定性最好,其它格式要么性能差要么需要额外组件。

# 常用操作示例
lsblk
mkfs.ext4 /dev/sda1
mkdir -p /mnt/sda1
mount /dev/sda1 /mnt/sda1

# 写入开机自动挂载
block detect | uci import fstab
uci set fstab.@mount[0].enabled='1'
uci commit fstab

机械硬盘用户别忘了装 hd-idle 设置闲置休眠,既省电又延长硬盘寿命;带 LED 指示灯的盒子还会遇到休眠后灯不灭的小问题,不影响使用。USB 磁盘的供电要留意,2.5 寸机械盘有些盒子供电不足需要带供电的硬盘底座,这块和 NAS 存储基础 讲的供电原则完全一致。

磁盘健康是最容易被忽略的长期项。机械盘定期用 smartctl 查一次 SMART 状态(重定位扇区计数、待映射扇区这些指标),固态盘留意累计写入量。条件允许的话系统日志走 tmpfs 内存盘、重要的容器数据单独放一块,各司其职,一块盘出问题不至于全军覆没。长期插着的 USB 硬盘散热条件通常不好,尽量放在开放环境,避免紧贴路由器出风口。lsblk 看不到新插的磁盘时先怀疑供电,换一根粗线或带供电的扩展坞再试。

USB 磁盘健康指标

Docker 环境安装

OpenWrt 23.05 及以后的官方源里已经能直接装 Docker,流程非常短:

opkg update
opkg install dockerd docker luci-app-dockerman
/etc/init.d/dockerd enable
/etc/init.d/dockerd start

启动前最好把 Docker 的镜像和容器目录指到 USB 磁盘上——系统盘通常只有几百 MB,拉两个镜像就满了。修改位置在 /etc/config/dockerd 里的 data_root 选项,改成挂载点下的子目录,重启 dockerd 生效。

装完 LuCI 里出现 Services → Docker 页面,可以管理容器、镜像和卷。拉镜像慢的话,换一个就近的镜像仓库,或者白天拉好晚上再用。

在 OpenWrt 上跑什么

容器化能跑的服务里,和 OpenWrt 定位最契合的是这几类。

服务类型 好处 注意
AdGuard Home 容器 升级方便、配置隔离 53 端口冲突
下载工具 路由器常开免电费 机械盘休眠会唤醒
代码/构建服务 家庭开发环境 内存占用偏高
监控面板 图表化路由数据 注意存储寿命

在 OpenWrt 上跑容器最大的便利是和宿主网络天然贴近:AdGuard Home 容器可以直接监听本机回环、和家人共享同一套网络命名空间,配置比在别的宿主上跑还省事。反过来最大的限制是内核版本随固件走,部分高强度功能需要较新内核支持的容器可能跑不起,挑镜像时先看有没有对应架构的构建(arm 设备尤其如此)。

另外一个常见玩法是在别的 Linux 主机上跑 OpenWrt 容器当旁路由,原理见《旁路由:网关与 DNS 分流配置》,本篇的 Docker 环境相反,是 OpenWrt 自己做宿主跑别的服务。两者架构思路相通,要不要折腾取决于你的硬件性能。

资源与稳定性注意

软路由首先是路由器,容器化服务必须以不干扰本职工作为底线。内存 2GB 的设备只跑一两个轻量服务,4GB 以上才能放开了玩。CPU 满载的下载任务会影响转发性能,配合 SQM 设置时优先保证路由转发,资源分配别贪心。判断容器有没有拖累网络最直观的方法:开几个容器测一次内网转发速度,停掉容器再测一次,差距大就是资源瓶颈的信号,该减负减负、该换硬件换硬件。

一个常被忽视的配置是容器日志大小。默认情况下容器日志会无限增长,跑上几个月把磁盘写满,dockerd 自己出问题反而最难查。给每个容器配上日志大小上限(比如单个文件 10MB 保留三个),一行配置换长期安心。同理,镜像旧版本要定期清理:每次升级留下的旧镜像占着几百 MB 不动,磁盘空间就是这么不知不觉满的。

还有两个运维细节。其一是 swap:给系统加一两个 GB 的交换文件作为内存保险丝,突发尖峰时多一道缓冲。其二是容器的开机自启与依赖顺序:网络服务起在 docker 之后才有意义,luci-app-dockerman 里可以调,配错了容器启动失败排查很费时间。

容器长期运行的监控数据(CPU 温度、磁盘占用)建议也采集起来,是后续性能调优的基础,见《系统日志与监控》。

玩容器之前的网络规划

Docker 网络模式直接决定容器能不能被正常访问。默认 bridge 模式下容器走自己的网段,通过端口映射对外暴露,家用场景最省心;想给容器分配局域网 IP(比如让 AdGuard Home 容器直接拥有内网地址做 DNS),需要 macvlan 模式,代价是宿主机与容器之间默认不能直接通信,调试时要知道这个坎。端口冲突是这一块的高频故障:53 端口被 dnsmasq 占着、80 被 LuCI 占着,容器要用的端口先 lsof 或 netstat 查一遍,别等启动失败再回头查。

拿到磁盘之后的规划同样重要。/mnt 下按用途分目录(容器数据、下载、备份),卷映射指到对应目录,一块盘出问题不至于全军覆没。重要容器数据定期打包到另一块存储或 NAS 上,OpenWrt 设备的固件随时可能重刷,数据别只留在一个闪存里。备份的策略与工具见 备份与恢复实践,思路完全通用。

文件系统选型再补充一点。多设备共享(Windows、Mac 都要直接读)的移动硬盘用 exFAT,但要做好性能打折的心理准备;只在 OpenWrt 内部使用的选 ext4,权限支持和长期稳定性都最优。把容器 data_root 放在 ext4 分区上更是强烈建议,NTFS 之流的元数据操作对 Docker 来说性能灾难级别,随手之劳能省掉日后无数麻烦。

上手路线建议

给零基础读者的建议是分三步走。第一步:先不碰 Docker,把 USB 磁盘挂好、自动挂载跑通,这是所有后续的地基,磁盘相关的坑在这一步全部踩完。第二步:装一个轻量日志型容器(比如系统监控类),走通镜像拉取、卷映射、开机自启的完整流程,熟悉 luci-app-dockerman 的每一步操作。第三步:再按需上真正想跑的服务。每一步都验证再前进,比一口气全配完出问题再从头查稳得多——这套小步快跑的思路适用一切运维工作。

另外提醒一个 OpenWrt 特有的小坑:容器若需要打开特权模式或访问 /dev 设备,权限给的越少越好,OpenWrt 的 rootfs 结构和标准 Linux 有差异,容器里写死的路径偶尔找不到对应目录,排障时间会比普通宿主长。最后给一个排障入口提示:容器相关的所有行为都会留痕——镜像拉取失败看 dockerd 日志、容器启动失败看 docker logs、端口冲突看 netstat 输出、磁盘飙满看 df 和容器日志上限。养成按这个顺序排查的习惯,OpenWrt 上玩 Docker 的问题基本都能自己消化。

镜像加速是长期使用里最影响体验的细节。默认仓库在国内拉取速度不稳定,配置一个就近的镜像地址后拉取速度能差好几倍。所有容器镜像统一走加速地址管理,后期换源也是一处改处处生效。镜像版本的建议是 fixed tag(指定具体版本号)而不是 latest——latest 每次拉取都可能是新版本,某次更新出问题很难回滚,指定版本才是可复现的生产做法。这一点对所有服务器运维都通用,详见 镜像与版本管理。

oa-0305

容器与宿主机的网络关系

延伸阅读

  • 《AdGuard Home 广告过滤》:容器化运行的完整步骤。
  • 《性能优化:CPU 与无线调优》:判断加服务后路由本职有没有受影响。
  • 《系统日志与监控》:dockerd 日志与长期运行监控的接入。