如何使用Podman和Libpod运行Docker容器
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创建期间将使用的端口一样多的端口。
创建后无法更改。