Podman的部署与命令用法

Podman


一、什么是Podman?

Podman 是 Red Hat 在2018年推出的,Podman是一个无守护程序、开源的 Linux 原生工具,旨在使用 Open Containers Initiative ( OCI )容器和容器镜像轻松查找、运行、构建、共享和部署应用程序。Podman可以运行在root或者非root用户模式。Podman 提供了任何使用过 Docker容器引擎的人都熟悉的命令行界面 (CLI)。大多数用户可以简单地将 Docker 别名为 Podman(别名 docker=podman)而不会出现任何问题。与其他常见的容器引擎(Docker、CRI-O、containerd)类似,Podman 依赖于符合 OCI 的容器运行时(runc、crun、runv 等)与操作系统交互并创建正在运行的容器。这使得 Podman 创建的正在运行的容器与任何其他常见容器引擎创建的容器几乎没有区别。

👉 Podman官网

podman-logo.png

二、Podman与Docker的区别

  • 最主要的区别是podman是Daemonless的,而Docker在执行任务的时候,必须依赖于后台的docker daemon(最主要的区别)
  • podman不需要使用root用户或者root权限,所以更安全。(最主要的区别)
  • podman可以创建pod,pod的概念和Kubernetes 里定义的pod类似
  • podman运行把镜像和容器存储在不同的地方,但是docker必须存储在docker engineer所在的本地
  • podman是传统的fork-exec 模式,而docker是 client-server 架构

三、两者的架构区别

3.1 Docker架构

docker-jiagou

3.2 Podman架构

podman-jiagou


四、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,仍然可以使用docker.io作为镜像仓库,这也是兼容性最关键的部分。


五、Podman安装与配置

Podman是个Linux程序,不能在Windows上运行,但是可以运行客户端,发送到Linux服务端操作。

官方安装文档地址👉 https://podman.io/getting-started/installation

//安装podman
[root@localhost ~]# yum -y install podman

//临时配置Podman的别名为docker
[root@localhost ~]# alias docker=podman
//确认该主机没有安装docker
[root@localhost ~]# rpm -qa | grep docker
//使用docker命令查看本地仓库
[root@localhost ~]# docker images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

//永久配置Podman的别名为docker
[root@localhost ~]# vim /root/.bashrc
alias docker='podman'
[root@localhost ~]# source /root/.bashrc

//配置pod的镜像仓库源与加速器
[root@localhost ~]# vim /etc/containers/registries.conf
//镜像源,写一个地址则只在一个源里查找镜像,写多个地址则在多个
unqualified-search-registries = ["docker.io"]
//加速器
[[registry]]
prefix = "docker.io"
location = "docker.mirrors.ustc.edu.cn"

六、Podman的命令使用

镜像命令

podman search             #搜索镜像
podman pull               #获取镜像
podman images             #列出镜像
podman image ls           #列出镜像
podman rmi                #删除镜像
podman image rm           #删除镜像
podman save               #导出镜像
podman load               #导入镜像
podman build              #构建镜像
podman run                #运行镜像
podmanfile                #制作镜像
        COPY                    #复制文件
        ADD                     #高级复制
        CMD                     #容器启动命令
        ENV                     #环境变量
        EXPOSE                  #暴露端口

容器命令

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

命令用法演示

查看podman的版本信息

[root@localhost ~]# podman -v
podman version 3.3.1
[root@localhost ~]# podman version
Version:      3.3.1
API Version:  3.3.1
Go Version:   go1.16.7
Built:        Wed Nov 10 05:23:56 2021
OS/Arch:      linux/amd64

查看podman的详细信息

[root@localhost ~]# podman info
registries:
  docker.io:
    Blocked: false
    Insecure: false
    Location: docker.mirrors.ustc.edu.cn	//显示加速器的配置
    MirrorByDigestOnly: false
    Mirrors: null
    Prefix: docker.io
  search:
  - docker.io	//搜索源为docker的

登录与登出

[root@localhost ~]# podman login docker.io
Username: guguniao
Password:
Login Succeeded!

[root@localhost ~]# podman logout
Removed login credentials for docker.io

镜像命令用法演示

搜索镜像

podman search busybox

因文本格式复制过来显示的格式不完整,随采取图片的形似

image-20220814205707552

拉取镜像

[root@localhost ~]# podman pull busybox
Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/busybox:latest...
etting image source signatures
Copying blob 5cc84ad355aa done
Copying config beae173cca done
Writing manifest to image destination
Storing signatures
beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a

查看本地镜像仓库列表

[root@localhost ~]# podman image ls
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
docker.io/library/busybox  latest      beae173ccac6  7 months ago  1.46 MB

删除本地仓库中的镜像

[root@localhost ~]# podman image rm busybox
Untagged: docker.io/library/busybox:latest
Deleted: beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a

修改镜像的标签

[root@localhost ~]# podman tag busybox docker.io/guguniao/busybox:v0.2

[root@localhost ~]# podman image ls
REPOSITORY                 TAG         IMAGE ID      CREATED       SIZE
docker.io/library/busybox  latest      beae173ccac6  7 months ago  1.46 MB
docker.io/library/busybox  v0.2        beae173ccac6  7 months ago  1.46 MB

上传镜像至Docker Hub

//首先登录
[root@localhost ~]# podman login docker.io
Username: guguniao
Password:
Login Succeeded!
//上传镜像
[root@localhost ~]# podman push docker.io/guguniao/busybox:v0.2
Getting image source signatures
Copying blob 01fd6df81c8e done
Copying config beae173cca done
Writing manifest to image destination
Storing signatures
[root@localhost ~]# podman logout
Removed login credentials for docker.io

检查镜像的更改

[root@localhost ~]# podman diff busybox
A /home
A /root
A /tmp
A /usr
A /usr/sbin
A /var
..............
..............

显示镜像的历史记录

[root@localhost ~]# podman history busybox
ID            CREATED       CREATED BY                                     SIZE        COMMENT
beae173ccac6  7 months ago  /bin/sh -c #(nop)  CMD ["sh"]                  0 B
<missing>     7 months ago  /bin/sh -c #(nop) ADD file:6db446a57cbd2b7...  1.46 MB

显示镜像的配置信息

[root@localhost ~]# podman image inspect busybox
[
    {
        "Id": "beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a",
        "Digest": "sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678",
        "RepoTags": [
            "docker.io/library/busybox:latest",
            "docker.io/guguniao/busybox:v0.2"
        ],
.....................
.....................

将镜像以tar包保存在本地

[root@localhost ~]# podman image save busybox > busybox.tar
[root@localhost ~]# ls
anaconda-ks.cfg  busybox.tar

将本地tar包加载到本地镜像仓库

[root@localhost ~]# podman image load < busybox.tar
Getting image source signatures
Copying blob 01fd6df81c8e done
Copying config beae173cca done
Writing manifest to image destination
Storing signatures
Loaded image(s): docker.io/library/busybox:latest

删除未使用的镜像

[root@localhost ~]# podman image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y

以树状的形式显示镜像的层次结构

[root@localhost ~]# podman image tree docker.io/guguniao/busybox:v0.2
Image ID: beae173ccac6
Tags:     [docker.io/library/busybox:latest docker.io/guguniao/busybox:v0.2]
Size:     1.464MB
Image Layers
└── ID: 01fd6df81c8e Size: 1.459MB Top Layer of: [docker.io/library/busybox:latest docker.io/guguniao/busybox:v0.2]

容器命令用法演示

创建容器

[root@localhost ~]# podman container create busybox
d6132c6abb43758036ec1b7166046f2a0cc8b4210bca083f8e772b54c4599ccd

启动已存在的容器(如果该容器没有可持续运行的任务,那么容器一开启就会停止)

[root@localhost ~]# podman container start d6132c6abb43
d6132c6abb43

创建并启动容器

[root@localhost ~]# podman run -it busybox
/ #	ls
bin   dev   etc   home  proc  root  run   sys   tmp   usr   var

参数说明:

    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

    -d: 后台运行容器,并返回容器ID;

    -i: 以交互模式运行容器,通常与 -t 同时使用;

    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    
    -P: 随机端口映射,容器内部端口随机映射到主机的端口

    -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

    --name="nginx-lb": 为容器指定一个名称;

    --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

    -h "mars": 指定容器的hostname;

    -e username="ritchie": 设置环境变量;

    --env-file=[]: 从指定文件读入环境变量;

    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

    -m :设置容器使用内存最大值;

    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

    --link=[]: 添加链接到另一个容器;

    --expose=[]: 开放一个端口或一组端口;

    --volume , -v: 绑定一个卷
    	绑定挂载卷: -v 宿主机目录:容器目录		//目录可以事先不存在,在启动容器时自动生成
    	容器管理卷: -v 容器目录				   //只需指定容器的目录,宿主机的挂载点由docker引擎自行生成
    
    --volumes-from: 在新容器当中挂载已存在的容器的卷
    	--volumes-from 要挂载的容器名
    
    --restart always: 让容器保持运行状态

查看容器列表

//查看运行中的容器
[root@localhost ~]# podman container ls
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

//查看全部的容器
[root@localhost ~]# podman container ls -a
CONTAINER ID  IMAGE     COMMAND     CREATED         STATUS        PORTS       NAMES
2e6f0fc009ee  docker.io/library/busybox:latest  sh   35 minutes ago  Exited (0) 20 minutes ago              goofy_mccarthy

参数说明:
-a 或 --all    //列出所有容器,包括未运行
-s  或 --size  //显示本地机上所有运行实例的大小
-q  或 --quiet //显示容器id

重启容器

[root@localhost ~]# podman container restart d6132c6abb43
d6132c6abb43758036ec1b7166046f2a0cc8b4210bca083f8e772b54c4599ccd

挂起(暂停)运行中的容器

[root@localhost ~]# podman container pause 423a64ce82f6

停止容器

[root@localhost ~]# podman container stop 423a64ce82f6

强制停止容器

[root@localhost ~]# podman container kill test1
test1

删除容器

[root@localhost ~]# podman container rm 423a64ce82f6
423a64ce82f6cf8511b2207c1093181ec3079062c9a4d10076ffeb5745f9deeb

重命名容器

[root@localhost ~]# podman container rename httpd1 web1
[root@localhost ~]# podman container ls -a
CONTAINER ID  IMAGE                             COMMAND           CREATED         STATUS                    PORTS       NAMES
74070785788d  docker.io/library/httpd:latest    httpd-foreground  3 minutes ago   Exited (0) 2 minutes ago              web1

连接到运行中的容器

//由于httpd容器本身没有shell,所以进去后什么都操作不了
[root@localhost ~]# podman container attach web1

//连接到一个有shell的容器里
[root@localhost ~]# podman container attach busybox
/ #	ls
bin   dev   etc   home  proc  root  run   sys   tmp   usr   var

进入到运行中的容器里执行命令

//该命令使用-it参数能给容器分配一个伪终端
[root@localhost ~]# podman container exec -it web1 /bin/bash
root@74070785788d:/usr/local/apache2# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  modules

在容器和本地文件系统之间复制文件/文件夹

//先启动一台容器并创建测试用的文件
[root@localhost ~]# podman container run -it --name test1 busybox
/ # touch /tmp/busybox_test

//把容器里的文件复制到宿主机
[root@localhost ~]# podman container cp test1:/tmp/busybox_test ./
[root@localhost ~]# ls
anaconda-ks.cfg  busybox_test

//把宿主机的文件复制到容器里
[root@localhost ~]# podman container cp /root/anaconda-ks.cfg test1:/tmp/
//在容器里验证
/ # ls /tmp/
anaconda-ks.cfg  busybox_test

检查对容器文件系统的更改

[root@localhost ~]# podman container diff test1
C /root
A /root/.ash_history
C /tmp
A /tmp/anaconda-ks.cfg
A /tmp/busybox_test
C /etc

显示容器的配置

[root@localhost ~]# podman container inspect test1
[
    {
        "Id": "0908f9b2505d2f1b83cb837b66c6e627f5ea3c43e6f9c91abf383660ec6815c1",
        "Created": "2022-08-15T10:24:09.995334259+08:00",
        "Path": "sh",
        "Args": [
            "sh"
        ],

显示容器使用资源的状态

[root@localhost ~]# podman container stats test1
ID            NAME        CPU %       MEM USAGE / LIMIT  MEM %       NET IO          BLOCK IO    PIDS        CPU TIME     AVG CPU %
0908f9b2505d  test1       2.77%       278.5kB / 1.877GB  0.01%       978B / 1.404kB  -- / --     1           46.065148ms  2.77%
.........................

显示容器的运行进程

[root@localhost ~]# podman container top test1
USER        PID         PPID        %CPU        ELAPSED       TTY         TIME        COMMAND
root        1           0           0.000       8m2.1232365s  pts/0       0s          sh

查看容器的日志

//web服务的日志
[root@localhost ~]# podman container logs web1
[Mon Aug 15 01:51:27.817472 2022] [mpm_event:notice] [pid 1:tid 140530986216768] AH00489: Apache/2.4.52 (Unix) configured -- resuming normal operations
[Mon Aug 15 01:51:27.817609 2022] [core:notice] [pid 1:tid 140530986216768] AH00094: Command line: 'httpd -D FOREGROUND'
[Mon Aug 15 01:52:14.332685 2022] [mpm_event:notice] [pid 1:tid 140530986216768] AH00491: caught SIGTERM, shutting down

//操作系统的日志
[root@localhost ~]# podman container logs test1
/ # ls
bin   dev   etc   home  proc  root  run   sys   tmp   usr   var
/ # cd tmp/
/tmp # cd ..
/ # touch /tmp/busybox_test
/ #
/ # ls /tmp/
anaconda-ks.cfg  busybox_test

显示容器的映射端口

[root@localhost ~]# podman container port web1
80/tcp -> 0.0.0.0:8080
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值