使用 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