订阅内容

This one is just between you and me, don't tell anyone else! Promise? Okay, I have your word, so here goes: There's a brand new REST API that is included with version 2.0 of Podman! That release has just hit testing on the Fedora Project and may have reached stable by the time this post is published. With this new REST API, you can call Podman from platforms such as cURL, Postman, Google's Advanced REST client, and many others. I'm going to describe how to begin using this new API.

The Podman service only runs on Linux. You must do some setup on Linux to get things going.

Install Podman v2.0

First, install Podman v2.0 or later. Currently, you can do that on Fedora with a call such as dnf -y install --enablerepo updates-testing podman, or you can clone Podman from GitHub and then use the Building from scratch instructions near the end of this page.

Set up the REST API

Once Podman v2.0 is installed on your machine, it's time to check out the REST API documentation on docs.podman.io. At the top of this REST document are instructions to set up the REST API service on your Linux server for testing. Here is a look at the command:

# podman system service -t 5000 &

Phew, that was a lot of heavy lifting!

Seriously, it's just that simple. With this command, the service stays up and running for 5000 seconds, and it starts accepting requests. Note that the 5000 seconds uptime is refreshed after every command is received. If you want the service to stay up until the machine goes down or the process is killed, use 0 (zero) instead of 5000. You can do so with this command:

# podman system service -t 0 &

Gather Podman information

Let's take a quick look at a few commands to use against the server now that it's running. First, let's query Podman for its information, and then pipe the results through jq, a command-line JSON processor that's available in most Linux distributions. A quick warning: jq formats the JSON file in a very digestible format, but it can hide errors if they pop up. Let's leverage d in the below curl command to query the Unix domain socket set up when the service was started:

# curl -s --unix-socket /run/podman/podman.sock http://d/v1.0.0/libpod/info | jq
{
 
"host": {
           "arch": "amd64",
           "buildahVersion": "1.15.0",
           "cgroupVersion": "v1",
           "conmon": {
           "package": "Unknown",
           "path": "/usr/local/libexec/podman/conmon",
           "version": "conmon version 2.0.3-dev, commit: 002da2522941fde456f5213c8a5a96c9836c2592"
           },
           "cpus": 1,
           "distribution": {
           "distribution": "fedora",
           "version": "30"
           },
… (removed a number of lines for brevity)
 
"version": {
           "APIVersion": 1,
           "Version": "2.1.0-dev",
           "GoVersion": "go1.13.12",
           "GitCommit": "0e4b73456d4c545136a5cfd664b6d9d819ffc498",
           "BuiltTime": "Sun Jun 21 14:07:25 2020",
           "Built": 1592762845,
           "OsArch": "linux/amd64"
  }
}

This output displays the information about the Podman installation on the Linux server where the REST API service is running.

Next, let's try a couple of small tasks with a little more oomph. Let's pull an image, and then let's list it.

First, we'll pull the Podman image from quay.io. This step could take a few seconds to process. For those new to encoded URL arguments, the %2f below is an escaped forward slash /:

# curl -XPOST --unix-socket /run/podman/podman.sock -v 'http://d/v1.0.0/images/create?fromImage=quay.io%2Fcontainers%2Fpodman'
*  
Trying /run/podman/podman.sock:0...
* Connected to d (/run/podman/podman.sock) port 80 (#0)
> POST /v1.0.0/images/create?fromImage=quay.io%2Fcontainers%2Fpodman HTTP/1.1
> Host: d
> User-Agent: curl/7.65.3
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Sun, 21 Jun 2020 19:13:19 GMT
< Content-Length: 185
< 
{"status":"pulling image () from quay.io/containers/podman:latest","error":"","progress":"","progressDetail":{},"id":"5a9a0e9623e33dec906d8d38908d0681cee1e09fbdf282fa65fe8dfb878ab943"}
* Connection #0 to host d left intact

Now that we’ve an image pulled down, let’s examine it:

# curl --unix-socket /run/podman/podman.sock -v 'http://d/v1.0.0/libpod/images/json' | jq
*  
Trying /run/podman/podman.sock:0...
  % Total         % Received % Xferd  Average Speed   Time           Time   Time 
Current
                                   Dload 
Upload   Total   Spent Left 
Speed
  0       0         0         0         0         0 
       0         0 --:--:-- --:--:-- --:--:--  0* Connected to d (/run/podman/podman.sock) port 80 (#0)
> GET /v1.0.0/libpod/images/json HTTP/1.1
> Host: d
> User-Agent: curl/7.65.3
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json
< Date: Sun, 21 Jun 2020 19:16:51 GMT
< Transfer-Encoding: chunked
< 
{ [3980 bytes data]
100  5871       0 
5871           0         0 
38625         0 --:--:-- --:--:-- --:--:-- 39668
* Connection #0 to host d left intact
[
  {
           "Id": "eb7134a03cd6bd8a3de99c16cf174d66ad2d93724bac3307795efcd8aaf914c5",
           "RepoTags": [
           "registry.fedoraproject.org/fedora:32",
           "registry.fedoraproject.org/fedora:latest"
           ],
           "Created": "2020-05-15T06:48:40Z",
           "Size": 207772777,
           "Labels": {
           "license": "MIT",
           "name": "fedora",
           "vendor": "Fedora Project",
           "version": "32"
           },
           "Containers": 1,
           "Names": [
           "registry.fedoraproject.org/fedora:32",
           "registry.fedoraproject.org/fedora:latest"
           ],
… (removed a number of lines for brevity)
           "Names": [
           "quay.io/containers/podman:latest"
           ],
           "Digest": "sha256:1af265e9e85af5d7a4f626c65b136d4eb610b5c7f84873a05e103e91352d6387",
           "Digests": [
           "sha256:1af265e9e85af5d7a4f626c65b136d4eb610b5c7f84873a05e103e91352d6387"
           ],
           "History": [
           "5a9a0e9623e33dec906d8d38908d0681cee1e09fbdf282fa65fe8dfb878ab943",
           "<missing>",
           "<missing>",
           "<missing>",
           "<missing>",
           "eb7134a03cd6bd8a3de99c16cf174d66ad2d93724bac3307795efcd8aaf914c5"
           ]
  }
]

That's it!

It's just that easy to get the REST API service running. You're ready to pull images, create containers, and do any other needed Podman operation. You can also call the service directly through the podman --remote option, or include Podman calls in your Go programs by using the Go bindings. Details on all of that are coming soon.

Wrap up

Granted, in this introduction, I showed only a very small section of the available commands and ways to call the REST API. There's work underway to create a more in-depth blog. In the meantime, the available commands are documented in the Podman API Documentation for your use. The main takeaway today is that if you can do it from Podman's command line, you should be able to do it using this new REST API, too.

Now, remember, this is our little secret!

[ Getting started with containers? Check out this free course. Deploying containerized applications: A technical overview. ]


关于作者

Software engineer at Red Hat working on containers focusing on the Buildah and Podman projects. Manages the buildah.io and podman.io websites and can be found on freenode at #buildah and #podman. Joined the Open Source world in 2016 and wished he'd joined the community sooner. Husband and dad of 3 just trying to contain them, but has better luck containing bits and bytes with containers. When it's time to do some serious coding, it's time to crank the Bluegrass in the headphones and get the tea brewing!

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

按频道浏览

automation icon

自动化

有关技术、团队和环境 IT 自动化的最新信息

AI icon

人工智能

平台更新使客户可以在任何地方运行人工智能工作负载

open hybrid cloud icon

开放混合云

了解我们如何利用混合云构建更灵活的未来

security icon

安全防护

有关我们如何跨环境和技术减少风险的最新信息

edge icon

边缘计算

简化边缘运维的平台更新

Infrastructure icon

基础架构

全球领先企业 Linux 平台的最新动态

application development icon

应用领域

我们针对最严峻的应用挑战的解决方案

Original series icon

原创节目

关于企业技术领域的创客和领导者们有趣的故事