macOS上用Podman替代Docker Destop

前不久在单位收到一封邮件,要求卸载Docker Destop,因为它是商业软件,厂里已经收到维权函。

查了一下发现,好家伙,这确实是一个商业软件。以前以为它是开源的,有点披着羊皮的狼的意思……根据条款,超过250人的企业就需要买 license(AI回答未经求证),有点把韭菜养肥了割的意思啊。碍于尚未找替代品,项目活又多,就拖到今天。

本来对Docker Destop也没什么好感,docker 本来就是一些命令行工具,搞个 GUI 有什么鸟用呢?实际上,平时也都是在命令行下操作。本来想看看能不能用 brew 装一下命令行工具部分,结果发现好像只有一些 cli 工具,不包含引擎也用不起来,遂作罢。

AI告诉我说 Docker Destop 有几个替代品,大致看了一下,剩下 ColimaPodman 两个 PK :

Colima Podman
原理 使用轻量级虚拟机,虚拟机运行docker 使用轻量级虚拟机,虚拟机运行一个无守护进程的容器运行时
优势 跟docker一样,配置方便,上手难度低 性能较好,虚拟机性能损耗较小,安全性也有优势
劣势 性能损耗较大 虽兼容docker,但有些行为可能不太一样,需要懂点docker底层原理

对比过后,想都不用想,先试试 Podman 。我厂比较穷,开发机比较弱,咱要的就是性能,主打一个学无止境,给自己上点难度,哈哈哈~

Podman 同样可以通过 brew 来装:

1
brew install podman

这一步会下载 podman 和相关依赖包,如果网络不好的话,可能需要挂个代理。

安装完毕后,我们就可以看到 podman 命令了:

1
2
$ which podman
/usr/local/bin/podman

podman 命令的执行方式跟 docker 命令类似,比如可以执行 ps 子命令查看容器实例:

1
podman ps

不过现在执行会报错,因为我们还没有跑虚拟机,需要先初始化一下:

1
 podman machine init

初始化虚拟机时,可以需要将 macOS 下的相关目录挂载进去,以便 docker –volume 命令能够正常执行。详情请查询:【常见问题】容器无法挂载macOS本地文件

这个命令会初始化虚拟机,在初始化过程中,需要拉一个虚拟机镜像,大概是 1 GB :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Looking up Podman Machine image at quay.io/podman/machine-os:5.3 to create VM
Getting image source signatures
Copying blob 047caa9c4100 done   |
Copying config 44136fa355 done   |
Writing manifest to image destination
047caa9c410038075055e1e41d520fc975a09797838541174fa3066e58ebd8ea
Extracting compressed file: podman-machine-default-amd64.raw: done
Machine init complete
To start your machine run:

	podman machine start

虚拟机初始化好后,我们就可以把它开起来:

1
podman machine start

如无意外,就可以看到以下输出,说明虚拟机已经成功开起来了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
Starting machine "podman-machine-default"

This machine is currently configured in rootless mode. If your containers
require root permissions (e.g. ports < 1024), or if you run into compatibility
issues with non-podman clients, you can switch using the following command:

	podman machine set --rootful

API forwarding listening on: /var/folders/mz/y8r9c0mj1g1dbsgwqs_ndwpw0000gn/T/podman/podman-machine-default-api.sock

The system helper service is not installed; the default Docker API socket
address can't be used by podman. If you would like to install it, run the following commands:

        sudo /usr/local/Cellar/podman/5.3.1_1/bin/podman-mac-helper install
        podman machine stop; podman machine start

You can still connect Docker API clients by setting DOCKER_HOST using the
following command in your terminal session:

        export DOCKER_HOST='unix:///var/folders/mz/y8r9c0mj1g1dbsgwqs_ndwpw0000gn/T/podman/podman-machine-default-api.sock'

Machine "podman-machine-default" started successfully

接下来就可以执行 podman 命令了,比如查看容器实例:

1
2
$ podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

再比如查看镜像:

1
2
$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

因为 podman 刚安装,所以没有数据,但这个输出足以说明 podman 可以正常使用了。

虽然 podman 兼容 docker 命令,命令参数基本一样,但一些 shell 脚本可以还是需要 docker 命令。这时可以给 podman 取个别名 docker ,或者建个名为 docker 的软链:

1
2
3
4
5
# 别名
alias docker=podman

# 或者建个软链
cd /usr/local/bin/ && ln -s podman docker

常见问题

容器无法挂载macOS本地文件

如果执行 docker 命令挂载 macOS 文件系统时,有报错提示:no such file or directory ,则是 macOs 下相关文件目录未挂载到 podman 虚拟机导致的(虚拟机作为容器的宿主机)。

podman 虚拟机默认只挂载好 /Users 目录,如果需要用到其他目录,比如 /Volumes 则需要在初始化虚拟机时指定好:

1
podman machine init --volume /Users --volume /Volumes

如果虚拟机已经初始化好,甚至已经跑起来了,则需要先停止和删除重建:

1
2
3
4
5
# 停止虚拟机
podman machine stop

# 删除虚拟机
podman machine rm

更多虚拟机子命令和用法,可以执行 podman machine 查看:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ podman machine
Manage a virtual machine

Description:
  Manage a virtual machine. Virtual machines are used to run Podman.

Usage:
  podman machine [command]

Available Commands:
  info        Display machine host info
  init        Initialize a virtual machine
  inspect     Inspect an existing machine
  list        List machines
  os          Manage a Podman virtual machine's OS
  reset       Remove all machines
  rm          Remove an existing machine
  set         Set a virtual machine setting
  ssh         SSH into an existing machine
  start       Start an existing machine
  stop        Stop an existing machine

Error: missing command 'podman machine COMMAND'

镜像源

docker 官方仓库经常被墙,这时就需要用国内的镜像源。使用 podman 时,需要进入 podman 虚拟机修改相关配置文件。执行一下命令进去 podman 虚拟机:

1
podman machine ssh

仓库镜像源可在 /etc/containers/registries.conf 配置文件里面指定

1
location = "https://mirrors.ustc.edu.cn/"

订阅更新,获取更多学习资料,请关注我们的公众号:

【随笔】系列文章首发于公众号【小菜学编程】,敬请关注: