文章目录
什么是Podman?
Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。正如前面提到的那样,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。
Podman 可以管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。
Podman 官网地址:https://podman.io/
Podman和Docker的主要区别是什么?
dockers在实现CRI的时候,它需要一个守护进程,其次需要以root运行,因此这也带来了安全隐患。
podman不需要守护程序,也不需要root用户运行,从逻辑架构上,比docker更加合理。
在docker的运行体系中,需要多个daemon才能调用到OCI的实现RunC。
在容器管理的链路中,Docker Engine的实现就是dockerd
daemon,它在linux中需要以root运行,dockerd调用containerd,containerd调用containerd-shim,然后才能调用runC。顾名思义shim起的作用也就是“垫片”,避免父进程退出影响容器的运训
podman直接调用OCI,runtime(runC),通过common作为容器进程的管理工具,但不需要dockerd这种以root身份运行的守护进程。
在podman体系中,有个称之为common的守护进程,其运行路径通常是/usr/libexec/podman/conmon,它是各个容器进程的父进程,每个容器各有一个,common的父则通常是1号进程。podman中的common其实相当于docker体系中的containerd-shim。
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安装和基础命令
安装podman
可以不用安装yum源,因为当前yum源版本有podman,但是我这边安装的镜像是不一样的所以还得弄几个命令修改一下才能使用
[root@192 ~]# ls /etc/yum.repos.d/
CentOS-Linux-AppStream.repo CentOS-Linux-FastTrack.repo
CentOS-Linux-BaseOS.repo CentOS-Linux-HighAvailability.repo
CentOS-Linux-ContinuousRelease.repo CentOS-Linux-Media.repo
CentOS-Linux-Debuginfo.repo CentOS-Linux-Plus.repo
CentOS-Linux-Devel.repo CentOS-Linux-PowerTools.repo
CentOS-Linux-Extras.repo CentOS-Linux-Sources.repo
修改 centos 文件内容
[root@192 ~]# dnf list all |grep podman
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
[root@192 ~]# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
[root@192 ~]# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
生成缓存更新(第一次更新,速度稍微有点慢,耐心等待两分钟左右)
[root@192 ~]# yum makecache
CentOS Linux 8 - AppStream 3.0 MB/s | 8.4 MB 00:02
CentOS Linux 8 - BaseOS 2.2 MB/s | 4.6 MB 00:02
CentOS Linux 8 - Extras 16 kB/s | 10 kB 00:00
Metadata cache created.
运行 yum update 升级
[root@192 ~]# yum update -y
安装podman
[root@192 ~]# dnf -y install podman-docker
查看有没有包,并看看能不能使用
[root@192 ~]# which podman
/usr/bin/podman
[root@192 ~]# which docker
/usr/bin/docker
[root@192 ~]# rpm -qa |grep docker
podman-docker-3.3.1-9.module_el8.5.0+988+b1f0b741.noarch
[root@192 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
配置一个加速器,这边用的是阿里云的
[root@192 ~]# cd /etc/containers/
[root@192 containers]# ls
certs.d policy.json registries.conf.d storage.conf
oci registries.conf registries.d
[root@192 containers]# vim registries.conf
unqualified-search-registries = ["registry.fedoraproject.org", "registry
.access.redhat.com", "registry.centos.org", "docker.io"]
[[registry]]
prefix = "docker.io"
location = "6e5o0ntr.mirror.aliyuncs.com"
# # The "prefix" field is used to choose the relevant [[registry]] TOML
table;
拉取一个镜像
[root@192 ~]# podman pull busybox
Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 50783e0dfb64 done
Copying config 7a80323521 done
Writing manifest to image destination
Storing signatures
7a80323521ccd4c2b4b423fa6e38e5cea156600f40cd855e464cc52a321a24dd
[root@192 ~]# 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@192 ~]#
明确指定在哪个网站拉取镜像
比如去官方
[root@192 ~]# podman pull docker.io/library/centos
Trying to pull docker.io/library/centos:latest...
Getting image source signatures
Copying blob a1d0c7532777 done
Copying config 5d0da3dc97 done
Writing manifest to image destination
Storing signatures
5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
[root@192 ~]#
这里可以看到用指定的跟不指定的版本都不一样
[root@192 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/busybox latest 7a80323521cc 2 weeks ago 1.47 MB
docker.io/library/centos latest 5d0da3dc9764 11 months ago 239 MB
quay.io/centos/centos latest 300e315adb2f 20 months ago 217 MB
[root@192 ~]#
podman基础命令使用
cp 在容器和本地文件系统之间复制文件/文件夹
[root@192 ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e8cc176fdcd7 docker.io/library/busybox:latest sh About a minute ago Up About a minute ago frosty_stonebraker
[root@192 ~]# podman cp anaconda-ks.cfg e8cc176fdcd7:/
[root@192 ~]#
[root@192 ~]# podman run -it busybox
/ # ls
anaconda-ks.cfg etc root tmp
bin home run usr
dev proc sys var
/ #
[root@192 ~]# podman cp e8cc176fdcd7:/anaconda-ks.cfg /opt/
[root@192 ~]# ls /opt/
anaconda-ks.cfg
[root@192 ~]#
create 创建但不启动容器
[root@192 ~]# podman create --name web httpd
1d771fd1a125e70cb7c843a8086d695535598ab8c10175286ff078dd862266f1
[root@192 ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e8cc176fdcd7 docker.io/library/busybox:latest sh 8 minutes ago Up 8 minutes ago frosty_stonebraker
[root@192 ~]#
[root@192 ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e8cc176fdcd7 docker.io/library/busybox:latest sh 9 minutes ago Up 9 minutes ago frosty_stonebraker
1d771fd1a125 docker.io/library/httpd:latest httpd-foreground 28 seconds ago Created web
[root@192 ~]#
diff 检查容器文件系统上的更改
[root@192 ~]# podman diff e8cc176fdcd7
A /anaconda-ks.cfg
C /etc
C /root
A /root/.ash_history
[root@192 ~]#
events 显示podman事件
[root@192 ~]# podman events
exec 在正在运行的容器中运行进程
[root@192 ~]# podman exec -it e8cc176fdcd7 /bin/sh
/ # exit
[root@192 ~]#
attach 附加到正在运行的容器
//这边ls,这边会话退出
[root@192 ~]#