podman go bindings v3 基础

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

我们之前了解的podman api使用curl工具进行交互,非常方便,其实podman给我们提供了一套bindingsgolang框架,供我们直接调用podman api,我们用这个框架依旧来实现查看podman api版本 以及 创建容器哈。

前提

go安装

需要安装go,若没有安装的,需要自行安装下,这里打印一下go版本

启动podman api服务

前面在介绍podman apicurl操作的时候已经过了,这里直接贴了哈

开启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 modgo tidy处理依赖

编译执行

go build -o juejinPdudoPodmanShowVersions

./juejinPdudoPodmanShowVersions

代码逻辑讲解

连接podman api

我们使用conn, err := bindings.NewConnection(context.Background(), "tcp://juejinpdudopodman.com:8888")来返回一个Content

我们如上文提到,podman api连接方式有2种,分别是 unix sockettcp, 而 bindings代码提供了第三种(其实还是unix socket),那就是 ssh

我们把代码切进去就能看到

如上所述的三种连接方式(其实只有2种,tcpsocket)

获取连接后,再将其赋值给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

posted @ 2022-04-19 16:42  pdudos  阅读(0)  评论(0编辑  收藏  举报  来源