Portainer 是一个比较流行的Docker web ui, Docker 官方只针对Windows/Mac 有GUI支持,对于Linux则靠民间的UI了。

事实上,Portainer 应该是仅存的少数 功能较完善且开发活跃的第三方 Docker UI之一.

另一个WEB UI 是RedHat 家的 cockpit (准确来说,应该叫Redhat赞助的, 不过老灯感觉区别不大), 除了管理docker容器,cockpit还支持 podman和虚拟机管理,磁盘管理等其它功能,因此它是一个dashboard, 而不是单纯的容器管理UI.

关于对podman的支持,Github早有讨论, 见 https://github.com/portainer/portainer/issues/2991

一开始, Podman 用了一个偏门的叫varlink的协议,后面还是考虑了民间的需求,推出了 Docker compatible API for Podman

https://podman.io/blogs/2020/06/29/podman-v2-announce.html

In keeping with Podman’s history the restful API will work in both rootless and rootfull mode. If you run in rootfull mode, the podman service will listen on /run/podman/podman.sock and rootless is $XDG_RUNTIME_DIR/podman/podman.sock (for example: /run/user/1000/podman/podman.sock). If you install the podman-docker package, the package will set up a link between /run/docker/docker.sock and /run/podman/podman.sock.

根据 Portainer作者的回答:

As Podman is Docker API 1.40 compliant, when we release Portainer CE 2.1, which will itself support the latest Docker API (currently we only support an older API ver), we are hopeful this will work.

作者的意思: 当前 2.0 版本的Portainer 只支持比较老的Docker Restful API, 要 2.1 才会支持 Docker API 1.40

Portainer 不会支持 Podman, 只会支持兼容Docker API 的东西。

也就是说, Podman 的API 如果和 Docker 的不兼容,Portainer 就可能不能正常工作.

如今 2.1.1 版本的 Portainer 已经发布了,于是老灯尝试了一下Portainer 对于 Podman 的支持.

以下仅讨论Root模式,Rootless模式由于坑太多,不太建议尝试。

首先,启用Podman restful API daemon:

sudo systemctl enable --now podman.socket

测试一下:

$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
OK

❯ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/podman/podman.sock http://localhost/_ping
OK

部署Portainer

根据官方文档https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/

sudo podman volume create portainer_data

# 注意,这里我映射到了9001端口,因为9000已经给Docker的Portainer使用了.
# 8000也是常用端口,不应该给Portainer占用了,因此这里我用的8041
sudo podman run -d -p 8041:8000 -p 9001:9000 --name=portainer \
-v /var/run/podman/podman.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer-ce

注意这里的sock路径我特意用的/var/run/podman/podman.sock.

执行成功后,打开 http://localhost:9001/, 然后发现有个错误: Failure: Unable to proxy the request via the Docker socket

打开浏览器控制台查看了下,以下为错误原因:

GET /api/endpoints/2/docker/networks

500 Internal Server Error

{
"message":"Unable to proxy the request via the Docker socket",
"details":"unable to find bridge plugin"
}

还有一个404错误:

GET /api/endpoints/2/docker/plugins

{"cause":"","message":"Path /plugins is not supported","response":0}

大概体验了一下,网络管理不可用,image, container 和 volume 列表显示OK. 删除功能OK.

无法查看container log, 无法进入console. 因此,目前来说,这个还达不到基本的可用标准。

很多基本功能不工作。

portainer-podman-host-overview.png

Podman 版本信息:

Version:      2.2.1
API Version:  2.1.0
Go Version:   go1.15.5
Git Commit:   a0d478edea7f775b7ce32f8eb1a01e75374486cb
Built:        Thu Dec 10 03:08:37 2020
OS/Arch:      linux/amd64

refs

https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/