zzxworld

在 macOS 系统上使用 Podman

为了开发微信小程序,我又一次换回了 macOS 系统。之前在 Arch Linux 系统上已经习惯了用 Podman 容器引擎作为开发环境的基础设施,这次在 macOS 上也准备继续使用 Podman。

关于 Podman 的介绍,可以参考我之前分享的这篇文章:

Podman 在 macOS 以及 Windows 系统上和 Linux 相比有些不太一样。这点和 Docker 有点类似。因为 macOS 和 Windows 原生系统没有运行容器的基础环境。所以需要借助虚拟机创建一个 Linux 中间层,然后通过 C/S 架构的方式来实现类似于 Linux 系统下的容器操作。这种结构上的区别导致我在原本已经写好了各种容器脚本的情况下,还是花了不少时间来调整它们,最终才在 macOS 上运行起来。

所以如果想顺畅的玩 Docker 之类的容器技术,最佳选择还是 Linux 系统。而在 macOS 或是 Windows 上使用 Docker,请一定要注意上面所说的运行方式上的差异。理解这种差异可以确保在碰到一些因系统不同导致的问题时快速排查出原因。

安装 Podman

在 macOS 上安装 Podman,最简单的方式就是使用 brew 命令:

brew install podman

这个命令会安装一大堆的依赖包和软件,所以时间要的比较久。

我之前在 Arch Linux 上安装 Podman 也是一条命令,一分钟就能解决。这次在 macOS 上安装花了我半天时间。依赖软件多是一方面,主要原因还是通过 brew 命令下载软件的速度实在太慢。这还是我在用了国内镜像源的情况下。我发现用的 brew 镜像源只是镜像了软件库索引,没有镜像软件地址的源码。所以下载软件时还是要转到国外,导致速度一直都是维持在两位数的 KB 级别,而且还时常超时中止。碰到这种问题只能重新再来一遍安装命令,很耽误时间。

完成整个安装过程需要耐心,等待命令执行完成后,Podman 就安装好了。

初始化虚拟机

Podman 在 Linux 系统上安装好了就能直接用。但在 macOS 上还需要一个额外的虚拟机初始化步骤。估计在原生的 Windows 上使用也是如此。

初始化 Podman 虚拟机的命令如下:

podman machine init

第一次执行会下载一个虚拟机的基础系统,系统是 Fedora CoreOS。有 600MB 左右大小,同样下载有点慢,需要耐心等待。

完成初始化虚拟机的步骤后,就可以正式使用 podman 命令了。Podman 在这个系统中默认是以 Rootless 方式执行的,建议设置为 Root 模式,可以避免一些实际应用时的权限问题。切换模式的命令如下:

podman machine set --rootful

使用 Podman

安装好后使用上其实没什么好说的,因为命令执行方式和在 Linux 上完全一样。不过唯一要注意的一点就是文件挂载。这其实跟上面说的虚拟机运行方式有关。

上面说了,Podman 在 macOS 运行依赖于中间层的虚拟机。这导致在文件挂载时不能随心所欲的挂载主系统上的任何目录。一定是要虚拟机上有的目录才能让运行容器正常挂载。

比如我之前的 MySQL 服务是单独挂载在 /var/lib/mysql 目录中。当我在主机系统上创建好这个目录,并设置好权限后,启动 MySQL 容器时却报错,提示目录不存在。在不想改变目录的前提下,我要解决这个问题的方式只能是在初始化虚拟机的时候通过 -v 参数把 /var/lib/mysql 先挂载到虚拟机。

或者是改变目录到当前用户目录下。因为虚拟机初始化时默认会把当前的用户目录挂载到虚拟机。比如我当前的用户目录是 /Users/zzxworld,通过 podman machine ssh 命令进入虚拟机后,会发现同样也存在这样一个目录。里面的文件结构和内容与主机系统上一致。

这个问题的本质就是挂在任何非用户目录时,一定要先确保挂载到了虚拟机,然后容器才能正常挂载。比较偷懒建议是把容器挂载目录限定在用户目录中,这样可以少些折腾。

镜像打包

自从使用 Podman 后,我就再也没使用过 Dockerfile 的镜像打包方式。因为 Buildah 灵活和好用多了。但在 macOS 上无法使用到这个好工具。不过我还不太不确定,因为从理论上看,至少在 Podman 的虚拟机这层是可以单独安装使用的。我简单尝试了一下,这个默认的虚拟机系统貌似没有提供 Fedora Linux 的 dnf 以及 yum 命令。所以也就没再深入。

也正因为如此,我又开始把之前的 Buildah 镜像打包脚本调整为 Dockerfile 方式,然后可以通过 podman build 命令来实现镜像打包功能。目测 Dockerfile 打包方式输出的镜像比 Buildah 生成的镜像稍大一些。

结语

Podman 目前在 macOS 上实际使用还是存在一些难以解决的问题。比如开机自启动,Podman 本身提供的 Systemd 配置文件生成方案就无效了,需要自己去研究 macOS 的 Launch Agent 方案。另外在 macOS 上通过 Podman 使用 Node 镜像操作 npm 命令时还会碰到头疼的 ulimit 问题。所以更稳妥,更省事的选择还是 Docker Desktop。


目前我是在一台 Intel NUC 上安装的 macOS。因为之前在这上面安装过一次,并把过程总结成了一篇文章:《一台 Intel NUC 的黑苹果之旅》,这次通过参考这篇文章,在安装环节没有碰到什么问题。

macOS 在 Intel NUC 上能用,但发热大和风扇狂转的问题依然无解。我目前是在 NUC 旁边放了个风扇对着吹,可以稍微缓解一下发热问题。但这不是个长期方案,所以我正在考虑选择入手一台 Mac mini。

对 Linux 的流畅体验还有些不舍,但在商业软件方面的弱势让我不得不再次考虑放弃,也许它对我来说永远只能是服务器系统的最佳选择。