如何使用Podman和Libpod运行Docker容器

时间:2020-02-23 14:31:50  来源:igfitidea点击:

Docker CLI如何工作

Docker CLI是一种客户端/服务器操作,当它想要创建或者操纵容器的操作时,Docker CLI与Docker引擎进行通信。
这种客户端/服务器架构可能会导致生产中的问题,因为其中之一,我们必须在Docker CLI生效之前启动Docker守护程序。
然后,Docker CLI将API调用发送到Docker引擎,以启动Open Container Initiative(OCI)容器运行时,在大多数情况下为runc,以启动容器(projectatomic.io)。
这意味着启动的容器是Docker Engine的子进程。

什么是Podman?

那么Podman是什么?
Podman是一个无守护进程的容器引擎,用于在Linux系统上开发,管理和运行OCI容器。

Docker与Podman

Docker和Podman之间的主要区别是Podman中没有守护程序。
它也使用容器运行时,例如runc,但是启动的容器是podman进程的直接后代。
这种体系结构具有以下优点:应用的Cgroup或者安全性约束仍然控制着容器:无论我们对podman命令应用的cgroup约束是什么,启动的容器都将直接接收那些相同的约束。
systemd的高级功能可以使用此模型:可以通过将podman放入systemd单位文件中并由此实现更多功能来完成。

Libpod呢?

我们一定已经在本教程的标题上看到了Libpod。
Libpod只是为希望使用Container Pod概念的应用程序提供了一个库,该概念已由Kubernetes普及。
它允许其他工具来管理容器/容器(projectatomic.io)。
Podman是使用此库的默认CLI工具。
还有其他两个重要的库使Podman成为可能:容器/存储-该库允许一个使用运行容器所需的写时复制(COW)文件系统。
容器/图像-该库允许一个下载和安装来自Docker.io,Quay和Artifactory等容器注册表的基于OCI的容器镜像,以及许多其他(projectatomic.io)的容器图像。
这两个库是从头开始构建的,以支持多个独立的进程来与同一库进行交互时间。
一个很好的例子是,我们可以使用CRI-O运行完整的Kubernetes环境,使用Buildah构建容器镜像,并同时使用Podman管理容器和Pod(projectatomic.io)。
这带来了Unix命令的精髓,它们可以很好地完成"一件事"。
Docker无法实现这样的工具组合。

在CentOS/Fedora/Ubuntu上安装Podman

让我们看一下如何在CentOS和Fedora中安装Podman如何在CentOS 7和Fedora上安装Podman在CentOS 8/RHEL 8上安装Podman如果在Ubuntu上,请检查:如何在Ubuntu上安装Podman对于Debian,请使用:如何在Ubuntu上安装Podman德比安

管理容器镜像

使用Podman拉图像:

$podman pull ubuntu
$podman pull centos
$podman pull centos:8

要列出下载的图像,请使用以下命令:

$podman  images
REPOSITORY                 TAG      IMAGE ID       CREATED        SIZE
docker.io/library/ubuntu   latest   3556258649b2   2 weeks ago    66.6 MB
docker.io/library/alpine   latest   b7b28af77ffe   3 weeks ago    5.85 MB
docker.io/library/debian   latest   00bf7fdd8baf   4 weeks ago    119 MB
docker.io/library/centos   latest   9f38484d220f   4 months ago   209 MB

要删除图像,请使用-rmi选项,后跟图像名称/ID:

$podman rmi 00bf7fdd8baf
00bf7fdd8baf2ba6f0918e1f48415b2a4a1a616806e7cf32527a749dd2ce4b2c
$podman rmi docker.io/library/ubuntu
3556258649b2ef23a41812be17377d32f568ed9f45150a26466d2ea26d926c32

标记图像

我们可以将自定义名称添加到图像中,以使其更加直观并提醒我们图像在设置中的作用

# podman tag 7698f282e524 webserver
# podman images                    
 REPOSITORY                 TAG      IMAGE ID       CREATED       SIZE
 docker.io/library/ubuntu   latest   7698f282e524   4 weeks ago   72.3 MB
 localhost/webserver        latest   7698f282e524   4 weeks ago   72.3 MB

使用Podman运行容器

要使用可打印消息的Ubuntu镜像运行一个简单的容器,请使用:

# podman run --rm ubuntu /bin/echo "Computing for Geeks" 
Computing for Geeks

要在后台运行容器(分离模式),请使用-d选项。

podman run -dt -p 8080:8080/tcp -e HTTPD_VAR_RUN=/var/run/httpd -e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d \
                  -e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf \
                  -e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/\
                  registry.fedoraproject.org/f29/httpd /usr/bin/run-httpd

这将返回容器ID:

Trying to pull registry.fedoraproject.org/f29/httpd...Getting image source signatures
Copying blob d77ff9f653ce done
Copying blob aaf5ad2e1aa3 done
Copying blob 7692efc5f81c done
Copying config 25c76f9dcd done
Writing manifest to image destination
Storing signatures
d2cdf0efb0ddc6e2ae52a5a0bdadababa6ee6cc2e1e49145c92a0474b089b664

列出正在运行的容器Podman ps命令用于列出创建和正在运行的容器。

$podman ps
CONTAINER ID  IMAGE                                        COMMAND               CREATED        STATUS            PORTS                   NAMES
d2cdf0efb0dd  registry.fedoraproject.org/f29/httpd:latest  container-entrypo...  4 minutes ago  Up 4 minutes ago  0.0.0.0:8080->8080/tcp  cranky_borg
# To include stopped/exited containers, use:
$podman ps --all

在容器中运行shell要访问容器shell,请使用-it选项:

# podman run -it ubuntu bash
Hyman@theitroad:/#
Hyman@theitroad:/# apt update
 Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
 Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]          
 Get:3 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [717 kB]
 Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]        
 Get:5 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [535 kB]
 Get:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]

在Podman中搜寻

$podman search httpd

检查容器

这将显示有关通过名称或者ID标识的容器和图像的低级信息。

# podman inspect 024a277cc474
[
    {
        "ID": "024a277cc4748ab48539c9ddea15d98c0e0bccc307506c44fbce12ec6c568dfc",
        "Created": "2019-06-14T10:58:07.764967058-04:00",
        "Path": "/bin/bash",
        "Args": [
            "/bin/bash"

查看更多用法:

$podman inspect --help

取出容器

首先列出所有正在运行的容器:

$podman ps -a
CONTAINER ID  IMAGE                            COMMAND               CREATED        STATUS                    PORTS  NAMES
 024a277cc474  docker.io/library/ubuntu:latest  /bin/bash             3 minutes ago  Exited (0) 3 minutes ago         laughing_blackwell
 cf4267fb7a2b  docker.io/library/ubuntu:latest  bash                  4 hours ago    Exited (0) 2 hours ago           nostalgic_archimedes
 b800dd64ba11  docker.io/library/ubuntu:latest  /bin/bash             4 hours ago    Exited (0) 4 hours ago           optimistic_hypatia

要删除单个正在运行的容器,请使用podman rm命令,后跟容器ID:

$podman rm 024a277cc474
024a277cc4748ab48539c9ddea15d98c0e0bccc307506c44fbce12ec6c568dfc

要删除所有已运行和已停止使用的容器,请执行以下操作:

podman rm $(podman ps -a -q)

查看容器的日志

我们也可以使用Podman查看容器的日志:

$podman logs --latest

我们还可以指定容器ID:

$podman ps
$podman logs d2cdf0efb0dd

要实时跟踪日志输出,请使用:

$podman logs -f  ContainerID
$podman logs --follow=true --since 10m ContainerID

仅显示日志中的最后10行:

$podman logs --tail 10 d2cdf0efb0dd

查看容器的PID

使用podman top查看容器的pid。

$podman top <container_id>

例子:

$podman top d2cdf0efb0dd
USER      PID   PPID   %CPU    ELAPSED            TTY     TIME   COMMAND
default   1     0      0.000   29m22.496484247s   pts/0   0s     httpd -D FOREGROUND 
default   22    1      0.000   29m21.496767511s   pts/0   0s     /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat 
default   23    1      0.000   29m21.496866314s   pts/0   0s     /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat 
default   24    1      0.000   29m21.497020539s   pts/0   0s     /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat 
default   25    1      0.000   29m21.497127237s   pts/0   0s     /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat 
default   26    1      0.000   29m21.49723933s    pts/0   0s     httpd -D FOREGROUND 
default   27    1      0.000   29m21.497361006s   pts/0   0s     httpd -D FOREGROUND 
default   28    1      0.000   29m21.497459891s   pts/0   0s     httpd -D FOREGROUND 
default   29    1      0.000   29m21.497552695s   pts/0   0s     httpd -D FOREGROUND

检查容器

对容器进行检查点将容器停止,同时将容器中所有进程的状态写入磁盘。
此功能需要在系统上安装CRIU 3.11或者更高版本。
请参阅CRIU安装。

podman container checkpoint <container_id>

例子:

$podman container checkpoint d2cdf0efb0dd

以后可以还原容器,并在与检查点完全相同的时间点继续运行。

podman container restore <container_id>

迁移容器

首先在源系统上检查容器:

podman container checkpoint <container_id> -e /tmp/checkpoint.tar.gz

将其复制到目标服务器:

scp /tmp/checkpoint.tar.gz <destination_system>:/tmp

在目标系统上,还原容器:

podman container restore -i /tmp/checkpoint.tar.gz

使用Podman管理容器Pod

Podman豆荚类似于Kubernetes豆荚的概念

与pod的大多数交互都是通过podman pod命令公开的:

$podman pod --help
NAME:
   podman pod - Manage container pods.
Pods are a group of one or more containers sharing the same network, pid and ipc namespaces.
USAGE:
   podman pod command [command options] [arguments...]
COMMANDS:
     create        Create a new empty pod
     exists        Check if a pod exists in local storage
     inspect       displays a pod configuration
     kill          Send the specified signal or SIGKILL to containers in pod
     pause         Pause one or more pods
     ps, ls, list  List pods
     restart       Restart one or more pods
     rm            Remove one or more pods
     start         Start one or more pods
     stats         Display percentage of CPU, memory, network I/O, block I/O and PIDs for containers in one or more pods
     stop          Stop one or more pods
     top           Display the running processes of containers in a pod
     unpause       Unpause one or more pods
OPTIONS:
   --help, -h  show help

下面的示例将创建一个名为web的pod。

$podman pod create --name web
0f565b11e9cb3736dc15b46f3361305e351ce556818e342a9fdf799ea4edf7ca

这将创建一个Pod,其中不包含以下可用的额外属性:

$podman pod create --help

确认Pod创建

$podman pod list
POD ID         NAME   STATUS    CREATED              # OF CONTAINERS   INFRA ID
0f565b11e9cb   web    Running   About a minute ago   1                 44cca777d12f

默认情况下,创建的Pod将具有一个名为infra的容器。
红外线容器处于睡眠模式,其目的是保留与容器关联的名称空间,以允许容器管理员将其他容器连接到容器:

$podman ps -a --pod 
CONTAINER ID  IMAGE                 COMMAND  CREATED         STATUS             PORTS  NAMES               POD
44cca777d12f  k8s.gcr.io/pause:3.1           23 minutes ago  Up 23 minutes ago         0f565b11e9cb-infra  0f565b11e9cb

现在已经创建了容器,我们可以向其添加一个容器:

podman run -dt --pod web alpine:latest top

我们现在应该看到豆荚有两个容器

$podman ps -a --pod 
CONTAINER ID  IMAGE                            COMMAND  CREATED             STATUS                 PORTS  NAMES               POD
36ccace2d653  docker.io/library/alpine:latest  top      About a minute ago  Up About a minute ago         zen_hugle           0f565b11e9cb
44cca777d12f  k8s.gcr.io/pause:3.1                      28 minutes ago      Up 28 minutes ago             0f565b11e9cb-infra  0f565b11e9cb

这样,我们将创建一个容器并公开一个端口-端口绑定所需的根目录。

sudo podman pod create -p 8080:80 --name web1
sudo podman run -dt --pod web1 -p 8080 nginx:latest

请注意,我们需要发布与Pod创建期间将使用的端口一样多的端口。
创建后无法更改。