我们之前了解的podman api
使用curl
工具进行交互,非常方便,其实podman
给我们提供了一套bindings
golang框架,供我们直接调用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
?