Podman基础

红帽推荐的系统版本容器 官网: https://podman.io/

nerdctl 与containerd 的架构关系 containerd和podman_容器

与docker命令和运行是相像的

但是内部不一样

docker 运行的时候需要通过一个守护进程进行传输才会生成容器 后台: daemon,它在linux中需要以root运行,dockerd调用containerd,containerd调用containerd-shim,然后才能调用runC。顾名思义shim起的作用也就是“垫片”,避免父进程退出影响容器的运行

podman 则是直接与容器进行对话,并且不需要在root权限下运行(普通用户) podman与docker命令差不多,参数有少许区别

podman直接调用OCI,runtime(runC)运行的整体,通过common作为容器进程的管理工具,但不需要dockerd这种以root身份运行的守护进程。 在podman体系中,有个称之为common的守护进程,其运行路径通常是/usr/libexec/podman/conmon,它是各个容器进程的父进程,每个容器各有一个,common的父则通常是1号进程。podman中的common其实相当于docker体系中的containerd-shim

运行对比方式:

nerdctl 与containerd 的架构关系 containerd和podman_docker_02

图中所体现的事情是,podman不需要守护进程,而dorker需要守护进程。

在这个图的示意中,dorcker的containerd-shim与podman的common被归在Container一层。

Podman的使用与docker有什么区别?

podman的定位也是与docker兼容,因此在使用上面尽量靠近docker。在使用方面,可以分成两个方面来说,一是系统构建者的角度,二是使用者的角度。

在系统构建者方面,用podman的默认软件,与docker的区别不大,只是在进程模型、进程关系方面有所区别。如果习惯了docker几个关联进程的调试方法,在podman中则需要适应。可以通过pstree命令查看进程的树状结构。总体来看,podman比docker要简单。由于podman比docker少了一层daemon,因此重启的机制也就不同了。

在使用者方面,podman与docker的命令基本兼容,都包括容器运行时(run/start/kill/ps/inspect),本地镜像(images/rmi/build)、镜像仓库(login/pull/push)等几个方面。因此podman的命令行工具与docker类似,比如构建镜像、启停容器等。甚至可以通过alias

docker=podman可以进行替换。因此,即便使用了podman,仍然可以使用http://docker.io作为镜像仓库,这也是兼容性最关键的部分。

下载podman

网络源环境的话最好使用阿里云官网centos8镜像

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
CentOS-Base.repo
[root@localhost ~]#yum -y module install container-tools

配置镜像加速器

[root@localhost ~]# vi /etc/containers/registries.conf
       ##unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"]
//注释掉

添加如下几行
unqualified-search-registries = ["docker.io"]

[[registry]]
location = "3bufl9dc.mirror.aliyuncs.com"

//拉取官方源镜像

[root@localhost yum.repos.d]# podman pull centos
Resolved "centos" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull quay.io/centos/centos:latest...
Getting image source signatures
Copying blob 7a0437f04f83 done  
Copying config 300e315adb done  
Writing manifest to image destination
Storing signatures
300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
[root@localhost ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
docker.io/library/busybox  latest      beae173ccac6  7 months ago  1.46 MB
docker.io/library/httpd    latest      dabbfbe0c57b  7 months ago  148 MB

这里需要进入官方镜像仓库才能拉取

nerdctl 与containerd 的架构关系 containerd和podman_运维_03

测试拉取私人镜像

[root@localhost ~]# podman pull servicestt/l1:v0.1                //这里可以默认直接拉取
Resolving "servicestt/l1" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/servicestt/l1:v0.1...
Getting image source signatures
Copying blob 5cc84ad355aa skipped: already exists  
Copying blob 4c31813773a8 done  
Copying config d71dd4dae3 done  
Writing manifest to image destination
Storing signatures
d71dd4dae383f9d8b175ed36a092cf16a01ff0694a6e5786dafad8cc18207765

推送镜像

认证权限

[root@localhost ~]# podman login docker.io
Username: servicestt
Password: 
Login Succeeded!
[root@localhost ~]# podman push docker.io/servicestt/l1:v0.2
Getting image source signatures
Copying blob 1da636a1aa95 done  
Copying blob 15e4bf5d0804 done  
Copying blob 9cff3206f9a6 done  
Copying blob 2edcec3590a4 done  
Copying blob deefaa620a71 done  
Copying config dabbfbe0c5 done  
Writing manifest to image destination
Storing signatures

可以查出多了个v0.2版本镜像

nerdctl 与containerd 的架构关系 containerd和podman_守护进程_04

删除本地镜像 从仓库中拉取私人镜像

[root@localhost ~]# podman rmi docker.io/servicestt/l1:v0.2 
Untagged: docker.io/servicestt/l1:v0.2
[root@localhost ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
[root@localhost ~]# podman pull servicestt/l1:v0.2
Resolving "servicestt/l1" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/servicestt/l1:v0.2...
Getting image source signatures
Copying blob ef7255fe9b30 skipped: already exists  
Copying blob 7a8dc8979745 skipped: already exists  
Copying blob 2fa2d6f8d839 skipped: already exists  
Copying blob bc6acb54c865 skipped: already exists  
Copying blob 441b03d7d03a [--------------------------------------] 0.0b / 0.0b
Copying config dabbfbe0c5 done  
Writing manifest to image destination
Storing signatures
dabbfbe0c57b6e5cd4bc089818d3f664acfad496dc741c9a501e72d15e803b34
[root@localhost ~]# podman images
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
docker.io/servicestt/l1    v0.2        dabbfbe0c57b  7 months ago  148 MB

扩展实验

运行容器印射一个80端口

[root@localhost ~]# podman run -dit --name web -p80:80 httpd 
fa2e3666428b9195e6c987cbd645bff7b2fee241f214e997e9769fe2943d6a40
[root@localhost ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS               NAMES
fa2e3666428b  docker.io/library/httpd:latest  httpd-foreground  8 seconds ago  Up 8 seconds ago  0.0.0.0:80->80/tcp  web
[root@localhost ~]# ss -antl
State   Recv-Q  Send-Q     Local Address:Port     Peer Address:Port  Process  
LISTEN  0       128              0.0.0.0:22            0.0.0.0:*              
LISTEN  0       128              0.0.0.0:80            0.0.0.0:*              
LISTEN  0       128                 [::]:22               [::]:*  
[root@localhost ~]# podman port web
80/tcp -> 0.0.0.0:80
 [root@localhost ~]# curl 192.168.47.137:80
<html><body><h1>It works!</h1></body></html>

查看详细信息

[root@localhost ~]# podman inspect web
[
    {
        "Id": "fa2e3666428b9195e6c987cbd645bff7b2fee241f214e997e9769fe2943d6a40",
        "Created": "2022-08-12T10:57:45.046714864+08:00",
        "Path": "httpd-foreground",
        "Args": [
            "httpd-foreground"
        ],
        "State": {
            "OciVersion": "1.0.2-dev",
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 17842,
            "ConmonPid": 17833,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-08-12T10:57:45.63847444+08:00",
            "FinishedAt": "0001-01-01T00:00:00Z",
            "Healthcheck": {
                "Status": "",

进入容器

[root@localhost ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED       STATUS           PORTS               NAMES
fa2e3666428b  docker.io/library/httpd:latest  httpd-foreground  11 hours ago  Up 11 hours ago  0.0.0.0:80->80/tcp  web
[root@localhost ~]# podman exec -it web /bin/bash
root@fa2e3666428b:/usr/local/apache2# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs	modules