cover

在 MacOS 上使用 Podman 代替 Docker

sorcererxw

使用 Docker Desktop 多年了,非常好用,给开发带来了很多便利。但因为 Docker Desktop 还是有一些令人不顺心的地方:

  • 必须付费才能忽略更新(使用 Homebrew Cask 安装无法通过 Homebrew 自动更新)
  • 启动缓慢

对我来说,我需要的只是 Docker CLI 部分,不需要 GUI、Docker-Compose,那么 Podman 算是一个比较好的替代品。

安装

$ brew install podman

$ podman machine init // 初始化 Podman

$ podman machine start // 启动 Podman

通过简单的命令就可以在机器上配置好 Podman,启动速度也是比较快。

$ time podman machine start

INFO[0000] waiting for clients...
INFO[0000] listening tcp://0.0.0.0:7777
INFO[0000] new connection from  to /var/folders/yt/h6dhsb1500098zqv1sv11knw0000gn/T/podman/qemu_podman-machine-default.sock
Waiting for VM ...
podman machine start
0.02s user 0.02s system 0% cpu 22.810 total

通过 podman -h 可以看到 Podman 兼容了大部分 Docker 命令,迁移学习成本非常低。

镜像名

Docker 默认 registry 就是 docker.io,所以在拉取镜像的时候,支持简写镜像名称:

docker pull mysql:8

但是 Podman 并没有与 docker.io 有关联,所以如果需要从 docker.io 上拉镜像,需要使用完整的仓库地址:

podman pull docker.io/library/mysql:8

通过配置也可以实现和 Docker 一样自动补全,参考:

Container image short names in Podman
When people approach me to talk about Podman and containers, I usually ask if they are familiar with Docker. Most people are, and the conversations quick...
https://www.redhat.com/sysadmin/container-image-short-names

端口映射

我们在启动容器的时候,往往需要配置容器端口和宿主机端口的映射,如:

docker run -d -p 6379:6379 docker.io/library/redis:6 

Docker 会默认配置为 TCP 的端口映射。但是在 Podman 当中,需要主动指定网络类型:

podman run -d -p 6379:6379/tcp docker.io/library/redis:6