Podman容器技术基础入门

一、介绍podman

1.1 为什么使用podman

podman(Pod Manager)是一个由RedHat公司推出的容器管理工具,它的定位就是docker的替代品,在使用上与docker的体验类似。 podman源于CRI-O项目,可以直接访问OCI的实现(如runC),流程比docker要短。 二者主要的区别在于,podman是一个开源的产品;而docker已经是商业化的产品。 podman的开源代码,由RedHat的OpenShift项目维护。 podman.io上面的文档还不算很健全,作为普通开发者,将其当成docker去用,难度也不算很大。

Podman 是 Docker 的替代品,用于容器化应用程序的本地开发。Podman 命令将 1 对 1 映射 Docker 命令,包括它们的参数。你可以使用 podman 为 docker 添加别名,并且从不会发现管理本地容器的是两种完全不同的工具。Podman 的核心功能之一是它专注于**安全性。**使用 Podman 不需要守护进程。相反,它使用传统的 fork-exec 模型,并且大量地使用 用户名称空间 和 网络名称空间 。因此,Podman 比 Docker 更加孤立,使用起来也更安全。更多细节请点击这里podman官网地址

podman项目地址

1.2 podman与docker的区别

在这里插入图片描述

  • docker 需要在我们的系统上运行一个守护进程(docker daemon),而podman 不需要

  • 启动容器的方式不同: docker cli 命令通过API跟 Docker Engine(引擎)交互告诉它我想创建一个container,然后docker engine才会调用 OCI container

  • runtime(runc)来启动一个container。这代表container的process(进程)不会是Docker CLI的child process(子进程),而是 Docker Engine 的child process。 Podman是直接给OCI,containner runtime(runc)进行交互来创建container的,所以container的process直接是podman的child process。

  • 因为docke有docker daemon,所以docker启动的容器支持–restart策略,但是podman不支持,如果在k8s中就不存在这个问题,我们可以设置pod的重启策略,在系统中我们可以采用编写systemd服务来完成自启动docker需要使用root用户来创建容器,但是podman不需要

在这里插入图片描述

注意:podman相比docker也缺失了一些功能,比如不支持windows,不支持docker-compoese编排工具。显然在Kubernetes或者OpenShift体系中,这些并不重要

1.3 podman的工作机制

Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker类似,不同的是 Podman 没有 daemon。以前使用 Docker CLI 的时候,Docker CLI 会通过 gRPC API
去跟 Docker Engine 说「我要启动一个容器」,然后 Docker Engine 才会通过 OCI Container。

runtime(默认是 runc)来启动一个容器。这就意味着容器的进程不可能是 Docker CLI 的子进程,而是 Docker
Engine 的子进程。

Podman 比较简单粗暴,它不使用 Daemon,而是直接通过 OCI runtime(默认也是 runc)来启动容器,所以容器的进程是 podman 的子进程。这比较像 Linux 的 fork/exec 模型,而 Docker 采用的是 C/S(客户端/服务器)模型。与 C/S 模型相比,fork/exec 模型有很多优势,比如:

  • 系统管理员可以知道某个容器进程到底是谁启动的。
  • 如果利用 cgroup 对 podman 做一些限制,那么所有创建的容器都会被限制。
  • SD_NOTIFY : 如果将 podman 命令放入 systemd 单元文件中,容器进程可以通过 podman 返回通知,表明服务已准备好接收任务。
  • socket 激活 : 可以将连接的 socket 从 systemd 传递到 podman,并传递到容器进程以便使用它们。

二、安装podman

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

[root@localhost ~]# rpm -qa | grep podman
podman-3.4.1-3.module_el8.6.0+954+963caf36.x86_64
podman-catatonit-3.4.1-3.module_el8.6.0+954+963caf36.x86_64

// 定义别名
[root@localhost ~]# alias docker=podman
[root@localhost ~]# docker images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

[root@localhost ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

三、podman使用帮助

要获得一些帮助并了解Podman的工作原理,您可以使用以下帮助:

$ podman --help
$ podman <subcommand> --help
$ podman --version 	// 查看podman版本

有关更多详细信息,您可以查看手册页:

$ man podman
$ man podman-<subcommand>

另请参阅Podman 故障排除指南,以查找有关如何解决常见配置错误的已知问题和提示。

四、podman常用基础命令

4.1 podman search:查找

// --filter=is-official:指定查找官方版本的httpd
[root@localhost ~]# podman search httpd --filter=is-official
INDEX       NAME                     DESCRIPTION                     STARS       OFFICIAL    AUTOMATED
docker.io   docker.io/library/httpd  The Apache HTTP Server Project  3794        [OK]     

4.2 podman pull:下载(拉取)镜像

注意:Podman在不同的注册管理机构中搜索。因此,建议使用完整的映像名称(docker.io/library/httpd而不是httpd)来确保使用正确的映像

// 拉取httpd镜像
[root@localhost ~]# podman pull docker.io/library/httpd
Trying to pull docker.io/library/httpd:latest...
Getting image source signatures
Copying blob aa379c0cedc2 done  
Copying blob bc36ee1127ec done  
Copying blob f1aa5f54b226 done  
Copying blob d3576f2b6317 done  
Copying blob e5ae68f74026 done  
Copying config ea28e1b82f done  
Writing manifest to image destination
Storing signatures
ea28e1b82f314092abd3f90a69e57d6ccf506382821ee0b8d9b48c3e47440c1f

// 当你不知道镜像准确位置,无法确定的时候,直接podman pull + 镜像名,然后上下滑动选择你要指定拉取镜像的位置
[root@localhost ~]# podman pull nginx
? Please select an image: 
    registry.fedoraproject.org/nginx:latest
    registry.access.redhat.com/nginx:latest
    registry.centos.org/nginx:latest
  ▸ docker.io/library/nginx:latest

4.3 podman images:显示所有镜像

[root@localhost ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED        SIZE
docker.io/library/httpd  latest      ea28e1b82f31  11 days ago    148 MB
quay.io/centos/centos    latest      300e315adb2f  12 months ago  217 MB

4.4 podman run:运行容器

运行一个非常基本的 httpd 服务器

[root@localhost ~]# podman run -d -p 80:80 docker.io/library/httpd
485105d6adb8b2e12283111fb6c2f3a039ff79d786695958ae9dacd1fa4415e6

注意:由于容器在分离模式下运行,由命令中的 表示,Podman将在执行命令后打印容器ID。它还添加了一个伪 tty,用于在交互式 shell 中运行任意命令。-d``podman run``-t

注意:我们使用端口转发来访问HTTP服务器。要成功运行,至少需要 slirp4netns v0.3.0。

4.5 podman ps:列出正在运行的容器

// 查看刚刚运行的httpd
[root@localhost ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS               NAMES
485105d6adb8  docker.io/library/httpd:latest  httpd-foreground  4 seconds ago  Up 3 seconds ago  0.0.0.0:80->80/tcp  vigorous_turing

页面访问

在这里插入图片描述

注意:如果添加 -a 命令,Podman 将显示所有容器(已创建、已退出、正在运行等)

[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS               NAMES
485105d6adb8  docker.io/library/httpd:latest  httpd-foreground  5 minutes ago  Up 5 minutes ago  0.0.0.0:80->80/tcp  vigorous_turing

4.6 podman inspect:查看容器详细信息

  • -l:查看最新信息(最新的信息以最新的时间来定义)

您可以"检查"正在运行的容器,以查找有关其自身的元数据和详细信息。 将提供许多有用的信息,如环境变量,网络设置或分配的资源。podman inspect

由于容器在无根模式下运行,因此不会为容器分配 IP 地址。

[root@localhost ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS               NAMES
485105d6adb8  docker.io/library/httpd:latest  httpd-foreground  5 minutes ago  Up 5 minutes ago  0.0.0.0:80->80/tcp  vigorous_turing
[root@localhost ~]# podman inspect 485105d6adb8
[
    {
   
        "Id": "485105d6adb8b2e12283111fb6c2f3a039ff79d786695958ae9dacd1fa4415e6",
        "Created": "2021-12-14T10:19:25.522855463+08:00",
        "Path": "httpd-foreground",
        "Args": [
            "httpd-foreground"
        ],
        "State": {
   
            "OciVersion": "1.0.2-dev",
            "Status": "running",
......后面省略

// -l 查看最新信息
[root@localhost ~]# podman inspect -l | grep IPAddress
            "IPAddress": "10.88.0.2",
                    "IPAddress": "10.88.0.2",

4.7 curl + IP:访问测试页面

如您所见,容器未分配 IP 地址。容器可通过本地计算机上的已发布端口访问。

[root@localhost ~]# curl 192.168.91.137
<html><body><h1>It works!</h1></body></html>

在另一台计算机上,需要使用运行容器的主机的 IP 地址。

$ curl http://<IP_Address>:80

注意:除了使用curl之外,您还可以将浏览器指向http://localhost:80。

4.8 podman logs:查看容器日志

  • -l:查看最新日志
[root@localhost ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED         STATUS             PORTS               NAMES
485105d6adb8  docker.io/library/httpd:latest  httpd-foreground  21 minutes ago  Up 21 minutes ago  0.0.0.0:80->80/tcp  vigorous_turing

// 查看指定容器日志
[root@localhost ~]# podman logs 485105d6adb8
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.2. Set the 'ServerName' directive globally to suppress this message
[Tue Dec 14 02:19:26.304224 2021] [mpm_event:notice] [pid 1:tid 140380177263936] AH00489: Apache/2.4.51 (Unix) configured -- resuming normal operations
[Tue Dec 14 02:19:26.304364 2021] [core:notice] [pid 1:tid 140380177263936] AH00094: Command line: 'httpd -D FOREGROUND'
192.168.91.1 - - [14/Dec/2021:02:19:49 +0000] "GET / HTTP/1.1" 200 45
192.168.91.1 - - [14/Dec/2021:02:19:49 +0000] "GET /favicon.ico HTTP/1.1" 404 196
192.168.91.1 - - [14/Dec/2021:02:35:29 +0000] "GET / HTTP/1.1" 304 -
192.168.91.1 - - [14/Dec/2021:02:35:31 +0000] "GET / HTTP/1.1" 304 -
192.168.91.137 - - [14/Dec/2021:02:36:18 +0000] "GET / HTTP/1.1" 200 45
192.168.91.1 - - [14/Dec/2021:02:36:21 +0000] "-" 408 -

[root@localhost ~]# podman logs -l
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.2. Set the 'ServerName' directive globally to suppress this message
[Tue Dec 14 02:19:26.304224 2021] [mpm_event:notice] [pid 1:tid 140380177263936] AH00489: Apache/2.4.51 (Unix) configured -- resuming normal operations
[Tue Dec 14 02:19:26.304364 2021] [core:notice] [pid 1:tid 140380177263936] AH00094: Command line: 'httpd -D FOREGROUND'
192.168.91.1 - - [14/Dec/2021:02:19:49 +0000] "GET / HTTP/1.1" 200 45
192.168.91.1 - - [14/Dec/2021:02:19:49 +0000] "GET /favicon.ico HTTP/1.1" 404 196
192.168.91.1 - - [14/Dec/2021:02:35:29 +0000] "GET / HTTP/1.1" 304 -
192.168.91.1 - - [14/Dec/2021:02:35:31 +0000] "GET / HTTP/1.1" 304 -
192.168.91.137 - - [14/Dec/2021:02:36:18 +0000] "GET / HTTP/1.1" 200 45
192.168.91.1 - - [14/Dec/2021:02:36:21 +0000] "-" 408 -

4.9 podman top:查看容器的 pids

  • -l:查看最新的
// 查看httpd容器的pids
[root@localhost ~]# podman top 485105d6adb8
USER        PID         PPID        %CPU        ELAPSED           TTY         TIME        COMMAND
root        1           0           0.000       23m32.109319421s  ?           0s          httpd -DFOREGROUND 
www-data    8           1           0.000       23m31.109395119s  ?           0s          httpd -DFOREGROUND 
www-data    9           1           0.000       23m31.109433423s  ?           0s          httpd -DFOREGROUND 
www-data    11          1           0.000       23m31.10947179s   ?           0s          httpd -DFOREGROUND 
www-data    92          1           0.000       6m55.109510152s   ?           0s          httpd -DFOREGROUND 


// 查看最新的pids
[root@localhost ~]# podman top -l
USER        PID         PPID        %CPU        ELAPSED           TTY         TIME        COMMAND
root        
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值