podman go bindings v3 基础
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
我们之前了解的podman api使用curl工具进行交互,非常方便,其实podman给我们提供了一套bindingsgolang框架,供我们直接调用podman api,我们用这个框架依旧来实现查看podman api版本 以及 创建容器哈。
前提
go安装
需要安装go,若没有安装的,需要自行安装下,这里打印一下go版本
启动podman api服务
前面在介绍podman api的curl操作的时候已经过了,这里直接贴了哈
开启unix套接字
命令: podman --log-level=debug system service -t0 unix:///tmp/podman.sock
开启TCP套接字
若想对外网提供访问,可以写其他网卡的地址
命令: podman --log-level=debug system service -t0 tcp:127.0.0.1:8888
podman依赖库安装
不推荐使用windows执行下列代码,因为podman bindings v3版本内嵌了一些c代码,windows不仅要安装gcc还要安装各种依赖,很容易把人搞疲惫,所以推荐在linux下面安装库函数,并且编译执行代码,这样就没有什么问题了
yum install -y \
btrfs-progs-devel \
conmon \
containernetworking-plugins \
containers-common \
crun \
device-mapper-devel \
git \
glib2-devel \
glibc-devel \
glibc-static \
go \
golang-github-cpuguy83-md2man \
gpgme-devel \
iptables \
libassuan-devel \
libgpg-error-devel \
libseccomp-devel \
libselinux-devel \
make \
pkgconfig
利用podman bindings查看系统版本
代码实现
代码编写完毕后,使用go mod和go tidy处理依赖
编译执行
go build -o juejinPdudoPodmanShowVersions
./juejinPdudoPodmanShowVersions
代码逻辑讲解
连接podman api
我们使用conn, err := bindings.NewConnection(context.Background(), "tcp://juejinpdudopodman.com:8888")来返回一个Content
我们如上文提到,podman api连接方式有2种,分别是 unix socket和 tcp, 而 bindings代码提供了第三种(其实还是unix socket),那就是 ssh
我们把代码切进去就能看到
如上所述的三种连接方式(其实只有2种,
tcp和socket)
获取连接后,再将其赋值给context,_ping一下在进行返回
获取podman系统版本信息
我们切进system代码中
可以看到,其实获取版本也就这一条语句response, err := conn.DoRequest(nil, http.MethodGet, "/info", nil, nil),这个就是podman提供的路由,还记得我们之前玩podman api curl获取版本的信息么?
命令: curl -s http://juejinpdudopodman.com:8888/v3.0.0/libpod/info | jq '.version'
所以说,它两本质是一个东西
利用podman bindings创建容器
代码实现
使用 specgen.SpecGenerator 来存启动容器配置
使用containers.CreateWithSpec 来创建容器
编译执行
使用podman 查看容器
可以看到 使用代码运行的返回的ID 和 使用podman ps 查看的ID是一样的
代码逻辑讲解
我们创建容器的代码,其具体核心和查看版本类似,是调用podman api接口
核心语句为: response, err := conn.DoRequest(stringReader, http.MethodPost, "/containers/create", nil, nil)
我们看下在使用curl访问podman api的时候,我们是怎么做的呢
我们发现输出的都差不多--
总结
我们除了使用curl等客户端工具访问 podman api,我们还可以使用podman给我们提供的类似于bindings工具使用podman api,我们经过之前的学习,我们发现,其实通过go去调用该接口,要方便的多,毕竟,该工具把所有的结构体都给你列出来了。
我在项目中遇到的问题
podman项目之前的名称为libpod,但是在代码中,一直有问题,如果你使用的版本为2或者更早版本的,这个要注意下,需要改一下项目名称
我们之前看curl调用podman api接口的时候,版本号是没有关系的,只要是v开头,就可以,但是在bindings中,版本号是严格区分了的,如果不严谨会报错,假如我们使用v4版本的bindings,我们看下
代码
执行
总而言之,如果我会go语言,并且让我选一个作为podman api工具的话,我会选择bindings工具,因为真的够简单。我的podman系列基础就学完咯。旨在抛砖引玉,后面看开一个什么坑?k8s?

浙公网安备 33010602011771号