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 上使用 Podman 的额外步骤。我想在 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 方案。然后通过 Podman 使用 Node 镜像操作 npm 命令时还会碰到 ulimit 问题。所以更保险,更省事的选择还是 Docker Desktop。


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

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

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