podman go bindings v3 基础

简介: podman go bindings v3 基础

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



前提


go安装

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

image.png


启动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查看系统版本


代码实现

image.png

代码编写完毕后,使用go modgo tidy处理依赖



编译执行

go build -o juejinPdudoPodmanShowVersions

./juejinPdudoPodmanShowVersions

image.png



代码逻辑讲解


连接podman api


我们使用conn, err := bindings.NewConnection(context.Background(),

"tcp://juejinpdudopodman.com:8888")来返回一个Content


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


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

image.png


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

image.png


获取连接后,再将其赋值给context_ping一下在进行返回

image.png


获取podman系统版本信息

我们切进system代码中

image.png


可以看到,其实获取版本也就这一条语句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'

image.png

所以说,它两本质是一个东西



利用podman bindings创建容器


代码实现

image.png

使用 specgen.SpecGenerator 来存启动容器配置

使用containers.CreateWithSpec 来创建容器



编译执行

image.png


使用podman 查看容器

可以看到 使用代码运行的返回的ID 和 使用podman ps 查看的ID是一样的

image.png


代码逻辑讲解


我们创建容器的代码,其具体核心和查看版本类似,是调用podman api接口

核心语句为: response, err := conn.DoRequest(stringReader, http.MethodPost, "/containers/create", nil, nil)


image.png


我们看下在使用curl访问podman api的时候,我们是怎么做的呢


image.png

我们发现输出的都差不多--



总结


我们除了使用curl等客户端工具访问 podman api,我们还可以使用podman给我们提供的类似于bindings工具使用podman api,我们经过之前的学习,我们发现,其实通过go去调用该接口,要方便的多,毕竟,该工具把所有的结构体都给你列出来了。


我在项目中遇到的问题


podman项目之前的名称为libpod,但是在代码中,一直有问题,如果你使用的版本为2或者更早版本的,这个要注意下,需要改一下项目名称


我们之前看curl调用podman api接口的时候,版本号是没有关系的,只要是v开头,就可以,但是在bindings中,版本号是严格区分了的,如果不严谨会报错,假如我们使用v4版本的bindings,我们看下


代码

image.png



执行

image.png

总而言之,如果我会go语言,并且让我选一个作为podman api工具的话,我会选择bindings工具,因为真的够简单。我的podman系列基础就学完咯。旨在抛砖引玉,后面看开一个什么坑?k8s




相关文章
|
2月前
|
Go API 开发工具
Go etcd 的依赖问题终于解决了。。。
Go etcd 的依赖问题终于解决了。。。
|
2月前
|
Go
go build与go install的区别
go build与go install的区别
go build与go install的区别
|
2月前
|
Ubuntu Go Docker
[go]封装go的docker镜像
[go]封装go的docker镜像
|
5月前
|
Shell Linux Go
酷玩Go命令行工具—Cobra
酷玩Go命令行工具—Cobra
86 0
|
Go Docker 容器
Docker运行gin项目(go mod)
Docker运行gin项目(go mod)
618 0
Docker运行gin项目(go mod)
|
应用服务中间件 Go 开发工具
【go 语言】使用私有仓库的 go module
【go 语言】使用私有仓库的 go module
465 0
【go 语言】使用私有仓库的 go module
|
安全 Go Docker
如何 Docker 化一个 GO 应用程序
使用 Golang,可以构建小到简单的可执行工具大到完整的 Web 服务器的任何东西。为了交付应用程序,使用 Docker 是首选,它允许我们创建一个包含项目运行所需的一切的自包含环境。值得一提的是,Docker 命令行界面本身也是使用 GO 所开发。
188 0
|
Java Linux Go
知识分享之Golang——go mod常用命令解析
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
165 0
知识分享之Golang——go mod常用命令解析
|
Java Linux Go
知识分享之Golang——go get 常用命令
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
253 0
知识分享之Golang——go get 常用命令