针对podman REST API 的curl调用-2

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

昨天已经使用了利用curl工具 与 podman restful 服务器交互,非常有趣吧,这次我们继续来看curl工具调用podman restful并且与之交互。

我们之前已经学习了,如何启动podman apipodman api监控检查 、 查看podman api服务器信息 以及 查看podman images。我将代码上传到了该shell小工具也上传到了gitee哈,代码并同步更新。

我们本次继续来讲述podman rest api shell操作,我们来看一下容器的周期,我们大概会按照如下进程来介绍podman api shell的调用: 拉取镜像、创建容器、启动容器 、列出容器、停止容器、删除容器、删除镜像

还是和之前一致,我们先使用命令大致过一次操作,然后再丰富我们的shell小工具

在操作命令之前,我们先看podman api是否存活

命令: curl -s http://127.0.0.1:8881/v3.0.0/libpod/_ping

我们先将podman实验环境的的容器 和 镜像全部删除,并且查看

命令:

podman images

podman ps -a

命令操作

拉取镜像

我们通常拉取镜像,默认有如下几种源

当我们选择某个源后,该记录会记录到/var/cache/containers/short-name-aliases.conf文件中,以便后续拉取镜像时,不会出现交互选择。

大概内容是这样的,容器名称="仓库"

拉取镜像url: images/pull

协议: POST

核心参数: reference

例如

我们想拉取busybox镜像

curl -XPOST http://127.0.0.1:8881/v3.0.0/libpod/images/pull?reference='docker.io/library/busybox:latest'

查看镜像

再拉一个nginx 镜像

创建容器

在创建容器的过程中,我发现 使用 tcppodman进行通信的时候,会出现问题,比如 端口映射不成功,搞了好久。。。最后使用socket去尝试一下,又可以了,,,靠,还是有坑呀,这个还有待验证,所以,我们采取socket进行通信

我们使用containers/create来创建容器,配置非常多,本次就演示创建一个最简单的容器,启动一个nginx,并且将端口 9982 映射进容器中

检查宿主机端口9982

创建待会要Postjson文件postFiles.json

内容为

{
  "Image": "docker.io/library/nginx",
  "ExposedPorts": {
    "80/tcp": {}
  },
  "HostConfig": {
    "PortBindings": {
      "80/tcp": [
        {
          "HostIp": "",
          "HostPort": "9982"
        }
      ]
    }
  }
}
复制代码

使用命令curl -X POST -H 'Content-Type: application/json' -d @postFiles.json --unix-socket /tmp/podman.sock http://d/containers/create来启动容器

curl参数简介

  • -X: 指定请求方式,这里为 POST
  • -H: 指定header , 这里为 Content-Type: application/json
  • -d: 这里指的是上传的数据格式
  • @: 这里指的是从文件中上传,后面跟着文件即可

利用podman来看一下容器的信息

命令: podman ps -a

可以发现已经创建成功了,只不过状态是 Created而言

列出容器

我们使用/containers/json?all=true来查看全部容器

  • all=true 为列出所有容器

那我们来查看一下容器

命令: curl -s --unix-socket /tmp/podman.sock http://d/containers/json?all=true | jq

启动容器

我们使用containers/[name]/start来启动容器

例如,我们启动 frosty_goodall 容器

我们使用podman ps查看一下

可以看到,容器已经启动了

我们使用curl访问一下看看是否正常返回nginx信息呢?

发现正常,赞。

停止容器

和【启动容器】类似,使用url: containers/[name]/stop来停止容器

我们尝试下

命令: curl -X POST -s --unix-socket /tmp/podman.sock http://d/containers/frosty_goodall/stop

再使用podman查看一下容器

发现容器已经停止掉了

删除容器

删除容器使用的请求方式为DELETE

url: containers/容器名称

命令: curl -X DELETE -s --unix-socket /tmp/podman.sock http://d/containers/frosty_goodall

我们再次使用podman查看一下容器列表

删除镜像

镜像删除和【容器删除类型】,也是使用 DELETE请求方式

我们查看一下images

我们删除一下docker.io/library/busybox

命令: curl -X DELETE -s --unix-socket /tmp/podman.sock http://d/images/docker.io/library/busybox

我们使用podman images来查看一下镜像

发现果然被删除了

问题和总结

本来还想继续完善podman api shell小工具的

结果遇到问题了,我来描述一下问题吧

我们之前介绍过,podman api有2种调用方式,其一就是使用 tcp ,其二就是使用unix socket,但是当今天在使用tcp时候去创建容器的时候有问题

我来模拟一下

操作系统环境

podman版本

我们启动podman api``tcp

命令: podman --log-level=debug system service -t0 tcp:127.0.0.1:8881

检测api是否正常

发现正常

我们使用上面的json配置来创建容器

创建好后,我们发现,端口映射没了。。。

我们使用podman api来启动容器

启动之后,发现端口映射,还是没有

之后就切换至 socket,然后再来创建容器,就可以了,就这玩意耽搁我一段时间

我也通过查询相关log,没有发现解决方案,后面脚本,再补充吧。

猜你喜欢

转载自juejin.im/post/7086397468455206926