Colima磁盘挂载那些事 - 在Mac机器部署Docker容器支持Rust文档查阅

AI 摘要: 本文介绍了在MacOS环境下使用Colima、Docker Compose与Caddy部署本地Rust文档的方法,重点涵盖了文件挂载相关的坑与解决方案。作者在迁移到Colima后,结合Docker和Caddy进行静态网站部署,尤其是管理Rust官方文档。本地开发中,磁盘挂载在虚拟化层引发的问题被详细阐述,强调了不同层级的挂载关系和配置误区。文章还回顾了Linux挂载的基本原理,说明从硬件设备到挂载点的流程。结尾强调了Colima相较Docker的优势,适合快速部署多种基础服务,确保环境整洁。整体强调了在Mac上实现高效、便捷的开发环境的实践经验。

背景

最近在折腾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 SSHFSDocker Compose 三层 Mount 挂载,这里简单的记录下过程。

Colima 磁盘挂载

Mac-Colima-Docker Container 磁盘挂载图示

colima挂载图

Colima Mount 磁盘挂载问题(实际和以前的 virtualbox 非常相似)

  1. VM 内部的视角:拥有了一个新的、可用的文件系统空间,其大小和内容与宿主机的  /data  目录相同,可以通过挂载参数(RO/RW)支持可读写
  2. 宿主机  /data  目录的实际内容:如果你的宿主机  /data  目录本身就很大,或者里面有很多文件,那么这个挂载操作并不会“复制”这些文件到 VM 的虚拟磁盘镜像中。它只是提供了一个访问路径

误区澄清

  • 误区:  有些用户可能认为挂载操作会将宿主机的数据复制一份到 VM 的虚拟磁盘中。
  • 事实:  挂载是共享访问,不是复制。因此,不会因为挂载而导致数据在宿主机和 VM 虚拟磁盘中各存一份。

复习下 Linux Mount

  1. 将一个文件系统(通常是存储设备上的文件系统,如硬盘分区、USB 驱动器、光盘、网络共享等)连接到当前文件系统树中的一个指定目录(称为挂载点

    1. 文件系统 (Filesystem):  存储设备上组织文件和目录的方式。例如,ext4XFSNTFSFAT32
    2. 设备 (Device):  物理或逻辑存储单元,如  /dev/sda1 (硬盘分区)、/dev/sdb (USB 驱动器)、//server/share (网络共享)。
    3. 挂载点 (Mount Point):  文件系统树中一个已存在的空目录,用于连接外部文件系统。例如,/mnt/usb/media/cdrom/home/user/data
  2. 系统配置文件:/etc/fstab

  3. 示例操作

     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
    
  4. Linux VFS(虚拟文件系统),提供了一个抽象层,它的主要目的是**提供一个统一的接口,让用户空间程序能够以相同的方式访问不同类型的文件系统,实现了文件系统的统一性,模块化可扩展和可维护性,**像  lscpcatopen()read()write()  这样的系统调用都是接口,被不同的文件系统实现

    1. 统一数据结构和接口:让其他文件系统实现,用户进行 open("file")操作,先到达 VFS 层
    2. 分派请求:VFS 根据文件挂载点信息,转发给对应的文件系统处理这个请求
    3. 调用实现操作+返回结果:具体文件系统执行操作后,将结果返回给 VFS,VFS 再将结果返回给用户空间程序
  5. Linux 和 Window 共享协议

    1. Samba(SMB)

      • 在 Linux 上安装并配置 Samba 服务器,使其能够共享 Linux 上的目录。
      • Windows 客户端可以通过“网络邻居”或直接输入 UNC 路径 (\\linux_ip\share_name) 来访问这些共享。
      • Linux 客户端也可以使用  mount -t cifs  命令挂载 Windows 共享
    2. NFS(性能好与 Samab,但原生支持差一些)

      1
      2
      
      # Windows 客户端挂载 NFS 共享: 在 PowerShell 中:
      mount -o anon \\linux_ip\path\to\share Z:
      
    3. SSHFS (SSH File System),允许你通过 SSH 协议将远程目录挂载到本地文件系统,

      • 配置简单:  只需要 SSH 访问权限。

Mac 上配置 Colima 挂载目录

  1. 配置参数: ~/.colima/default/colima.yaml

    1
    2
    3
    4
    5
    
    mounts:
      - location: /data/www
        writable: false
      - location: /data/projects
        writable: false
    
  2. 通过colima ssh登录到 clima 服务后,可以咨询mount查看到是通过sshfs文件系统挂载到 colima vm 上,且为ro属性

    olima ssh登录服务器观察磁盘挂载情况

cp 命令使用的注意

rust 的文档时在$HOME 目录,我这里 copy 到了/data/www 目录下,这里使用的 cp -r

  1. cp -r
    1. 会复制普通文件和目录
    2. 原始文件属性会变化(如时间戳、所有者、扩展属性)
    3. 解引用(dereference)符号链接。这意味着它会复制符号链接所指向的实际文件或目录,而不是复制符号链接本身。
  2. cp -a (--archive) 备份归档用,尽可能保持原有信息
    1. 递归复制 (-R)
    2. 不解引用符号链接(关键区别)
    3. 保留所有文件属性  (关键区别)

在 Mac 机器基于 colima 的构建 caddy 容器支持 rust 文档

基本步骤

  1. colima 安装
  2. mount 挂载点配置好(mac ↔ colima
  3. caddy 的 docker-compose.yaml 配置,以及 Caddyfile 配置(rust doc ↔ colima
  4. docker-compose up容器启动测试

2. 配置 Mac 机器上的挂载点

登录caddy容器服务观测挂载

Caddy 容器服务部署

docker-compose.yaml 配置

我把一些常用的 Web 后台开发的 Docker Infra 基础设施收拢了,可以直接复用:https://github.com/sapaude/docker-infras

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  caddy-www:
    image: caddy:latest
    container_name: caddy-httpd-www
    ports:
      - "8888:8888"
      - "8890:8890"
    volumes:
      - /data/projects/github.com/sapaude/docker-infras/www/caddy/conf:/etc/caddy
      - /data/www/docs/rust:/data/www/docs/rust:ro
      - /data/projects/github.com/sapaude/docker-infras/www/caddy/siteinfo:/data/www/siteinfo

rust.doc.sapaude.tech 配置

PS. 为了方便在手机查看,也部署了一个在线 Web 版本: https://rust.doc.sapaude.tech

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# rust.doc.sapaude.tech
:8890 {
     # 日志
    import access_log

    # 路径
    root /data/www/docs/rust/html
    file_server
    try_files {path} {path}/index.html /index.html

    # 响应
    encode gzip
}

小结

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,有需要的可以~