跳转到内容

用四个概念理解 Docker

把一个笔记服务装进 NAS,至少涉及程序、运行中的进程、笔记文件和访问入口。Docker 把这些边界分开,能减少软件互相影响,但不会自动替你备份,也不能让不可信程序变得安全。

镜像是程序包,容器是运行实例

镜像包含程序和依赖。镜像名:标签 指定一组可下载的内容;标签可以被维护者重新指向,摘要 @sha256:... 才能准确标识内容。latest 是维护者定义的标签,不是“适合你升级”的保证。为家庭服务选一个经过阅读发布说明的明确版本,并记录拉取后的摘要。

容器由镜像创建,有自己的进程、环境变量和可写层。同一个镜像能创建多个容器;停止容器类似关掉程序,删除容器会丢弃容器可写层。更新通常是拉取新镜像后重建容器,而不是进入容器运行系统升级命令。

卷和目录挂载保存重要数据

命名卷由 Docker 管理,绑定挂载则把 NAS 上的明确目录交给容器,例如 ./data:/var/opt/memos。冒号左边是宿主机路径,右边是程序在容器内看到的路径。应用文档规定的右侧路径不可随意改名,否则程序可能把数据写进容器可写层。

初学者可以用绑定挂载组织数据,方便检查备份边界。数据库的目录需要本地文件系统语义,不能因为“能挂载”就放到 SMB/NFS 上。挂载后,NAS 上的权限仍然有效;容器内 UID/GID 是数字身份,并不会自动对应你在网页创建的用户名称。

在媒体挂载末尾添加 :ro 表示只读,适合只扫描和播放的服务。数据库与上传目录需要写权限。不要把 NAS 根目录整体交给应用。

网络决定谁能连接

Compose 默认建立自己的 bridge 网络,服务之间可以用服务名访问,例如应用连接 db:5432ports 将容器端口发布到宿主机;expose 主要用于说明内部端口,不等于防火墙。没有 ports 的数据库依然能被同一网络内的应用访问。

192.168.1.20:5230:5230 表示在指定 NAS IPv4 的 5230 端口转发到容器 5230。这个地址仅是写法示例,实际请填写自己的 NAS 地址。局域网绑定不能替代路由器、防火墙和身份认证,尤其要检查是否存在端口转发。

检查自己的理解

为一个测试服务写下四项:镜像来源、容器名、持久化目录、对外端口。关闭容器后网页应不可访问,重新启动后测试笔记应仍存在。完成备份后尝试重建测试容器,笔记仍在才说明持久化路径选对了。不要用真实家庭照片验证删除行为。

“容器运行中”只表示进程未退出;首页可打开也不代表附件、数据库与权限都正常。验收至少包括创建一条内容、读取附件和重启后复查。

延伸阅读

官方参考

fnOS 非官方中文使用指南,与飞牛官方无隶属关系。