背景
最近在折腾Tauri
做 MacOS 软件开发,捣鼓 Rust 过程中,基于rustup doc --book
可以在本地 Mac 的浏览器打开查看。
做成文档查看有很多方式,比如我的 Blog 就是基于 hugo 生成的,也有 sphinx 文档、git-book 等等。
因 rust 文档已经在本地了,所以我需要搭建一个 Caddy
or nginx
之类的静态 Website 服务就可以,因最近一两年我迁移到 Caddy(主要是 TLS 证书签发很容易,无需ACEM.sh
签发之类的),我这里就选择使用 Caddy
服务部署 Rust
文档。
又因为这种第三方服务(类似 Redis、Kafka 之类的),通常是用的时候启动一下,所以我还是选择使用 Colima+Docker 来部署,所以整理在 Mac 上,我选择 Colima+Docker Compose+Caddy
这套部署。
在部署的过程中,注意是文件挂载这里踩了一些坑,主要涉及Mac磁盘文件系统
、Collima SSHFS
、Docker Compose
三层 Mount 挂载,这里简单的记录下过程。
Colima 磁盘挂载
Mac-Colima-Docker Container 磁盘挂载图示
Colima Mount 磁盘挂载问题(实际和以前的 virtualbox 非常相似)
- VM 内部的视角:拥有了一个新的、可用的文件系统空间,其大小和内容与宿主机的
/data
目录相同,可以通过挂载参数(RO/RW)支持可读写 - 宿主机
/data
目录的实际内容:如果你的宿主机/data
目录本身就很大,或者里面有很多文件,那么这个挂载操作并不会“复制”这些文件到 VM 的虚拟磁盘镜像中。它只是提供了一个访问路径
误区澄清
- 误区: 有些用户可能认为挂载操作会将宿主机的数据复制一份到 VM 的虚拟磁盘中。
- 事实: 挂载是
共享访问,不是复制
。因此,不会因为挂载而导致数据在宿主机和 VM 虚拟磁盘中各存一份。
复习下 Linux Mount
将一个文件系统(通常是存储设备上的文件系统,如硬盘分区、USB 驱动器、光盘、网络共享等)连接到当前文件系统树中的一个指定目录(称为挂载点)
- 文件系统 (Filesystem): 存储设备上组织文件和目录的方式。例如,
ext4
、XFS
、NTFS
、FAT32
等 - 设备 (Device): 物理或逻辑存储单元,如
/dev/sda1
(硬盘分区)、/dev/sdb
(USB 驱动器)、//server/share
(网络共享)。 - 挂载点 (Mount Point): 文件系统树中一个已存在的空目录,用于连接外部文件系统。例如,
/mnt/usb
、/media/cdrom
、/home/user/data
- 文件系统 (Filesystem): 存储设备上组织文件和目录的方式。例如,
系统配置文件:
/etc/fstab
示例操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# mount [选项] 设备 挂载点 # umount [选项] 挂载点 或 设备 # 挂硬盘 sudo mount /dev/sdb1 /mnt/usb # 挂ISO镜像 sudo mount -o loop my_image.iso /mnt/iso # 挂NFS sudo mount -t nfs server://server/share /mnt/nfs_share # 卸载确保没有程序正在使用该文件系统中的文件或目录 sudo umount /mnt/nfs_share
Linux VFS(虚拟文件系统),提供了一个抽象层,它的主要目的是**
提供一个统一的接口,让用户空间程序能够以相同的方式访问不同类型的文件系统,实现了文件系统的统一性,模块化可扩展和可维护性
,**像ls
,cp
,cat
,open()
,read()
,write()
这样的系统调用都是接口,被不同的文件系统实现- 统一数据结构和接口:让其他文件系统实现,用户进行
open("file")
操作,先到达 VFS 层 - 分派请求:VFS 根据文件挂载点信息,转发给对应的文件系统处理这个请求
- 调用实现操作+返回结果:具体文件系统执行操作后,将结果返回给 VFS,VFS 再将结果返回给用户空间程序
- 统一数据结构和接口:让其他文件系统实现,用户进行
Linux 和 Window 共享协议
Samba(SMB)
- 在 Linux 上安装并配置 Samba 服务器,使其能够共享 Linux 上的目录。
- Windows 客户端可以通过“网络邻居”或直接输入 UNC 路径 (
\\linux_ip\share_name
) 来访问这些共享。 - Linux 客户端也可以使用
mount -t cifs
命令挂载 Windows 共享
NFS(性能好与 Samab,但原生支持差一些)
1 2
# Windows 客户端挂载 NFS 共享: 在 PowerShell 中: mount -o anon \\linux_ip\path\to\share Z:
SSHFS (SSH File System),允许你通过 SSH 协议将远程目录挂载到本地文件系统,
- 配置简单: 只需要 SSH 访问权限。
Mac 上配置 Colima 挂载目录
配置参数:
~/.colima/default/colima.yaml
1 2 3 4 5
mounts: - location: /data/www writable: false - location: /data/projects writable: false
通过
colima ssh
登录到 clima 服务后,可以咨询mount
查看到是通过sshfs
文件系统挂载到 colima vm 上,且为ro
属性
cp 命令使用的注意
rust 的文档时在$HOME 目录,我这里 copy 到了/data/www 目录下,这里使用的 cp -r
- cp -r
- 会复制普通文件和目录
- 原始文件属性会变化(如时间戳、所有者、扩展属性)
- 解引用(dereference)符号链接。这意味着它会复制符号链接所指向的实际文件或目录,而不是复制符号链接本身。
- cp -a (
--archive
) 备份归档用,尽可能保持原有信息- 递归复制 (
-R
) - 不解引用符号链接(关键区别)
- 保留所有文件属性 (关键区别)
- 递归复制 (
在 Mac 机器基于 colima 的构建 caddy 容器支持 rust 文档
基本步骤
- colima 安装
mount
挂载点配置好(mac ↔ colima
)- caddy 的
docker-compose.yaml
配置,以及Caddyfile
配置(rust doc ↔ colima
) docker-compose up
容器启动测试
2. 配置 Mac 机器上的挂载点
Caddy 容器服务部署
docker-compose.yaml 配置
我把一些常用的 Web 后台开发的 Docker Infra 基础设施收拢了,可以直接复用:https://github.com/sapaude/docker-infras
|
|
rust.doc.sapaude.tech 配置
PS. 为了方便在手机查看,也部署了一个在线 Web 版本: https://rust.doc.sapaude.tech
|
|
小结
Mac 上面以前开发是基于 DockerEnginer
,后来 Docker
商业化后,导致使用起来很不方便,所以找到了 Colima
这个替代品
Mac 上使用 Colima+Docker
部署一些常用开发服务非常 Nice,加上 Mac 上面Collima
非常轻量级,非常适合快速部署一些基础依赖服务(比如 Redis、Mysql、Kafka、Etcd、ES
等等),同时 Docker 容器可以保证整个 Mac 环境非常干净。
为了方便复用,我把一些常用的 Web 后台开发的 Docker Infra 基础设施收拢了,可以直接复用:https://github.com/sapaude/docker-infras,有需要的可以~