当前位置:   article > 正文

Podman使用详解

podman

参考:Podman一篇就学会

一、Podman入门

1.1什么是podman?

Podman是一种无守护进程、开源的 Linux 原生工具,旨在使用开放容器倡议 ( OCI ) 容器容器映像轻松查找、运行、构建、共享和部署应用程序。Podman 提供了任何使用过 Docker 容器引擎的人都熟悉的命令行界面 (CLI) 。大多数用户可以简单地将 Docker 别名为 Podman(别名 docker=podman),没有任何问题。与其他常见的 容器引擎(Docker、CRI-O、containerd)类似,Podman 依赖于符合 OCI 的 容器运行时(runc、crun、runv 等)与操作系统交互并创建正在运行的容器。这使得 Podman 创建的运行容器与任何其他常见容器引擎创建的容器几乎没有区别。
Podman 控制下的容器可以由 root 或非特权用户运行。Podman 使用 libpod库管理整个容器生态系统,包括 pod、容器、容器镜像和容器卷。Podman 专注于帮助您维护和修改 OCI 容器映像的所有命令和功能,例如拉取和标记。它允许您在生产环境中创建、运行和维护这些容器和容器映像。
有一个 RESTFul API 来管理容器。我们还有一个可以与 RESTFul 服务交互的远程 Podman 客户端。我们目前支持 Linux、Mac 和 Windows 上的客户端。RESTFul 服务仅在 Linux 上受支持。
如果您完全不熟悉容器,我们建议您查看 简介。对于高级用户或来自 Docker 的用户,请查看我们的 教程。对于高级用户和贡献者,您可以通过查看我们的 命令页面来获取有关 Podman CLI 的非常详细的信息。最后,对于寻求如何与 Podman API 交互的开发人员,请参阅我们的 API 文档 参考

1.2 Podman工作机制

Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker类似,不同的是 Podman 没有 daemon。以前使用 Docker CLI 的时候,Docker CLI 会通过 gRPC API去跟 Docker Engine 说「我要启动一个容器」,然后 Docker Engine 才会通过 OCI Containerruntime(默认是 runc)来启动一个容器。这就意味着容器的进程不可能是 Docker CLI 的子进程,而是 DockerEngine 的子进程。
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,并传递到容器进程以便使用它们。

1.3 docker与podman的区别

Docker 和 Podman 在管理容器方面提供了类似的功能,但是 Docker 的安全漏洞可能使 Podman 对于某些管理员来说更具吸引力。

目前 Docker 已经成为许多 IT 管理员们事实上的标准,并且在开发人员中占有很大的份额。 但是,Podman 由于具有以非特权用户身份运行且无需守护进程的能力,因此与基本的 Docker 相比,它为管理员们提供了一些安全上的优势。
Docker 和 Podman 都提供许多相同的功能,例如,它们对开放式容器倡议(OCI) 2 的运行时和镜像规范的支持,以及它们映射命令以创建和管理容器的能力。 但是,Docker 和 Podman 之间存在一些差异,包括安全方面的问题和对守护程序的依赖。 3
考虑到 Podman 不使用 守护进程来开发、管理和运行 OCI 容器,因此它必须在 Linux OS 上运行。 容器可以以 root 模式运行,也可以以非 root 运行模式运行。Docker 利用一个守护进程(该守护进程是一个持久的后台进程)来处理主机上所有容器的管理职责。Docker 依赖于客户端/服务端(C/S)架构,守护进程扮演着服务端的角色,而客户端通过命令行界面(CLI)进行通信。
Docker 使用本机 Windows 守护进程就可以很好地运行 Windows 或基于 Linux 的镜像。Podman 需要 Windows Subsystem for Linux 版本2(WSL2)才能正常运行。 因此,管理员们必须有2020年5月以后的 Windows 10 更新才能开始使用 Podman,因为这是第一个将 WSL2 作为更新的一部分的发行版。

安全

Docker 与 Podman 之间的一个重大区别 涉及到安全问题。 Docker 守护进程需要 root 权限,这在向用户提供 root 权限时带来了安全挑战。 这也意味着配置不当的 Docker 容器可以无限制地访问主机文件系统。管理员可以通过遵循一些基本的最佳实践来防止这种情况发生,比如仅使用来自受信任的供应商提供的容器镜像,但这种可能性仍然存在。
但是,管理员们使用 Podman 可以以非特权用户启动容器。这就使得 Podman 在锁定环境场景中具有了超越 Docker 的优势。 话虽如此,管理员们将无法以非特权用户身份在主机系统上执行任何需要 root 权限的命令。这包括映射主机上低于 1024 的任何特权端口号,以及默认的 HTTP 端口号 80。
此外,Docker 和 Podman 都使用 CLI 作为主要管理界面。但是,Docker 使用 REST API 终端与守护进程进行通信,且较旧的版本使用绑定到本机 IP 地址的 TCP socket 通信。这为跨站伪造利用提供了一个 潜在的攻击面。Docker 在 0.5.2 版本中通过引入 UNIX socket 解决了这个漏洞(管理员可以使用传统的 UNIX 权限进行控制,以限制访问)。考虑到 Podman 不依赖守护进程,因此不易受到此类攻击的影响。

容器编排

在容器编排方面,Kubernetes 已经成为占据主导地位的参与者。VMware 已采用 Kubernetes 作为 VM 以及连接到运行中的容器的所有其他设备的主要管理平台。 Kubernetes 使用术语 pod 来定义共享某些资源的容器集合。Podman 通过实现 pod 命令,将多个容器作为一个实体进行管理,从而支持相同的概念。
同样,Docker 为容器编排提供了多个选项。Docker Swarm 是 Docker 维护的用于管理集群的本地工具。Docker 还与 Kubernetes 集成得很好,这是大多数开发团队的主流选择。 对于 Windows 部署,管理员可以选择在安装过程中启用 Kubernetes,从而可以从管理员的台式机或笔记本电脑直接访问 Kubernetes 命令。
更进一步来说,管理员可以围绕持续集成和持续部署(CI/CD)模型构建他们的应用程序,在该模型中,开发和测试工作可以基于一些简单的配置文件在任何地方进行。当管理员准备将发布推送到生产环境时,只需执行几个额外的步骤即可更改部署目标。
Podman 和 Docker 都符合 OCI 镜像标准,但仅就安全特性而言,Podman 是 值得一试的。Podman 还提供了本地命令来支持 pod 的构建和测试,从而着眼于部署到一个运行 Kubernetes 的生产系统中。

二、部署podman与配置

Linux版本安装实例:

其他版本

CentOS

Podman 在 CentOS 7 的默认 Extras 存储库和 CentOS 8 和 Stream 的 AppStream 存储库中可用。

yum -y install podman

RHEL7

订阅,然后启用 Extras 频道并安装 Podman。

  1. sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
  2. sudo yum -y install podman

RHEL8

Podmancontainer-tools与 Buildah 和 Skopeo 一起包含在模块中。

  1. sudo yum module enable -y container-tools:rhel8
  2. sudo yum module install -y container-tools:rhel8

container-tools:rhel8是快速应用程序流,包含工具的最新滚动版本。将container-tools:2.0流用于 Podman 1.6 的稳定版本。该命令yum module list container-tools显示可用的流。

配置文件

  1. [root@103 ~]# vim /etc/containers/registries.conf
  2. ...以上多行省略
  3. # # An array of host[:port] registries to try when pulling an unqualified image, in order.
  4. unqualified-search-registries = ["docker.io"] //修改此行
  5. [[registry]]
  6. prefix="docker.io"
  7. location = "docker.mirrors.ustc.edu.cn" //修改此三行
  8. ...以下多行省略

三、podman常用操作

3.1 podman --help

要获得一些帮助并了解 Podman 的工作方式,您可以使用帮助

  1. $ podman --help
  2. $ podman <subcommand> --help

有关更多详细信息,您可以查看联机帮助页:

  1. $ man podman
  2. $ man podman-<subcommand>

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

  1. [root@103 ~]# podman --help
  2. Manage pods, containers and images
  3. 管理豆荚,容器和图像
  4. Usage:
  5. 用法:
  6. podman [options] [command]
  7. podman[选项](命令)
  8. Available Commands:
  9. 可用命令:
  10. attach Attach to a running container
  11. 附加到运行容器
  12. auto-update Auto update containers according to their auto-update policy
  13. Auto -update根据容器的自动更新策略自动更新容器
  14. build Build an image using instructions from Containerfiles
  15. 使用容器文件中的指令构建映像
  16. commit Create new image based on the changed container
  17. commit根据更改的容器创建新的映像
  18. container Manage containers
  19. 容器管理的容器
  20. cp Copy files/folders between a container and the local filesystem
  21. cp在容器和本地文件系统之间复制文件/文件夹
  22. create Create but do not start a container
  23. create创建但不启动容器
  24. diff Display the changes to the object's file system
  25. diff显示对对象文件系统的更改
  26. events Show podman events
  27. events显示podman事件
  28. exec Run a process in a running container
  29. 在运行的容器中运行进程
  30. export Export container's filesystem contents as a tar archive
  31. export将容器的文件系统内容导出为tar存档文件
  32. generate Generate structured data based on containers, pods or volumes.
  33. 生成基于容器、荚或卷的结构化数据。
  34. healthcheck Manage health checks on containers
  35. healthcheck管理容器的运行状况检查
  36. help Help about any command
  37. help表示对任何命令的帮助
  38. history Show history of a specified image
  39. history显示指定图像的历史记录
  40. image Manage images
  41. 图像处理图像
  42. images List images in local storage
  43. images列出本地存储中的图像
  44. import Import a tarball to create a filesystem image
  45. import通过导入tarball来创建文件系统映像
  46. info Display podman system information
  47. info显示podman系统信息
  48. init Initialize one or more containers
  49. 初始化一个或多个容器
  50. inspect Display the configuration of object denoted by ID
  51. inspect显示ID表示的对象配置信息
  52. kill Kill one or more running containers with a specific signal
  53. kill使用特定信号杀死一个或多个正在运行的容器
  54. load Load image(s) from a tar archive
  55. load从tar存档文件中加载图像
  56. login Login to a container registry
  57. login登录到容器注册表
  58. logout Logout of a container registry
  59. logout容器注册表的注销
  60. logs Fetch the logs of one or more containers
  61. logs获取一个或多个容器的日志
  62. machine Manage a virtual machine
  63. machine管理虚拟机
  64. manifest Manipulate manifest lists and image indexes
  65. 操作清单列表和图像索引
  66. mount Mount a working container's root filesystem
  67. 挂载一个工作容器的根文件系统
  68. network Manage networks
  69. 网络管理网络
  70. pause Pause all the processes in one or more containers
  71. 暂停一个或多个容器中的所有进程
  72. play Play containers, pods or volumes from a structured file.
  73. 从一个结构化文件中播放容器、豆荚或卷。
  74. pod Manage pods
  75. 豆荚管理豆荚
  76. port List port mappings or a specific mapping for the container
  77. port列出容器的端口映射或特定映射
  78. ps List containers
  79. ps 列表容器
  80. pull Pull an image from a registry
  81. pull从注册表中提取一个图像
  82. push Push an image to a specified destination
  83. push将映像推送到指定的目的地
  84. rename Rename an existing container
  85. rename重命名现有容器
  86. restart Restart one or more containers
  87. restart重启一个或多个容器
  88. rm Remove one or more containers
  89. 删除一个或多个容器
  90. rmi Removes one or more images from local storage
  91. rmi从本地存储中删除一个或多个映像
  92. run Run a command in a new container
  93. 在新容器中运行命令
  94. save Save image(s) to an archive
  95. save将图像保存到存档中
  96. search Search registry for image
  97. search搜索图像注册表
  98. secret Manage secrets
  99. 保密管理的秘密
  100. start Start one or more containers
  101. start启动一个或多个容器
  102. stats Display a live stream of container resource usage statistics
  103. stats显示实时的容器资源使用统计信息流
  104. stop Stop one or more containers
  105. stop停止一个或多个容器
  106. system Manage podman
  107. 系统管理podman
  108. tag Add an additional name to a local image
  109. tag为本地图像添加额外的名称
  110. top Display the running processes of a container
  111. top显示容器的运行进程
  112. unmount Unmounts working container's root filesystem
  113. 卸载工作容器的根文件系统
  114. unpause Unpause the processes in one or more containers
  115. unpause取消一个或多个容器中的进程
  116. unshare Run a command in a modified user namespace
  117. unshare在修改后的用户命名空间中执行命令
  118. untag Remove a name from a local image
  119. untag从本地映像中删除一个名称
  120. version Display the Podman Version Information
  121. version显示Podman版本信息
  122. volume Manage volumes
  123. 卷管理卷
  124. wait Block on one or more containers
  125. wait一个或多个容器的Block

3.2 定义别名

  1. [root@103 ~]# alias docker=podman
  2. [root@103 ~]# podman ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 5a498cd2bbd9 docker.io/library/httpd:latest httpd-foreground 2 hours ago Up 2 hours ago 0.0.0.0:80->80/tcp optimistic_goldberg
  5. 07355b10b4ec docker.io/library/nginx:latest nginx -g daemon o... 2 hours ago Up 2 hours ago clever_shamir
  6. [root@103 ~]# docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. 5a498cd2bbd9 docker.io/library/httpd:latest httpd-foreground 2 hours ago Up 2 hours ago 0.0.0.0:80->80/tcp optimistic_goldberg
  9. 07355b10b4ec docker.io/library/nginx:latest nginx -g daemon o... 2 hours ago Up 2 hours ago clever_shamir

3.3 podman version 查看版本号

  1. [root@103 ~]# podman version
  2. Version: 3.3.1
  3. API Version: 3.3.1
  4. Go Version: go1.16.7
  5. Built: Wed Nov 10 05:23:56 2021
  6. OS/Arch: linux/amd64

3.4 podman info显示整个系统的信息

  1. [root@103 ~]# podman info
  2. host:
  3. arch: amd64
  4. buildahVersion: 1.22.3
  5. cgroupControllers:
  6. - cpuset
  7. - cpu
  8. - cpuacct
  9. - blkio
  10. - memory
  11. - devices
  12. - freezer
  13. - net_cls
  14. - perf_event
  15. - net_prio
  16. - hugetlb
  17. - pids
  18. - rdma
  19. cgroupManager: systemd
  20. cgroupVersion: v1
  21. conmon:
  22. package: conmon-2.0.29-1.module_el8.5.0+890+6b136101.x86_64
  23. path: /usr/bin/conmon
  24. version: 'conmon version 2.0.29, commit: 84384406047fae626269133e1951c4b92eed7603'
  25. cpus: 2
  26. distribution:
  27. distribution: '"centos"'
  28. version: "8"
  29. eventLogger: file
  30. hostname: "103"
  31. idMappings:
  32. gidmap: null
  33. uidmap: null
  34. kernel: 4.18.0-305.3.1.el8.x86_64
  35. linkmode: dynamic
  36. memFree: 2451640320
  37. memTotal: 3890188288
  38. ociRuntime:
  39. name: runc
  40. package: runc-1.0.2-1.module_el8.5.0+911+f19012f9.x86_64
  41. path: /usr/bin/runc
  42. version: |-
  43. runc version 1.0.2
  44. spec: 1.0.2-dev
  45. go: go1.16.7
  46. libseccomp: 2.5.1
  47. os: linux
  48. remoteSocket:
  49. path: /run/podman/podman.sock
  50. security:
  51. apparmorEnabled: false
  52. capabilities: CAP_NET_RAW,CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
  53. rootless: false
  54. seccompEnabled: true
  55. seccompProfilePath: /usr/share/containers/seccomp.json
  56. selinuxEnabled: false
  57. serviceIsRemote: false
  58. slirp4netns:
  59. executable: /usr/bin/slirp4netns
  60. package: slirp4netns-1.1.8-1.module_el8.5.0+890+6b136101.x86_64
  61. version: |-
  62. slirp4netns version 1.1.8
  63. commit: d361001f495417b880f20329121e3aa431a8f90f
  64. libslirp: 4.4.0
  65. SLIRP_CONFIG_VERSION_MAX: 3
  66. libseccomp: 2.5.1
  67. swapFree: 4227854336
  68. swapTotal: 4227854336
  69. uptime: 2h 54m 23.24s (Approximately 0.08 days)
  70. registries:
  71. search:
  72. - registry.fedoraproject.org
  73. - registry.access.redhat.com
  74. - registry.centos.org
  75. - docker.io
  76. - 81f6nfv3.mirror.aliyuncs.com
  77. store:
  78. configFile: /etc/containers/storage.conf
  79. containerStore:
  80. number: 2
  81. paused: 0
  82. running: 2
  83. stopped: 0
  84. graphDriverName: overlay
  85. graphOptions:
  86. overlay.mount_program:
  87. Executable: /usr/bin/fuse-overlayfs
  88. Package: fuse-overlayfs-1.7.1-1.module_el8.5.0+890+6b136101.x86_64
  89. Version: |-
  90. fusermount3 version: 3.2.1
  91. fuse-overlayfs: version 1.7.1
  92. FUSE library version 3.2.1
  93. using FUSE kernel interface version 7.26
  94. overlay.mountopt: nodev,metacopy=on
  95. graphRoot: /var/lib/containers/storage
  96. graphStatus:
  97. Backing Filesystem: xfs
  98. Native Overlay Diff: "false"
  99. Supports d_type: "true"
  100. Using metacopy: "false"
  101. imageStore:
  102. number: 3
  103. runRoot: /run/containers/storage
  104. volumePath: /var/lib/containers/storage/volumes
  105. version:
  106. APIVersion: 3.3.1
  107. Built: 1636493036
  108. BuiltTime: Wed Nov 10 05:23:56 2021
  109. GitCommit: ""
  110. GoVersion: go1.16.7
  111. OsArch: linux/amd64
  112. Version: 3.3.1

3.5 podman search 查找镜像

  1. // 精准查找docker仓库官方源
  2. [root@103 ~]# podman search apache --filter=is-official
  3. INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  4. docker.io docker.io/library/httpd The Apache HTTP Server Project 3794 [OK]
  5. //默认查找
  6. [root@103 ~]# podman search apache
  7. INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  8. redhat.com registry.access.redhat.com/rhscl/httpd-24-rhel7 Apache HTTP 2.4 Server 0
  9. redhat.com registry.access.redhat.com/rhscl/php-70-rhel7 PHP 7.0 platform for building and running ap... 0
  10. redhat.com registry.access.redhat.com/openshift3/php-55-rhel7 PHP 5.5 platform for building and running ap... 0
  11. redhat.com registry.access.redhat.com/rhscl/php-71-rhel7 PHP 7.1 available as container is a base pla... 0
  12. redhat.com registry.access.redhat.com/ubi7/php-72 Apache 2.4 with PHP 7.2 0
  13. redhat.com registry.access.redhat.com/ubi8/php-72 Platform for building and running PHP 7.2 ap... 0
  14. redhat.com registry.access.redhat.com/ubi8/php-73 Platform for building and running PHP 7.3 ap... 0
  15. redhat.com registry.access.redhat.com/ubi7/php-73 Platform for building and running PHP 7.3 ap... 0
  16. redhat.com registry.access.redhat.com/ubi8/httpd-24 Platform for running Apache httpd 2.4 or bui... 0
  17. redhat.com registry.access.redhat.com/rhscl/perl-526-rhel7 Perl 5.26 available as container is a base p... 0
  18. redhat.com registry.access.redhat.com/rhscl/perl-524-rhel7 Platform for building and running Perl 5.24 ... 0
  19. redhat.com registry.access.redhat.com/rhscl/perl-520-rhel7 Perl 5.20 platform for building and running ... 0
  20. redhat.com registry.access.redhat.com/openshift3/perl-516-rhel7 Perl 5.16 platform for building and running ... 0
  21. redhat.com registry.access.redhat.com/rhscl/php-72-rhel7 PHP 7.2 available as container is a base pla... 0
  22. redhat.com registry.access.redhat.com/ubi8/perl-526 Platform for building and running Perl 5.26 ... 0
  23. redhat.com registry.access.redhat.com/ubi8/perl-530 Platform for building and running Perl 5.26 ... 0
  24. redhat.com registry.access.redhat.com/ubi8/php-74 Platform for building and running PHP 7.4 ap... 0
  25. redhat.com registry.access.redhat.com/amqstreams-1-tech-preview/amqstreams10-kafkaconnect-openshift AMQ Streams image for running an Apache Kafk... 0
  26. redhat.com registry.access.redhat.com/amqstreams-1/amqstreams10-kafka-openshift AMQ Streams image for running an Apache Kafk... 0
  27. redhat.com registry.access.redhat.com/amqstreams-1/amqstreams10-kafkaconnect-openshift AMQ Streams image for running an Apache Kafk... 0
  28. redhat.com registry.access.redhat.com/amqstreams-1/amqstreams10-kafkamirrormaker-openshift AMQ Streams image for running an Apache Kafk... 0
  29. redhat.com registry.access.redhat.com/amq7/amq-streams-kafka-connect AMQ Streams image for running an Apache Kafk... 0
  30. redhat.com registry.access.redhat.com/amq7/amq-streams-zookeeper AMQ Streams image for running an Apache Zook... 0
  31. redhat.com registry.access.redhat.com/amqstreams-1-tech-preview/amqstreams10-kafka-openshift AMQ Streams image for running an Apache Kafk... 0
  32. redhat.com registry.access.redhat.com/amqstreams-1-tech-preview/amqstreams10-zookeeper-openshift AMQ Streams image for running an Apache Zook... 0
  33. docker.io docker.io/apache/airflow Apache Airflow 305
  34. docker.io docker.io/webdevops/apache Apache container 15 [OK]
  35. docker.io docker.io/lephare/apache Apache container 6 [OK]

3.6 podman pull 拉镜像

  1. [root@103 ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. [root@103 ~]# podman pull docker.io/library/busybox
  4. Trying to pull docker.io/library/busybox:latest...
  5. Getting image source signatures
  6. Copying blob 3cb635b06aa2 [--------------------------] 0.0b / 0.0b
  7. Copying config ffe9d497c3 done
  8. Writing manifest to image destination
  9. Storing signatures
  10. ffe9d497c32414b1c5cdad8178a85602ee72453082da2463f1dede592ac7d5af
  11. [root@103 ~]# docker images
  12. REPOSITORY TAG IMAGE ID CREATED SIZE
  13. docker.io/library/busybox latest ffe9d497c324 6 days ago 1.46 MB

3.7 podman run 运行容器

  1. [root@103 ~]# podman run -dt -p 80:80 docker.io/library/httpd
  2. 179cf360121b45104e6ab3e7016f28e93bb61dfe33fa6f63c79ff46c592f9a7b
  3. [root@103 ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 179cf360121b docker.io/library/httpd:latest httpd-foreground 7 seconds ago Up 7 seconds ago 0.0.0.0:80->80/tcp unruffled_bhaskara
  6. [root@103 ~]# podman inspect 179cf360121b |grep -i address
  7. "IPAddress": "10.88.0.5",
  8. "GlobalIPv6Address": "",
  9. "MacAddress": "ca:2a:64:71:a6:62",
  10. "LinkLocalIPv6Address": "",
  11. "IPAddress": "10.88.0.5",
  12. "GlobalIPv6Address": "",
  13. "MacAddress": "ca:2a:64:71:a6:62",
  14. [root@103 ~]# curl 10.88.0.5
  15. <html><body><h1>It works!</h1></body></html>
  16. [root@103 ~]# curl 192.168.143.103
  17. <html><body><h1>It works!</h1></body></html>

3.8 podman inspectl 查看容器详细信息

  1. //-l 查看最新的容器信息,由于容器在无根模式下运行,因此不会为容器分配 IP 地址
  2. [root@103 ~]# podman inspect -l
  3. ...以下省略
  4. "SandboxKey": "/run/netns/cni-dca4250d-d6c4-bb84-eda5-02bc93a3b08d",
  5. "Networks": {
  6. "podman": {
  7. "EndpointID": "",
  8. "Gateway": "10.88.0.1",
  9. "IPAddress": "10.88.0.5",
  10. "IPPrefixLen": 16,
  11. "IPv6Gateway": "",
  12. ....以下省略

3.9 podman logs(查看容器日志)

  1. [root@103 ~]# podman logs -l
  2. AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.5. Set the 'ServerName' directive globally to suppress this message
  3. AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.5. Set the 'ServerName' directive globally to suppress this message
  4. [Tue Dec 14 15:21:53.610480 2021] [mpm_event:notice] [pid 1:tid 139697995017536] AH00489: Apache/2.4.51 (Unix) configured -- resuming normal operations
  5. [Tue Dec 14 15:21:53.621921 2021] [core:notice] [pid 1:tid 139697995017536] AH00094: Command line: 'httpd -D FOREGROUND'
  6. 10.88.0.1 - - [14/Dec/2021:15:24:59 +0000] "GET / HTTP/1.1" 200 45
  7. 192.168.143.103 - - [14/Dec/2021:15:25:06 +0000] "GET / HTTP/1.1" 200 45

3.10 podman top 查看容器 pid

  1. [root@103 ~]# podman top -l
  2. USER PID PPID %CPU ELAPSED TTY TIME COMMAND
  3. root 1 0 0.000 8m13.884400188s pts/0 0s httpd -DFOREGROUND
  4. www-data 8 1 0.000 8m13.885412378s pts/0 0s httpd -DFOREGROUND
  5. www-data 9 1 0.000 8m13.886299432s pts/0 0s httpd -DFOREGROUND
  6. www-data 10 1 0.000 8m13.886836237s pts/0 0s httpd -DFOREGROUND

3.11 podman push 上传镜像

  1. // 登出用户
  2. [root@103 ~]# podman logout docker.io
  3. Removed login credentials for docker.io
  4. // 登入用户
  5. [root@103 ~]# podman login docker.io
  6. Username: hyhxy0206
  7. Password:
  8. Login Succeeded!
  9. [root@103 ~]# cat /run/user/0/containers/auth.json
  10. {
  11. "auths": {
  12. "docker.io": { //镜像官网
  13. "auth": "aHloeHkwMjA2OjEzODg2NjAwMjQ4aHku"
  14. }
  15. }
  16. }
  17. // 修改镜像标签
  18. [root@103 ~]# podman tag docker.io/library/httpd:latest docker.io/hyhxy0206/httpd:latest
  19. // 上传镜像
  20. [root@103 ~]# podman push docker.io/hyhxy0206/httpd:latest

四、podman普通用户使用

4.1 podman普通用户使用实例

  1. // 关闭防火墙和selinux
  2. [root@103 ~]# systemctl disable --now firewalld
  3. [root@103 ~]# vim /etc/selinux/config
  4. SELINUX=disabled //修改此行
  5. [root@103 ~]# reboot
  6. [root@103 ~]# getenforce
  7. Disabled
  8. [root@103 ~]# yum install -y podman
  9. [root@103 ~]# vim /etc/containers/storage.conf
  10. mount_program = "/usr/bin/fuse-overlayfs" //取消注释
  11. [root@103 ~]# yum install -y crun
  12. [root@103 ~]# vim /usr/share/containers/containers.conf
  13. runtime = "crun" //修改此行
  14. #runtime = "runc" //修改此行
  15. [root@103 ~]# useradd abc
  16. [root@103 ~]# su - abc
  17. [abc@103 ~]$ podman run -it busybox /bin/sh
  18. Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
  19. Trying to pull docker.io/library/busybox:latest...
  20. Getting image source signatures
  21. Copying blob 3cb635b06aa2 done
  22. Copying config ffe9d497c3 done
  23. Writing manifest to image destination
  24. Storing signatures
  25. / # exit

Podman 在无root环境中的基本设置和使用。

在允许没有 root 权限的用户运行 Podman 之前,管理员必须安装或构建 Podman 并完成以下配置。

cgroup V2 支持

cgroup V2 Linux 内核功能允许用户限制无根容器可以使用的资源量。如果您运行 Podman 的 Linux 发行版启用了 cgroup V2,那么您可能需要更改默认的 OCI 运行时。一些旧版本 runc不能与 cgroup V2 一起使用,您可能必须切换到替代的 OCI 运行时 crun
  1. // 默认是有crun软件包,没有grep到需要
  2. yum -y install crun
  3. [root@103 ~]# yum list all|grep crun
  4. Repository salt-latest-repo is listed more than once in the configuration
  5. crun.x86_64 1.0-1.module_el8.5.0+911+f19012f9 appstream

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

podman --runtime crun

或用于通过改变用于在“默认OCI运行时”的值的所有的命令containers.conf在系统级或在任一文件的用户级别runtime = "runc"runtime = "crun"

  1. [root@103 ~]# vim /usr/share/containers/containers.conf
  2. .....以上多行省略
  3. runtime = "crun" # 找到此行取消注释
  4. ......以下多行省略

4.2 管理员操作

4.2.1 安装 Podman

如需安装 Podman,请参阅安装说明

4.2.2 构建Podman

Podman 的搭建请看安装说明

4.2.3 安装 slirp4netns

  1. //默认是有slirp4netns软件包,没有grep到需要
  2. yum -y install slirp4netns
  3. [root@103 ~]# yum list all|grep slirp4netns
  4. Repository salt-latest-repo is listed more than once in the configuration
  5. slirp4netns.x86_64 1.1.8-1.module_el8.5.0+890+6b136101 @appstream
所述 slirp4netns包提供了一种用于无特权的网络名称空间用户模式网络和必须在机器上,以便安装用于Podman在一个无根环境中运行。该包通过他们的包分发软件,如可在大多数Linux发行版 yumdnfaptzypper,等等。如果没有可用的package,您可以构建和安装 slirp4netnsGitHub上

4.2.4 确保fuse-overlayfs已安装

在rootless环境下使用Podman时,建议使用fuse-overlayfs而不是VFS文件系统。对于你所需要的fuse-overlayfs可执行文件提供$PATH

  1. //默认是有fuse-overlayfs软件包,没有grep到需要
  2. yum -y install fuse-overlayfs
  3. [root@103 ~]# yum list all|grep fuse-overlayfs
  4. Repository salt-latest-repo is listed more than once in the configuration
  5. fuse-overlayfs.x86_64 1.7.1-1.module_el8.5.0+890+6b136101 @appstream

4.2.5 配置 storage.conf文件

  1. [root@103 ~]# vim /etc/containers/storage.conf
  2. ....以上多行省略
  3. # Path to an helper program to use for mounting the file system instead of mounting it
  4. # directly.
  5. mount_program = "/usr/bin/fuse-overlayfs" //取消注释
  6. ....以下多行省略

4.2.6 /etc/subuid和/etc/subgid配置

Rootless Podman 要求运行它的用户在文件/etc/subuid/etc/subgid. 的shadow-utilsnewuid包提供关于不同分布这些文件和它们必须在系统上安装。在这些文件中添加或更新条目需要 root 权限。以下是从无根 Podman如何工作的?Dan Walsh 在opensource.com上的文章

对于将被允许创建容器,更新每一个用户/etc/subuid,并/etc/subgid与看起来像以下字段用户。请注意,每个用户的值必须是唯一的。如果存在重叠,用户就有可能使用另一个用户的命名空间,并且他们可能会破坏它。

  1. [root@103 ~]# useradd tom
  2. [root@103 ~]# useradd jerry
  3. [root@103 ~]# cat /etc/subuid
  4. tom:100000:65536
  5. jerry:165536:65536
  6. [root@103 ~]# cat /etc/subgid
  7. tom:100000:65536
  8. jerry:165536:65536

这个文件的格式是 USERNAME:UID:RANGE

  • /etc/passwd或输出中列出的用户名getpwent

  • 为用户分配的初始 UID。

  • 为用户分配的 UID 范围的大小。

这意味着为用户johndoe分配了 UID 100000-165535 以及/etc/passwd文件中的标准 UID 。注意:网络安装当前不支持此功能;这些文件必须在主机本地可用。无法使用 LDAP 或 Active Directory 进行配置。

如果您更新/etc/subuid/etc/subgid,则需要停止该用户拥有的所有正在运行的容器并终止该用户在系统上运行的暂停进程。这可以通过使用podman system migrate命令自动完成,该命令将为用户停止所有容器并终止暂停进程。

usermod程序可用于为用户分配 UID 和 GID,而不是直接更新文件。

  1. usermod --add-subuids 200000-201000 --add-subgids 200000-201000 johndoe
  2. grep johndoe /etc/subuid /etc/subgid
  3. /etc/subuid:johndoe:200000:1001
  4. /etc/subgid:johndoe:200000:1001
  5. //更新文件方法,直接修改内容
  6. [root@103 ~]# vim /etc/subuid

4.2.7 启用非特权 ping

在非特权容器中运行的用户可能无法使用该ping容器中的实用程序。
如果需要,管理员必须验证用户的 UID 是否在 /proc/sys/net/ipv4/ping_group_range文件范围内。
要改变它的值,管理员可以使用类似的电话: sysctl -w "net.ipv4.ping_group_range=0 2000000"
为了使更改保持不变,管理员需要添加一个文件 .conf扩展名为 /etc/sysctl.dcontains的文件 net.ipv4.ping_group_range=0 $MAX_GID,其中 $MAX_GID是运行容器的用户的最高可分配 GID。
  1. //永久配置
  2. [root@103 ~]# vim /etc/sysctl.conf
  3. ....以上多行忽略
  4. sysctl -w "net.ipv4.ping_group_range=0 2000000" //添加此行到最后

4.2.8 用户操作

在无root环境中运行 Podman 所需的大部分工作都由机器管理员承担。
一旦管理员完成了机器上的设置,然后在 /etc/subuid/etc/subgid中完成了用户的配置,用户就可以开始使用他们想要的任何 Podman 命令。

4.2.9 用户配置文件

根驻留在Podman配置文件 /usr/share/containers与覆盖 /etc/containers。在无root环境中,它们驻留在 ${XDG_CONFIG_HOME}/containers(通常 ~/.config/containers)中并由每个单独的用户拥有。
三个主要的配置文件是 container.confstorage.confregistries.conf。用户可以根据需要修改这些文件。

containers.conf 容器配置

Podman reads

  1. /usr/share/containers/containers.conf

  1. /etc/containers/containers.conf

  1. $HOME/.config/containers/containers.conf

如果它们以该顺序存在。每个文件都可以覆盖特定字段的前一个文件。

storage.conf 存储配置

在storage.conf顺序是

  1. /etc/containers/storage.conf

  1. $HOME/.config/containers/storage.conf

在无root Podman 中,某些字段/etc/containers/storage.conf被忽略。这些字段是:

  1. graphroot=""
  2. container storage graph dir (default: "/var/lib/containers/storage")
  3. Default directory to store all writable content created by container storage programs.
  4. runroot=""
  5. container storage run dir (default: "/run/containers/storage")
  6. Default directory to store all temporary writable content created by container storage programs.

在无root Podman 中,这些字段默认为

  1. graphroot="$HOME/.local/share/containers/storage"
  2. runroot="$XDG_RUNTIME_DIR/containers"

[KaTeX parse error: Expected 'EOF', got '#' at position 94: …pec-latest.html#̲variables) defa…UID`.

registries.conf 注册表配置

  1. [root@103 ~]# vim /etc/containers/registries.conf
  2. ...以上多行省略
  3. # # An array of host[:port] registries to try when pulling an unqualified image, in order.
  4. unqualified-search-registries = ["docker.io"] //修改此行
  5. [[registry]]
  6. prefix="docker.io"
  7. location = "docker.mirrors.ustc.edu.cn" //修改此三行
  8. ...以下多行省略

registries 注册表

注册表配置按此顺序读入

  1. /etc/containers/registries.conf

  1. /etc/containers/registries.d/*

  1. HOME/.config/containers/registries.conf

主目录中的文件应该用于根据个人需要配置无root Podman。默认情况下不会创建这些文件。用户可以从中复制/usr/share/containers/etc/containers修改文件。

Authorization files 授权文件

podman loginpodman logout命令使用的默认授权文件位于${XDG_RUNTIME_DIR}/containers/auth.json.

  1. [root@103 ~]# cat /run/user/0/containers/auth.json
  2. {
  3. "auths": {
  4. "docker.io": {
  5. "auth": "aHloeHkwMjA2OjEzODg2NjAwMxxxxx" //授权key
  6. }
  7. }

使用卷

无根 Podman 不是,也永远不会是根;它不是setuid二进制文件,运行时不会获得任何特权。相反,Podman 使用用户命名空间来移动它在主机上(通过newuidmap和newgidmap可执行文件)和您自己的用户在 Podman 创建的容器中有权访问的用户块的 UID 和 GID 。
如果您的容器以 root 用户运行,那么root在容器中实际上是您在主机上的用户。UID / GID 1是第一个UID / GID在用户在地图中指定/etc/subuid和/etc/subgid等,如果你安装来自主机的目录放入容器中作为一个无根的用户,并在容器中创建该目录中的文件作为根,你会看到它实际上由您的用户在主机上拥有。

所以,例如,

  1. //普通用户和root用户,创建容器都有root权限
  2. [tom@103 ~]$ mkdir data
  3. [tom@103 ~]$ podman run -it -v /home/tom/data/:/data busybox /bin/sh
  4. / # ls
  5. bin dev home root sys usr
  6. data etc proc run tmp var
  7. / # cd data/
  8. /data # touch abc
  9. /data # ls -l
  10. total 0
  11. -rw-r--r-- 1 root root 0 Dec 15 09:02 abc
  12. [root@103 ~]# ll /home/tom/data/
  13. 总用量 0
  14. [root@103 ~]# ll /home/tom/data/
  15. 总用量 0
  16. -rw-r--r-- 1 tom tom 0 12月 15 17:02 abc
  17. //容器使用普通权限--userns=keep-id -v
  18. [tom@103 ~]$ podman run -it --userns=keep-id -v /home/tom/data/:/data busybox /bin/sh
  19. ~ $ id
  20. uid=1000(tom) gid=1000(tom)
我们确实认识到这与有多少人打算使用无根 Podman 并不真正匹配——他们希望容器内外的 UID 匹配。因此,我们提供了–userns=keep-id标志,以确保您的用户在容器内映射到其自己的 UID 和 GID。
区分以无根用户身份运行 Podman 和以无根用户身份运行的容器也很有帮助。如果您尝试运行的容器USER不是 root,则在安装卷时必须使用–userns=keep-id. 这是因为容器用户将无法成为root和访问已安装的卷。
关于体积的其他注意事项:
您应该始终提供要安装的卷的完整路径
挂载点必须存在于容器中

五、Podman 基本网络

5.1 rootfull 和 rootless 容器网络之间的差异

Podman 容器联网的指导因素之一将是容器是否由 root 用户运行。这是因为非特权用户无法在主机上创建网络接口。因此,对于 rootfull 容器,默认网络模式是使用容器网络接口 (CNI) 插件,特别是桥接插件。对于rootless,默认的网络模式是slirp4netns。由于权限有限,slirp4netns缺少CNI组网的一些功能;例如,slirp4netns 无法为容器提供可路由的 IP 地址。

5.2 自定义配置网络

  • podman network create 创建网络

  • 修改 /etc/cni/net.d/xxxx.conflist 配置文件

  • 修改设置/usr/share/containers/containers.conf 将其为默认网络

  1. // 创建网络
  2. [root@103 ~]# podman network create web
  3. /etc/cni/net.d/web.conflist
  4. [root@103 ~]# podman network ls
  5. NETWORK ID NAME VERSION PLUGINS
  6. 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuning
  7. 4b5e57f6eb2f web 0.4.0 bridge,portmap,firewall,tuning
  8. //修改配置文件
  9. [root@103 ~]# vim /etc/cni/net.d/web.conflist
  10. .....以上多行忽略
  11. "ranges": [
  12. [
  13. {
  14. "subnet": "192.168.0.0/24", //修改ip和网段
  15. "gateway": "192.168.0.1" //修改网关
  16. }
  17. ]
  18. ]
  19. }
  20. },
  21. ......以下多行忽略
  22. //修改/usr/share/containers/containers.conf 将其为默认网络
  23. [root@103 ~]# vim /usr/share/containers/containers.conf
  24. .....以上多行忽略
  25. #default_network = "podman"
  26. default_network = "newk" # 添加此行
  27. .....以下多行忽略
  28. //查看容器内ip是否修改
  29. [root@103 ~]# podman run -dit --name web busybox
  30. 72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da
  31. [root@103 ~]# podman exec -it web busybox /bin/sh
  32. / # ip a
  33. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
  34. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  35. inet 127.0.0.1/8 scope host lo
  36. valid_lft forever preferred_lft forever
  37. inet6 ::1/128 scope host
  38. valid_lft forever preferred_lft forever
  39. 2: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
  40. link/ether da:8a:c6:88:15:99 brd ff:ff:ff:ff:ff:ff
  41. inet 192.143.0.3/24 brd 192.143.0.255 scope global eth0
  42. valid_lft forever preferred_lft forever
  43. inet6 fe80::d88a:c6ff:fe88:1599/64 scope link
  44. valid_lft forever preferred_lft forever
  45. / # ping baidu.com
  46. PING baidu.com (220.181.38.148): 56 data bytes
  47. 64 bytes from 220.181.38.148: seq=0 ttl=127 time=71.297 ms
  48. 64 bytes from 220.181.38.148: seq=1 ttl=127 time=113.138 ms
  49. ^C
  50. --- baidu.com ping statistics ---
  51. 2 packets transmitted, 2 packets received, 0% packet loss
  52. round-trip min/avg/max = 71.297/92.217/113.138 ms

5.3 防火墙

Podman v3 提供了 podman network reload 命令来恢复它而无需重新启动容器。

  1. // 查看防火墙 这是刚刚的web容器
  2. [root@103 ~]# iptables -t nat -nvL
  3. Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
  4. pkts bytes target prot opt in out source destination
  5. Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
  6. pkts bytes target prot opt in out source destination
  7. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
  8. pkts bytes target prot opt in out source destination
  9. 3 194 CNI-f9a8f05c08d563e317d13b55 all -- * * 192.143.0.3 0.0.0.0/0 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */
  10. Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
  11. pkts bytes target prot opt in out source destination
  12. Chain CNI-f9a8f05c08d563e317d13b55 (1 references)
  13. pkts bytes target prot opt in out source destination
  14. 0 0 ACCEPT all -- * * 0.0.0.0/0 192.143.0.0/24 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */
  15. 3 194 MASQUERADE all -- * * 0.0.0.0/0 !224.0.0.0/4 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */
  16. [root@103 ~]#
  17. // 此时停止容器,查看防火墙规则
  18. [root@103 ~]# iptables -t nat -nvL
  19. Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
  20. pkts bytes target prot opt in out source destination
  21. Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
  22. pkts bytes target prot opt in out source destination
  23. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
  24. pkts bytes target prot opt in out source destination
  25. Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
  26. pkts bytes target prot opt in out source destination
  27. //清空防火墙,重新加载防火墙,iptables -t nat -F
  28. [root@103 ~]# iptables -t nat -nvL
  29. Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
  30. pkts bytes target prot opt in out source destination
  31. Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
  32. pkts bytes target prot opt in out source destination
  33. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
  34. pkts bytes target prot opt in out source destination
  35. Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
  36. pkts bytes target prot opt in out source destination
  37. [root@103 ~]# iptables -t nat -nvL
  38. Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
  39. pkts bytes target prot opt in out source destination
  40. Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
  41. pkts bytes target prot opt in out source destination
  42. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
  43. pkts bytes target prot opt in out source destination
  44. 0 0 CNI-f9a8f05c08d563e317d13b55 all -- * * 192.143.0.4 0.0.0.0/0 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */
  45. Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
  46. pkts bytes target prot opt in out source destination
  47. Chain CNI-f9a8f05c08d563e317d13b55 (1 references)
  48. pkts bytes target prot opt in out source destination
  49. 0 0 ACCEPT all -- * * 0.0.0.0/0 192.143.0.0/24 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */
  50. 0 0 MASQUERADE all -- * * 0.0.0.0/0 !224.0.0.0/4 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */
  51. [root@103 ~]#
  52. [root@103 ~]# iptables -t nat -F
  53. [root@103 ~]# iptables --flush
  54. [root@103 ~]# iptables -t nat -nvL
  55. Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
  56. pkts bytes target prot opt in out source destination
  57. Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
  58. pkts bytes target prot opt in out source destination
  59. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
  60. pkts bytes target prot opt in out source destination
  61. Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
  62. pkts bytes target prot opt in out source destination
  63. Chain CNI-f9a8f05c08d563e317d13b55 (0 references)
  64. pkts bytes target prot opt in out source destination
  65. // 重启容器网络可以恢复规则
  66. [root@103 ~]# podman network reload web
  67. 72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da
  68. [root@103 ~]# iptables -t nat -nvL
  69. Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
  70. pkts bytes target prot opt in out source destination
  71. Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
  72. pkts bytes target prot opt in out source destination
  73. Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
  74. pkts bytes target prot opt in out source destination
  75. 0 0 CNI-f9a8f05c08d563e317d13b55 all -- * * 192.143.0.4 0.0.0.0/0 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */
  76. Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
  77. pkts bytes target prot opt in out source destination
  78. Chain CNI-f9a8f05c08d563e317d13b55 (1 references)
  79. pkts bytes target prot opt in out source destination
  80. 0 0 ACCEPT all -- * * 0.0.0.0/0 192.143.0.0/24 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */
  81. 0 0 MASQUERADE all -- * * 0.0.0.0/0 !224.0.0.0/4 /* name: "web" id: "72f20d93156c2e343e0a1631a351e9ba9b629cbfec74e017dd8a0274e34d76da" */

六、podman容器的开机自启

6.1 root用户

  1. [root@103 ~]# podman run -d -p 80:80 --name nginx nginx
  2. 24eea484af5ae4bf1b19905cfb2060d5a41209db17a74af8d83af8b948d69a4a
  3. [root@103 ~]# podman generate systemd --files --name nginx
  4. /root/container-nginx.service
  5. [root@103 ~]# ls
  6. anaconda-ks.cfg files minion-install.tar.gz
  7. container-nginx.service minion-install.sh soft
  8. [root@103 ~]# mv container-nginx.service /usr/lib/systemd/system/
  9. [root@103 ~]# podman stop nginx
  10. nginx
  11. [root@103 ~]# systemctl enable --now container-nginx.service
  12. Created symlink /etc/systemd/system/multi-user.target.wants/container-nginx.service → /usr/lib/systemd/system/container-nginx.service.
  13. Created symlink /etc/systemd/system/default.target.wants/container-nginx.service → /usr/lib/systemd/system/container-nginx.service.
  14. [root@103 ~]# podman ps
  15. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  16. 24eea484af5a docker.io/library/nginx:latest nginx -g daemon o... 2 minutes ago Up 6 seconds ago 0.0.0.0:80->80/tcp nginx
  17. [root@103 ~]# podman stop nginx
  18. nginx
  19. [root@103 ~]# reboot
  20. [root@103 ~]# podman ps
  21. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  22. 24eea484af5a docker.io/library/nginx:latest nginx -g daemon o... 4 minutes ago Up 36 seconds ago 0.0.0.0:80->80/tcp nginx
  23. [root@103 ~]# curl 192.168.143.103
  24. <!DOCTYPE html>
  25. <html>
  26. <head>
  27. <title>Welcome to nginx!</title>
  28. <style>
  29. html { color-scheme: light dark; }
  30. body { width: 35em; margin: 0 auto;
  31. font-family: Tahoma, Verdana, Arial, sans-serif; }
  32. </style>
  33. </head>
  34. <body>
  35. <h1>Welcome to nginx!</h1>
  36. <p>If you see this page, the nginx web server is successfully installed and
  37. working. Further configuration is required.</p>
  38. <p>For online documentation and support please refer to
  39. <a href="http://nginx.org/">nginx.org</a>.<br/>
  40. Commercial support is available at
  41. <a href="http://nginx.com/">nginx.com</a>.</p>
  42. <p><em>Thank you for using nginx.</em></p>
  43. </body>
  44. </html>

6.2 普通用户

  1. [C:\~]$ ssh tom@192.168.143.103
  2. // 启动容器
  3. [tom@103 ~]$ podman run -dit --name nginx nginx
  4. 7d9a9a90b3227efad71536f68c3b3bfe7e96bd9cb0e088311f7a11582aaa725b
  5. // 创建目录
  6. [tom@103 ~]$ mkdir -p ~/.config/systemd/user
  7. [tom@103 ~]$ cd ~/.config/systemd/user/
  8. // 生成service文件
  9. [tom@103 user]$ podman generate systemd --name nginx --files --new/home/tom/.config/systemd/user/container-nginx.service
  10. [tom@103 user]$ ls
  11. container-nginx.service
  12. // 给容器设置开机自启
  13. [tom@103 user]$ podman rm -f nginx
  14. 7d9a9a90b3227efad71536f68c3b3bfe7e96bd9cb0e088311f7a11582aaa725b
  15. [tom@103 user]$ systemctl --user daemon-reload
  16. [tom@103 user]$ systemctl --user enable --now container-nginx.service
  17. Created symlink /home/tom/.config/systemd/user/multi-user.target.wants/container-nginx.service → /home/tom/.config/systemd/user/container-nginx.service.
  18. Created symlink /home/tom/.config/systemd/user/default.target.wants/container-nginx.service → /home/tom/.config/systemd/user/container-nginx.service.
  19. [tom@node2 ~]$ podman ps -a
  20. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  21. dbb54f85b26d docker.io/library/nginx:latest nginx -g daemon o... 7 seconds ago Up 7 seconds ago nginx
  22. // 重启主机
  23. [root@103 ~]# reboot
  24. [C:\~]$ ssh tom@192.168.143.103
  25. [tom@103 ~]$ podman ps
  26. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  27. ed36c3723b9c docker.io/library/nginx:latest nginx -g daemon o... 6 seconds ago Up 6 seconds ago nginx
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/159068
推荐阅读
相关标签
  

闽ICP备14008679号