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
This new feature, pulling images with Podman by using short names, includes more security, greater convenience, and is another step forward for container management.
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