podman的安装,应用

什么是podma

容器编排工具作为当今最重要的Web开发技术之一,众多强者都在尝试争夺这一行业的主导地位。

Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。正如前面提到的那样,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。

Podman 可以管理和运行任何符合 OCI(Open Container Initiative)规范的容器和容器镜像。Podman 提供了一个与 Docker 兼容的命令行前端来管理 Docker 镜像。
podman官网

它是一款集合了命令集的工具,设计初衷是为了处理容器化进程的不同任务,可以作为一个模块化框架工作。它的工具集包括:

  Podman:Pod和容器镜像管理器

  Buildah:容器镜像生成器

  Skopeo:容器镜像检查管理器

  Runc:容器运行器和特性构建器,并传递给Podman和Buildah

  Crun:可选运行时,为Rootless容器提供更大的灵活性、控制和安全性

  这些工具还可以与任何OCI兼容的容器引擎(如Docker)一起工作,使其易于转换到Podman或与现有的Docker安装一起使用。Kubernetes可以使用Podman吗?答案是:是的。事实上,Kubernetes和Podman在某些方面是相似的。

  Podman对于容器有着不同的方法论。正如它的名字所暗示的那样,Podman可以创建一起工作的容器“Pod”,这是一个类似Kubernetes里Pod的特性。Pod在一个共同的命名空间里,作为一个单元来管理容器。

  比较主要的好处是开发人员可以共享资源,在一个Pod中为同一个应用程序使用不同的容器:一个容器用于前端,另一个容器用于后端,还有一个数据库。Pod的配置可以导到Kubernetes兼容的YAML文件,并应用到Kubernetes集群中,从而允许容器更快地进入生产。

  Podman的另一个特性是它是无守护进程的。守护进程是在后台运行的程序,它处理服务、进程和请求,没有用户界面。Podman是一种独特的容器引擎,因为它实际上并不依赖于守护进程,而是作为子进程启动容器和Pod。

podman与docker的区别

Podman和Docker有许多共同的特性,但也有一些根本的区别。技术不分好坏,只是着重于哪个更适用于某些特定的场景。

Podman与Linux内核交互,通过runC容器运行时进程而不是Daemon来管理容器。Buildah实用程序用于替代Docker build作为容器镜像构建工具,Docker push被Skopeo替代,用于在注册表和容器引擎之间移动容器镜像。

架构

Docker使用守护进程,一个正在后台运行的程序,来创建镜像和运行容器。Podman是无守护进程的架构,这意味着它可以在启动容器的用户下运行容器。Docker有一个由守护进程引导的客户端——服务器逻辑架构;但Podman不需要此类守护进程。

docker的硬伤

硬伤一:docker存在一个名为dockerd 的进程,会占用比较多的CPU资源。同时一个dockerd守护进程还可能导致单点故障的问题,该守护进程挂掉了,容器也就无法正常提供服务。

硬伤二:docker守护进程以root用户运行,这给操作系统的安全性和容器安全性带来了非常大的挑战。

然而Podman 不需要以 root 身份运行的守护进程,Podman 容器的运行权限与启动它们的linux用户相同,这解决了一个重大的安全问题。Podman 是一个无守护进程的容器引擎,并且Podman 不需要守护进程来启动和管理容器。这是两个开源项目之间的一个最重要区别。这也是笔者看好podman未来会代替docker成为主流容器技术的核心原因。

podman的应用

Podman常用命令

容器

podman run         #创建并启动容器  
podman start       #启动容器  
podman ps          #查看容器  
podman stop        #终止容器  
podman restart     #重启容器  
podman attach      #进入容器  
podman exec        #进入容器  
podman export      #导出容器  
podman import      #导入容器快照  
podman rm          #删除容器  
podman logs        #查看日志

镜像

podman search             #查找镜像  
docke pull                #获取镜像  
podman images             #列出镜像  
podman image Is           #列出镜像  
podman rmi                #删除镜像  
podman image rm           #删除镜像  
podman save               #导出镜像  
podman load               #导入镜像  
podmanfile                #定制镜像(三个)  
    podman build              #构建镜像  
    podman run              #运行镜像  
    podmanfile              #常用指令(四个)  
        COPY                    #复制文件  
        ADD                     #高级复制  
        CMD                     #容器启动命令  
        ENV                     #环境变量  
        EXPOSE                  #暴露端口

安装podman

系统版本 centos-8
在安装podman时系统不能存在docker,如果之前有docker请先恢复快照

[root@localhost ~]# dnf -y install podman

在拉取镜像的时候会出现选项去选择镜像仓库,下面更改只留下docker.io

[root@localhost ~]# podman run -d --name web -p 8080:80 httpd
? Please select an image: 
  ▸ registry.fedoraproject.org/httpd:latest
    registry.access.redhat.com/httpd:latest
    registry.centos.org/httpd:latest
    docker.io/library/httpd:latest

[root@localhost containers]# pwd
/etc/containers
[root@localhost containers]# vim registries.conf
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"]
//删除docekr.io外的其他三个,结果如下:
unqualified-search-registries = ["docker.io"]

配置加速器

unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
location = "zs81wprp.mirror.aliyuncs.com"  //这里不需要https://

普通用户使用podman

在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置
cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资源,如果使用cgroup V2启用了运行Podman的Linux发行版,则可能需要更改默认的OCI运行时。某些较旧的版本runc不适用于cgroup V2,必须切换到备用OCI运行时crun。

[root@localhost ~]# yum  -y install crun

可以使用–runtime选项在命令行中打开对cgroup V2的替代OCI运行时支持

podman  --runtime crun

也可以将containers.conf文件runtime = "runc"和runtime = “crun”注释其中一个

//安装crun
[root@localhost containers]# yum -y install crun
//修改配置文件
[root@localhost ~]# cd /usr/share/containers/
[root@localhost containers]# ls
containers.conf  mounts.conf  seccomp.json  selinux
[root@localhost containers]# vi containers.conf 
...........................
runtime = "crun" #取消注释
#runtime = "runc" #注释
...........................

[root@localhost ~]# su - lzx

[test@localhost ~]$ mkdir test
 
[test@localhost ~]$ podman  run  -it -v "$(pwd)"/test:/test busybox /bin/sh
/ # cd test/
/test # ls
/test # touch xxx
/test # ls -l
-rw-r--r--    1 root     root             0 Dec 14 09:05 xxx
/ # exit
 
[test@localhost ~]$ ls -l
total 0
drwxrwxr-x 2 test test 1 Dec 14 10:05 xxx

安装slirp4netns
slirp4nets包为普通用户提供一种网络模式

[root@localhost ~]# dnf -y install slirp4netns

安装fuse-overlayfs
在普通用户环境中使用Podman时,建议使用fuse-overlayfs而不是VFS文件系统

[root@localhost ~]# dnf -y install fuse-overlayfs

配置storage.conf文件

[root@localhost ~]# vim /etc/containers/storage.conf
mount_program = "/usr/bin/fuse-overlayfs"  取消此行注释

/ etc / subuid和/ etc / subgid配置

[root@localhost ~]# yum -y install shadow-utils

[root@localhost ~]# useradd tom
[root@localhost ~]# cat  /etc/subuid
lzx:100000:65536
tom:165536:65536
[root@localhost ~]# cat /etc/subgid
lzx:100000:65536
tom:165536:65536

启动非特权ping

//此方式临时生效
[root@localhost ~]# sysctl -w "net.ipv4.ping_group_range=0 200000" //大于100000这个就表示tom可以操作podman

//永久生效
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ping_group_range=0 200000
[root@localhost ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000

// 用户配置文件

[root@localhost containers]# cat /usr/share/containers/containers.conf
[root@localhost containers]# cat /etc/containers/containers.conf
[root@localhost ~]# cat ~/.config/containers/containers.conf  //优先级最高

在普通用户中/etc/containers/storage.conf的一些字段将被忽略

[root@localhost ~]#  vi /etc/containers/storage.conf
[storage]

# Default Storage Driver, Must be set for proper operation.
driver = "overlay"    #此处改为overlay
.......
mount_program = "/usr/bin/fuse-overlayfs"    #取消注释

[root@localhost ~]# vim /etc/sysctl.conf
user.max_user_namespaces=15000
[root@localhost ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000
user.max_user_namespaces = 15000

[tom@localhost ~]$ mkdir data
[tom@localhost ~]$ podman run -it --rm -v $(pwd)/data:/data busybox /bin/sh
/ # ls
bin   data  dev   etc   home  proc  root  run   sys   tmp   usr   var
/ # cd data/
/data # ls
ls: can't open '.': Permission denied  //没有权限

[tom@localhost ~]$ podman run -it --rm -v "$(pwd)"/data:/data:Z busybox /bin/sh
/ # ls -l   //获得权限
total 16
drwxr-xr-x    2 root     root         12288 Dec 29 21:12 bin
drwxrwxr-x    2 root     root             6 May  9 11:34 data
drwxr-xr-x    5 root     root           360 May  9 11:47 dev
drwxr-xr-x    3 root     root            66 May  9 11:47 etc
drwxr-xr-x    2 nobody   nobody           6 Dec 29 21:12 home
dr-xr-xr-x  236 nobody   nobody           0 May  9 11:47 proc
drwx------    2 root     root            26 May  9 11:47 root
drwxr-xr-x    3 root     root            62 May  9 11:47 run
dr-xr-xr-x   13 nobody   nobody           0 May  9 07:03 sys
drwxrwxrwt    2 root     root             6 Dec 29 21:12 tmp
drwxr-xr-x    3 root     root            18 Dec 29 21:12 usr
drwxr-xr-x    4 root     root            30 Dec 29 21:12 var
/ # cd data/
/data # ls 
/data # 

主机上查看
[tom@localhost ~]$ ll data/
总用量 4
-rw-rw-r--. 1 tom tom 11 5月   9 19:52 abc
[tom@localhost ~]$ echo "hello world" > abc
[tom@localhost ~]$ cat abc
hello world

容器里查看
[tom@localhost ~]$ echo 'echo hello' > data/abc
/data # cat abc
echo hello

容器里面的文件的属主和属组都属于root
/data # ls -l
total 4
-rw-rw-r--    1 root     root            11 May  9 11:52 abc

让容器里的文件和目录属于tom用户只要在运行容器的时候加上一个--userns=keep-id即可。
[tom@localhost ~]$ podman run -it --rm -v "$(pwd)"/data:/data:Z --userns=keep-id busybox /bin/sh
~ $ id
uid=1001(tom) gid=1001(tom)

普通用户只能够暴露<=1024的端口号,如果要暴露>=1024的就要手动添加

[tom@localhost ~]$ podman run -d --name web -p 8080:80 httpd
7b6c2bc0a6fffa817ddc3b87f18424ced0ef5f96dd3f1c93d151d1a4224760fb
[tom@localhost ~]$ podman run -d --name web -p 80:80 httpd
Resolving "httpd" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob d982c879c57e done  
Copying blob a2abf6c4d29d done  
Copying blob dcc4698797c8 done  
Copying blob 67283bbdd4a0 done  
Copying blob 41c22baa66ec done  
Copying config dabbfbe0c5 done  
Writing manifest to image destination
Storing signatures
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

配置echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf后可以映射大于等于80的端口

[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_unprivileged_port_start=80  //添加此行
[root@localhost ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000
user.max_user_namespaces = 15000
net.ipv4.ip_unprivileged_port_start = 80

[tom@localhost ~]$ podman run -d --name web1 -p 80:80 httpd
4715b3c39ed6c1b6f586310cab5a6a63dfc8f645a851d0e16965ebf28a7a246b
[tom@localhost ~]$ ss -antl
State       Recv-Q      Send-Q           Local Address:Port           Peer Address:Port      Process      
LISTEN      0           128                    0.0.0.0:111                 0.0.0.0:*                      
LISTEN      0           32               192.168.122.1:53                  0.0.0.0:*                      
LISTEN      0           128                    0.0.0.0:22                  0.0.0.0:*                      
LISTEN      0           5                    127.0.0.1:631                 0.0.0.0:*                      
LISTEN      0           128                       [::]:111                    [::]:*                      
LISTEN      0           128                          *:80                        *:*                      
LISTEN      0           128                          *:8080                      *:*                      
LISTEN      0           128                       [::]:22                     [::]:*                      
LISTEN      0           5                        [::1]:631                    [::]:*      
posted @ 2022-05-09 22:22  夏天的海  阅读(856)  评论(0)    收藏  举报