跳到主要内容

Podman Run 命令介绍

概要

一、概述

Podman 是一个开源的容器运行时工具,它允许用户在没有守护进程的情况下运行容器。Podman 是 Red Hat 开发的,旨在作为 Docker 的一个无守护进程的替代品,特别是在需要较少权限和更安全的环境中。podman run 命令用于从指定的镜像创建一个新的容器并运行它。

二、基本语法

podman run [OPTIONS] IMAGE [COMMAND][ARG...]

OPTIONS:可选参数,用于配置容器的行为。
IMAGE:要运行的容器镜像的名称或ID。
COMMAND:容器启动后要执行的命令(可选)。
ARG:传递给 COMMAND 的参数(可选)。

三、常用选项

-d, --detach:在后台运行容器并返回容器ID。
--name:为容器指定一个名称。
-v, --volume 或 --mount:挂载卷或绑定挂载。
-p, --publish:发布容器的端口到主机。
-e, --env:设置环境变量。
--rm:容器退出后自动删除容器。
-it:通常一起使用,-i 保持STDIN打开,-t 分配一个伪终端。
--privileged:给予容器扩展的权限。
--user:设置容器内的用户。
--network:设置容器的网络模式。

四、示例

运行一个基础的 nginx 容器并在后台启动

podman run -d nginx

运行一个名为 mycontainer 的基础 bash 容器

podman run --name mycontainer bash

将主机的 8080 端口映射到容器的 80 端口

podman run -p 8080:80 nginx

设置环境变量并运行容器

podman run -e "DEBUG=true" myapp

运行容器并挂载本地目录到容器内

podman run -v /my/local/dir:/container/dir nginx

以交互模式运行一个 bash 容器

podman run -it bash

五、注意事项

当使用 --rm 选项时,请确保您不需要在容器退出后保留任何数据或状态。
挂载卷或目录时,请确保主机上的路径存在并具有适当的权限。
在生产环境中,请谨慎使用 --privileged 选项,因为它会给予容器几乎与主机相同的权限。

六、总结

podman run 命令是 Podman 的核心功能之一,它允许用户轻松地从镜像创建并运行容器。通过结合各种选项和参数,您可以灵活地配置容器的行为以满足不同的需求。希望本手册能帮助您更好地理解和使用 podman run 命令。

描述

在新容器中运行一个进程。podman run 启动一个进程,它拥有自己的文件系统、网络,以及独立的进程树。用于启动进程的 image 可能定义了与将在容器中运行的进程、要暴露的网络等相关的默认设置,但 podman run 最终将控制权交给了启动容器的操作员或管理员。因此,podman run 比 Podman 的其他任何命令都有更多的选项。

如果 image 尚未加载,则 podman run 将像运行 podman pull image 一样,从存储库中拉取 image 及其所有依赖项,然后使用该映像启动容器。

几个文件将在容器中自动创建。这些包括 /etc/hosts/etc/hostname/etc/resolv.conf,用于管理网络。这些文件将基于主机上的文件版本,但可以使用选项进行自定义(例如,--dns 将覆盖主机 DNS 服务器在创建的 resolv.conf 中的设置)。此外,在每个容器中都会创建一个容器环境文件,以指示程序它们正在容器中运行。该文件位于 /run/.containerenv(对于 FreeBSD 容器,位于 /var/run/.containerenv)。当使用 --privileged 标志时,.containerenv 包含指示容器引擎版本、引擎是否在无根模式下运行、容器名称和 ID 以及容器基于的镜像名称和 ID 的名称/值对。注意:当在 /run 上挂载卷时,不会创建 /run/.containerenv

当从用户定义的网络命名空间运行时,如果存在 /etc/netns/NSNAME/resolv.conf,则将其使用,否则使用 /etc/resolv.conf

默认设置定义在 containers.conf 文件中。大多数远程连接的设置使用 servers 的 containers.conf,除非在手册页中有特别说明。

镜像

镜像使用 transport:path 格式指定。如果没有指定传输方式,则默认使用 docker(容器注册表)传输方式。对于远程 Podman,包括 Mac 和 Windows(不包括 WSL2)机器,docker 是唯一允许的传输方式。

dir:path 一个已存在的本地目录 path,用于存储清单、层 tar 包和签名等单独的文件。这是一个非标准化的格式,主要用于调试或非侵入式容器检查。

$ podman save --format docker-dir fedora -o /tmp/fedora
$ podman run dir:/tmp/fedora echo hello

docker://docker-reference(默认) 存储在远程容器镜像注册表中的镜像引用。示例:"quay.io/podman/stable:latest"。引用可以包括指向特定注册表的路径;如果没有,则查询 registries.conf 中列出的注册表以查找匹配的镜像。 默认情况下,使用 podman login(默认存储在 $XDG_RUNTIME_DIR/containers/auth.json)中的凭据进行身份验证;否则,它将回退到使用 $HOME/.docker/config.json 中的凭据。

$ podman run registry.fedoraproject.org/fedora:latest echo hello

docker-archive:path[:docker-reference] 存储在 docker save 格式文件中的镜像。docker-reference 仅在创建此类文件时使用,并且它不能包含摘要。

$ podman save --format docker-archive fedora -o /tmp/fedora
$ podman run docker-archive:/tmp/fedora echo hello

docker-daemon:docker-reference 存储在 docker 守护进程内部存储中的以 docker-reference 格式表示的镜像。docker-reference 也可以是镜像 ID(docker-daemon:algo:digest)。

$ sudo docker pull fedora
$ sudo podman run docker-daemon:docker.io/library/fedora echo hello

请注意,在使用 Podman 与 Docker 守护进程交互时(例如通过 docker-daemon: 传输),需要确保 Docker 守护进程正在运行,并且 Podman 进程有足够的权限来访问 Docker 守护进程的内部存储。这通常涉及到以 root 用户身份运行 Podman,或者配置 Docker 守护进程以允许无特权用户访问。

oci-archive:path:tag

一个位于指定path并符合“Open Container Image Layout Specification”规范的目录中的镜像,并通过tag来指定。

    $ podman save --format oci-archive fedora -o /tmp/fedora
$ podman run oci-archive:/tmp/fedora echo hello

上面的命令示例中,podman save命令将fedora镜像保存为OCI格式的归档文件到/tmp/fedora,然后podman run命令从该归档文件启动一个新的容器实例,并在容器内部执行echo hello命令。

选项

当然可以,以下是更详细的解释:

命令选项描述详细说明
--add-host添加自定义主机到容器的/etc/hosts文件中。格式为"host:IP"。通过这个选项,您可以为容器添加自定义的主机名到IP地址的映射关系。这有助于容器在内部解析特定的主机名。
--annotation.container为容器设置注解信息。注解信息可以为容器提供额外的元数据,以便进行更好的管理和跟踪。
--arch设置容器运行的架构,如amd64arm64等。这个选项允许您指定容器应该在哪种硬件架构上运行。
--attach附加到容器的标准输入、输出和错误流。通常与-d--detach选项一起使用。使用这个选项,您可以在容器运行后连接到其标准流,以便实时查看或与其交互。
--authfile指定认证文件的路径,用于访问私有仓库。当需要从私有Docker仓库拉取镜像时,您需要提供认证信息。这个选项允许您指定包含这些信息的文件的路径。
--blkio-weight设置块IO的权重,范围为10到1000。权重决定了容器相对于其他容器在访问块设备时的优先级。较高的权重意味着更高的优先级。
--blkio-weight-device设置特定设备的块IO权重。您可以为特定的块设备设置不同的权重,以便更精细地控制容器的IO优先级。
--cap-add向容器添加Linux功能。Linux功能是一种权限控制机制。使用这个选项,您可以为容器添加额外的Linux功能,从而扩展其能力。
--cap-drop从容器中删除Linux功能。--cap-add相反,这个选项允许您从容器中移除特定的Linux功能,以限制其权限。
--cgroup-conf指定cgroup的配置文件或配置片段。cgroup是Linux内核的一种功能,用于限制、记录和隔离进程组所使用的物理资源(如CPU、内存、磁盘I/O等)。此选项允许您为容器指定cgroup的配置。
--cgroup-parent为容器设置cgroup的父路径。通过这个选项,您可以指定容器cgroup的父级cgroup,以便更好地组织和管理资源限制。
--cgroupns启用或禁用cgroup命名空间的使用。cgroup命名空间允许容器拥有自己的cgroup视图,这有助于隔离和管理容器的资源使用情况。
--cgroups设置cgroup驱动,如cgroupfssystemd不同的系统可能使用不同的cgroup驱动。这个选项允许您指定Docker应该使用哪个cgroup驱动。
--chrootdirs在容器内部改变根目录。默认情况下,容器使用其自己的文件系统作为其根目录。使用此选项,您可以更改容器内部的根目录。
--cidfile.write将容器ID写入指定的文件。当容器启动时,Docker会为其分配一个唯一的ID。使用此选项,您可以将这个ID写入指定的文件,以便后续引用。
--conmon-pidfile指定conmon进程的PID文件的路径。conmon是Podman和Docker的守护进程之间的中介。这个选项允许您指定conmon进程的PID文件的存储位置。
--cpu-period设置CPU周期的微秒数,用于限制容器的CPU使用。CPU周期决定了容器可以使用CPU的时间片长度。通过设置这个值,您可以限制容器在特定时间段内可以使用的CPU时间。
--cpu-quota设置CPU配额,表示容器可以使用的CPU周期数。CPU配额决定了容器在每个CPU周期中可以使用的CPU时间。与--cpu-period一起使用,可以精确地控制容器的CPU使用。
--cpu-rt-period设置实时CPU周期的微秒数。实时CPU周期用于处理实时任务。通过设置这个值,您可以控制容器运行实时任务时的CPU时间。
--cpu-rt-runtime设置实时CPU配额的微秒数。实时CPU配额决定了容器在每个实时CPU周期中可以使用的CPU时间。这有助于限制实时任务对CPU资源的占用。
--cpu-shares设置CPU份额的权重。CPU份额决定了当多个容器竞争CPU资源时,每个容器应该获得的相对份额。较高的份额意味着容器在竞争中有更高的优先级。
--cpus.container设置容器可用的CPU数量。这个选项允许您为容器指定可用的CPU核心数,以限制其CPU使用。
--cpuset-cpus指定容器可以使用的CPU集合。通过这个选项,您可以为容器指定它可以使用的特定CPU核心。这有助于实现更精细的CPU资源分配。
--cpuset-mems指定容器可以使用的内存节点集合

--detach, -d

分离模式:在后台运行容器并打印新的容器ID。默认值为false

在任何时候,你可以在另一个shell中运行podman ps来查看正在运行的容器列表。使用podman attach命令可以重新附加到一个分离的容器。

当通过tty模式附加到容器时,你可以使用可配置的键序列来从容器中分离(并保留其运行状态)。默认序列是ctrl-p,ctrl-q。你可以使用--detach-keys选项来指定键序列,或者在containers.conf文件中进行配置:更多信息请参见containers.conf(5)

命令选项描述详细说明
--detach-keys设置用于从容器分离的键序列。通常,当你以交互模式运行容器时,你可能想要通过按键序列从容器中分离出来,而不是直接关闭容器。这个选项允许你指定一个或多个键序列(如'ctrl-p,ctrl-q'),当你按下这些键时,会从容器的交互模式中分离出来,而不是终止容器。
--device允许容器访问主机设备。这个选项允许你指定容器可以访问的主机设备。通过它,你可以将主机的设备映射到容器内部,使容器可以直接操作这些设备。你可以指定设备在主机上的路径、设备在容器内的路径,以及设备的权限(如读写权限)。这对于需要使用到特定硬件资源的容器应用非常有用,如需要直接访问GPU或串口设备的应用。

这两个选项提供了对容器行为的更精细控制,特别是在交互性和设备访问方面。--detach-keys 使得用户可以方便地从交互模式中分离,而 --device 则使得容器可以访问和操作主机的特定硬件设备。这些功能在开发和调试过程中,或者是在部署需要特定硬件支持的容器化应用时,都是非常有用的。

例如,要将主机的/dev/snd设备挂载到容器的/dev/snd路径下,并设置权限为rwm,你可以使用以下命令:

--device=/dev/snd:/dev/snd:rwm

请注意,使用此选项时要小心,因为允许访问某些设备可能会对容器的安全性构成威胁。确保只挂载必要的设备,并限制不必要的权限。

注意:如果用户仅通过组权限访问设备,那么在无根容器中从内部访问该设备将失败。请使用 --group-add keep-groups 标志将用户的附加组访问权限传递到容器中。

命令选项

命令选项描述详细说明
--device-cgroup-rule为容器添加自定义的设备cgroup规则。通过此选项,可以定义容器对设备访问的细粒度控制,以满足特定的安全或资源管理需求。
--device-read-bps限制设备读取的带宽(每秒字节数)。这有助于防止容器对设备进行过度的读取操作,从而控制资源的使用。
--device-read-iops限制设备读取的I/O操作数。通过限制I/O操作数,可以控制容器对设备的读取频率,防止对设备造成过大的负载。
--device-write-bps限制设备写入的带宽(每秒字节数)。这有助于防止容器对设备进行过度的写入操作,控制写入的速度和资源的使用。
--device-write-iops限制设备写入的I/O操作数。通过限制I/O操作数,可以控制容器对设备的写入频率,避免对设备造成过度的负担。
--disable-content-trust禁用内容信任。Docker通常会对下载的镜像进行内容信任检查以确保其来源的安全性。使用这个选项将禁用这一检查,但请注意这样做可能会降低安全性。
--dns设置容器的DNS服务器。这允许您指定容器在解析域名时使用的DNS服务器地址。
--dns-option.container设置容器的DNS选项。您可以设置额外的DNS解析参数,如ndotstimeout等,以控制容器中的DNS解析行为。
--dns-search.container设置容器的DNS搜索域。这有助于容器解析与特定域相关的主机名,例如内部域名。
--entrypoint覆盖容器的默认入口点。通常,容器有一个默认的启动命令或脚本。使用此选项可以指定一个不同的命令作为容器的入口点。
--env设置环境变量。允许您在容器运行时设置环境变量,这些变量可以被容器中的应用程序读取和使用。
--env-file从文件中读取环境变量。您可以将包含环境变量及其值的文件传递给此选项,Docker会在容器启动时从该文件中读取环境变量。
--env-host继承主机的环境变量。启用此选项后,容器将继承运行Docker守护进程的主机上的所有环境变量。
--env-merge合并容器和主机的环境变量。当容器和主机都定义了相同名称的环境变量时,使用此选项可以控制这些变量的合并方式。
--expose公开容器的端口给链接的容器,但不将其暴露给主机。这使得链接到该容器的其他容器可以访问该端口,但主机的外部用户或应用程序无法访问。
--gidmap.container映射主机GID到容器GID。当使用用户命名空间时,此选项允许您指定主机GID到容器GID的映射关系,以控制容器内的用户权限。
--gpus允许容器访问GPU设备。使用此选项可以指定容器可以访问的GPU设备及其配置,从而允许在容器中运行GPU密集型的应用程序。
--group-add将额外的组添加到容器中。这允许您为容器内的进程添加额外的组权限,以便它们可以访问特定的资源或执行特定的操作。
--group-entry(此选项未在原始列表中列出,可能是个错误或遗漏)缺少关于此选项的详细描述。
--health-cmd设置容器的健康检查命令。通过指定一个命令,您可以定期检查容器的健康状态,例如检查应用程序是否正在运行或响应。
--health-interval设置健康检查的间隔时间。这指定了两次连续的健康检查之间的时间间隔。
--health-on-failure当健康检查失败时采取的操作。这定义了当容器健康检查失败时Docker应采取的操作,例如重新启动容器或记录错误。
--health-retries设置健康检查的重试次数。如果健康检查命令失败,这将决定Docker在认为容器不健康之前尝试重新运行该命令的次数。
--health-start-period容器启动后的健康检查等待期。在这段时间内,即使健康检查命令失败,容器也不会被视为不健康。这有助于在容器启动时给予应用程序足够的启动时间。
--health-startup-cmd设置容器启动时的健康检查命令。您可以定期检查容器的健康状态,例如检查应用程序是否正在运行或响应。

--health-timeout 是Docker中一个关于健康检查的重要参数。它表示允许一次健康检查运行的最大时间。如果在设定的时间内健康检查命令没有完成执行,那么本次健康检查就被视为失败。默认值为30秒。通过合理设置这个参数,可以确保健康检查不会因为某些原因而无限期地运行,从而影响容器的正常运行和资源的有效利用。

在配置容器的健康检查时,除了设置--health-timeout外,还可以结合其他参数如--health-cmd(设置健康检查命令)、--health-interval(设置两次健康检查的间隔时间)以及--health-retries(设置健康检查失败后的重试次数)等来综合定义容器的健康检查策略。这样,Docker就可以根据这些参数来定期检查容器的状态,并在发现异常时采取相应的措施,例如重启容器或发出警告,以确保容器的稳定运行和服务的可用性。

--help

打印使用说明

命令选项描述详细说明
--help打印使用说明使用此选项可以显示命令的帮助信息,包括可用的参数和描述。
--hostname.container设置容器的主机名允许用户为容器设置一个特定的主机名。
--hostuser映射主机用户到容器允许将主机上的用户映射到容器内部,使容器进程以该用户的身份运行。
--http-proxy设置容器使用的HTTP代理指定容器在访问外部网络时应使用的HTTP代理服务器地址。
--image-volume(此选项可能是特定环境或工具的扩展,不在标准Docker或Podman中)此选项可能不是标准Docker或Podman的一部分,可能是在特定环境或工具中定义的。
--init在容器内运行一个初始化进程在容器内部运行一个初始化进程,以处理僵尸进程和重新分配信号。
--init-path设置初始化进程的路径指定初始化进程在容器内的可执行文件路径。
--interactive保持STDIN打开,即使没有附加使容器在即使没有附加到终端时也能保持标准输入打开。
--ip设置容器的IPv4地址允许用户为容器分配一个特定的IPv4地址。
--ip6设置容器的IPv6地址允许用户为容器分配一个特定的IPv6地址。
--ipc设置容器的IPC模式定义容器与其他容器或主机共享IPC命名空间的方式。
--label设置容器的元数据标签为容器添加键值对形式的标签,用于标识或分类容器。
--label-file从文件中读取容器的元数据标签从指定的文件中读取容器的标签信息。
--link-local-ip设置容器的链接本地IPv4/IPv6地址允许为容器分配一个链接本地地址,用于容器间的通信。
--log-driver设置容器的日志驱动程序指定容器应使用的日志记录驱动程序。
--log-opt设置日志驱动程序的选项为选定的日志驱动程序设置额外的配置选项。
--mac-address设置容器的MAC地址为容器分配一个特定的MAC地址。
--memory设置容器的内存限制限制容器可以使用的最大内存量。
--memory-reservation设置容器的内存软限制为容器设置一个内存使用的软限制,当达到此限制时,容器可能会受到内存压力。
--memory-swap设置容器的交换空间内存限制定义容器可以使用的总内存和交换空间量。
--memory-swappiness设置容器的交换倾向性控制容器在内存不足时交换出数据的倾向性。
--mount挂载卷或绑定挂载到容器允许用户将主机上的目录或卷挂载到容器内部。
--name.container设置容器的名称为容器指定一个唯一的名称。
--network设置容器的网络模式指定容器应连接到的网络。
--network-alias为容器设置网络别名在网络中为容器设置一个或多个别名,以便其他容器可以通过这些别名访问它。
--no-healthcheck禁用容器的健康检查阻止Docker或Podman对容器执行健康检查。
--no-hosts不创建/etc/hosts文件防止容器内创建/etc/hosts文件。
--oom-kill-disable禁用OOM杀手禁用容器在内存耗尽时被OOM(Out Of Memory)杀手杀死的功能。
--oom-score-adj调整OOM杀手的评分调整容器的OOM评分,影响OOM杀手选择杀死哪个进程的概率。
--os.pull(此选项可能是特定环境或工具的扩展,不在标准Docker或Podman中)此选项可能不是标准Docker或Podman的一部分,可能是在特定环境或工具中定义的。
--passwd允许Podman添加/etc/passwd和/etc/group条目--user选项一起使用时,允许Podman覆盖其提供的用户设置,以支持如libnss-extrausers之类的entrypoint配置。
--passwd-entry(此选项未在提供的列表中列出)缺少关于此选项的详细信息。
--personality(此选项可能是特定环境或工具的扩展,不在标准Docker或Podman中)此选项可能不是标准Docker或Podman的一部分,可能是在特定环境或工具中定义的。

--publish

警告

容器在pod中运行时,无需为pod中的容器发布端口。端口只需由pod本身发布。Pod网络堆栈像主机上的网络堆栈一样工作,意味着pod中的多个容器和容器内的程序共享一个接口、IP地址和相关端口。如果一个容器绑定到某个端口,那么在该端口被使用时,pod中的其他容器无法使用该端口。pod中的容器还可以通过一个容器在pod中绑定到localhost,另一个容器连接到该端口来进行本地通信。

命令选项中文描述详细说明
--publish发布容器的端口到主机将容器内的端口映射到主机的端口上,使外部可以访问容器内的服务。
--publish-all发布容器所有端口到主机将容器内的所有端口都映射到主机的端口上。
--pull总是尝试拉取新的镜像在创建容器时,强制Docker或Podman拉取最新的镜像,即使本地已经存在该镜像。
--quiet, -q在拉取镜像时抑制输出信息在拉取镜像时,不显示任何输出信息,静默执行。
--rdt-class设置RDT(资源定向技术)类为容器设置RDT类,用于资源分配和管理。
--read-only将容器的根文件系统挂载为只读将容器的根文件系统设置为只读模式,防止对文件系统进行写操作。
--read-only-tmpfs将容器的/tmp目录挂载为只读tmpfs将容器内的/tmp目录挂载为只读的tmpfs文件系统,以防止对该目录进行写操作。
--replace如果已存在同名容器,则替换它如果已经存在一个具有相同名称的容器,则删除并替换它。
--requires容器运行所需的条件或依赖项指定容器运行前必须满足的条件或依赖项。
--restart设置容器的重启策略定义容器在退出时应如何重启。
--retry尝试重新启动容器的次数在容器退出时,尝试重新启动容器的次数。
--retry-delay容器重新启动之间的延迟时间在连续两次尝试重新启动容器之间的延迟时间。
--rm容器退出时自动删除容器和相关匿名卷当容器退出时,自动删除容器以及与之关联的匿名未命名卷。默认值为false
--rmi容器退出后,如果没有其他容器使用则删除镜像当容器退出后,如果没有其他容器正在使用该镜像,则删除该镜像。这隐含了对新容器使用--rm选项。默认值为false
--rootfs指定容器的根文件系统路径设置容器使用的根文件系统路径。
--sdnotify启用sd_notify支持允许容器通过systemd的sd_notify接口发送状态更改通知。
--seccomp-policy设置seccomp(安全计算模式)策略为容器设置seccomp策略,用于限制容器的系统调用。
--secret将秘密添加到容器中向容器添加加密的秘密,以便容器可以安全地访问敏感数据。
--security-opt设置容器的安全选项为容器提供额外的安全配置选项。
--shm-size设置容器共享内存的大小定义容器可以使用的共享内存区域的大小。
--shm-size-systemd通过systemd设置容器共享内存的大小使用systemd来设置容器共享内存的大小。
--sig-proxy代理接收到的信号到容器内的进程将主机接收到的信号代理到容器内的主进程。

请注意,上述表格中提到的某些选项可能是特定于Podman或特定于某些Docker发行版的,并不一定是所有Docker或Podman版本的标准选项。因此,在使用这些选项时,请确保参考您所使用的工具或环境的官方文档。

命令选项中文描述详细说明
--rm容器退出时自动删除容器当容器退出时,自动删除容器。默认值为false,使用此选项将其设置为true
--stop-signal发送信号停止容器发送一个UNIX信号到容器来停止它,而不是默认发送的SIGTERM。
--stop-timeout停止容器前的超时时间容器在接收到停止信号后等待停止的时间。如果容器在指定时间内没有停止,将使用SIGKILL强制停止。
--subgidname指定子GID映射文件的名称用于设置容器的子GID映射。
--subuidname指定子UID映射文件的名称用于设置容器的子UID映射。
--sysctl设置系统参数在容器内设置内核参数。
--systemd在容器内运行systemd作为初始进程使容器以systemd作为其初始进程,允许容器管理多个服务。
--timeout操作超时时间设置某些操作(如拉取镜像)的超时时间。
--tls-verify验证远程服务器的TLS证书当与远程Docker守护进程通信时,验证其TLS证书。
--tmpfs挂载tmpfs目录在容器内挂载一个tmpfs文件系统。
--tty分配一个伪终端为容器分配一个伪终端(TTY),通常与交互模式一起使用。
--tz设置容器的时区设置容器使用的时区。
--uidmap.container设置容器内的UID映射为容器设置用户ID映射,以控制容器内进程看到的UID。
--ulimit设置ulimit资源限制设置容器内进程的资源限制,如文件描述符数或内存使用量。
--umask设置默认文件创建掩码设置容器内进程创建文件和目录时的默认umask值。
--unsetenv取消设置环境变量在容器内取消设置指定的环境变量。
--unsetenv-all取消设置所有环境变量在容器内取消设置所有环境变量。
--user设置运行容器的用户和用户组以指定的用户和用户组身份运行容器内的进程。
--userns.container设置容器的用户命名空间为容器设置用户命名空间,以控制容器内进程看到的用户和组ID。
--uts.container设置容器的UTS命名空间为容器设置UTS命名空间,允许容器有自己的主机名和域名。
--variant.container设置容器的变体指定容器的运行时变体,例如OCI或特定于某个发行版的变体。
--volume-v挂载卷将主机上的目录或文件挂载到容器内,使容器可以访问这些文件或目录。
--group-add keep-groups保留用户的辅助组访问权限将用户的辅助组访问权限传递给容器,使得容器内的进程可以具有与主机上相同的组访问权限。
--volumes-from从另一个容器挂载卷从指定的容器挂载其卷到当前容器。
--workdir设置工作目录在容器内设置初始工作目录,命令将在该目录中执行。

请注意,上述表格中的某些选项可能特定于Podman或Docker的某些版本或配置,因此在使用它们之前,请确保查阅您正在使用的工具的官方文档以获取最新和准确的信息。此外,某些选项可能不适用于所有容器运行时环境。

示例

echo "asdf" | podman run --rm -i someimage /bin/cat

该命令将字符串"asdf"作为输入传递给podman运行的一个容器,并将该容器的输出(如果有的话)打印到终端。下面是对这个命令的详细解释:

  • echo "asdf"echo命令用于输出字符串"asdf"。
  • |:管道符号,用于将echo命令的输出(即"asdf")作为输入传递给后面的命令。
  • podman run:使用podman命令来运行一个容器。podman是一个开源的容器管理工具,与Docker类似,但它不需要守护进程,并且更加轻量级。
  • --rm:这个选项告诉podman在容器退出后自动删除容器。这通常用于一次性运行的容器,以避免留下无用的容器实例。
  • -i:这个选项保持容器的标准输入(stdin)打开,即使不连接终端。这使得你可以通过管道将输入传递给容器内的命令。
  • someimage:这是你要运行的容器的镜像名称。你需要将someimage替换为实际的镜像名称或ID。
  • /bin/cat:这是容器内要运行的命令。cat命令用于读取并输出文件的内容,或者在没有指定文件时从标准输入(stdin)读取内容。在这里,由于使用了-i选项并且通过管道传递了输入,cat将从stdin读取"asdf"并输出它。

综上所述,整个命令的作用是将字符串"asdf"传递给podman运行的一个容器,并在容器内使用cat命令读取并输出它。由于使用了--rm选项,容器在运行完成后会被自动删除。如果你运行这个命令,你将在终端看到输出"asdf"。

退出状态

podman run 的退出码提供了关于容器为何失败运行或为何退出的信息。当 podman run 以非零码退出时,退出码遵循 chroot(1) 的标准,如下所示:

125 错误在于 Podman 本身

$ podman run --foo busybox; echo $?
Error: unknown flag: --foo
125

126 容器内的命令无法被调用

$ podman run busybox /etc; echo $?
Error: container_linux.go:346: starting container process caused "exec: \"/etc\": permission denied": OCI runtime error
126

127 容器内的命令未找到

$ podman run busybox foo; echo $?
Error: container_linux.go:346: starting container process caused "exec: \"foo\": executable file not found in $PATH": OCI runtime error
127

退出码 容器内命令的退出码

$ podman run busybox /bin/sh -c 'exit 3'; echo $?
3

示例

以只读模式运行容器

在容器镜像开发过程中,容器通常需要写入镜像内容。例如,将软件包安装到 /usr。但在生产环境中,应用程序很少需要写入镜像。应用程序如果需要写入文件系统,通常会写入卷。通过使用 --read-only 开关,可以以只读模式运行容器,从而使容器镜像免受修改。默认情况下,只读容器可以写入临时数据。Podman 会在容器内的 /run/tmp 目录下挂载一个 tmpfs。

$ podman run --read-only -i -t fedora /bin/bash

如果容器不需要在容器内的任何文件系统中写入,包括 tmpfs,则设置 --read-only-tmpfs=false

$ podman run --read-only --read-only-tmpfs=false --tmpfs /run -i -t fedora /bin/bash

使用 glob 暴露容器内的共享库为只读

$ podman run --mount type=glob,src=/usr/lib64/libnvidia\*,ro=true -i -t fedora /bin/bash

这个命令通过 glob 模式挂载 /usr/lib64/libnvidia* 路径下的所有文件到容器内,并设置这些文件为只读。这样容器内的进程可以读取这些共享库,但不能修改它们。

将容器的日志消息暴露给主机的日志

通过绑定挂载 /dev/log 目录,容器内记录的日志消息将显示在主机上的 syslog/journal 中。

$ podman run -v /dev/log:/dev/log -i -t fedora /bin/bash

在容器内部,可以通过向日志发送消息来测试这个功能。

(bash)# logger "Hello from my container"

然后退出容器并检查 journal。

(bash)# exit

$ journalctl -b | grep Hello

这将列出发送到 logger 的消息。

绑定到 STDIN、STDOUT、STDERR 的一个或多个流

如果不指定 -a 选项,Podman 会绑定所有流(stdin、stdout、stderr)。要覆盖默认设置,可以指定 -a(stdin、stdout、stderr),例如:

$ podman run -a stdin -a stdout -i -t fedora /bin/bash

在容器间共享 IPC

使用从这里可获得的 shm_server.c 进行测试。

测试 --ipc=host 模式:

主机显示一个共享内存段,其中有 7 个进程附加,这些进程恰好来自 httpd:

$ sudo ipcs -m

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x01128e25 0 root 600 1000 7

在这个例子中,ipcs -m 命令列出了共享内存段的信息。key 是共享内存段的键,shmid 是共享内存段的 ID,owner 是拥有该段的用户,perms 是权限设置,bytes 是段的大小,nattch 是当前附加到该段的进程数,status 是段的状态。

当你运行一个容器并指定 --ipc=host 选项时,容器将使用主机的 IPC 命名空间,这意味着容器内的进程可以直接访问主机上的共享内存段和其他 IPC 资源。这对于需要与其他主机进程进行 IPC 通信的容器应用程序特别有用。

注意:在生产环境中使用 --ipc=host 需要谨慎,因为它可能会引入安全风险和资源竞争问题。确保你理解这种模式的影响,并在必要时实施适当的安全措施。

您已经展示了如何使用 Podman 来运行容器,并通过指定不同的 IPC 模式来影响容器如何访问共享内存段。以下是您所描述步骤的详细解释:

  1. 运行一个常规容器: 当您运行一个常规的容器时,它使用自己的 IPC 命名空间,因此它看不到主机或其他容器的共享内存段。

    $ podman run -it shm ipcs -m

    在这个命令中,shm 可能是您自定义的镜像名,该镜像中包含了 ipcs 命令。因为您没有指定 --ipc=host 或其他 IPC 模式,所以容器使用默认的隔离 IPC 命名空间。输出显示容器内没有共享内存段。

  2. 使用 --ipc=host 选项运行容器: 当您使用 --ipc=host 选项运行容器时,容器将共享主机的 IPC 命名空间。这意味着容器内的进程可以看到并访问主机上的所有 IPC 资源,包括共享内存段。

    $ podman run -it --ipc=host shm ipcs -m

    在这个命令中,容器能够看到并列出主机上的共享内存段,包括由 httpd 创建的那个。

  3. 测试 --ipc=container:id 模式: 在这种模式下,您可以让一个容器共享另一个容器的 IPC 命名空间。这允许容器间共享 IPC 资源,而不需要与主机共享。

    首先,您启动了一个包含 shm_server 程序的容器,并创建了共享内存段。

    $ podman run -it shm bash
    $ sudo shm/shm_server &
    $ sudo ipcs -m

    接下来,您尝试运行第二个容器,这个容器看不到第一个容器的共享内存段,因为它没有使用任何特殊的 IPC 模式。

    $ podman run shm ipcs -m

    然后,您使用 --ipc=container:id 选项运行第三个容器,并指定了第一个容器的 ID。这个容器现在能够看到并访问第一个容器创建的共享内存段。

    $ podman run -it --ipc=container:ed735b2264ac shm ipcs -m

    在这个命令中,ed735b2264ac 是第一个容器的 ID(在实际操作中,您应该使用您实际运行的容器的 ID)。通过共享第一个容器的 IPC 命名空间,第三个容器能够列出第一个容器创建的共享内存段。

通过这些示例,您可以看到 Podman 如何通过 IPC 模式来控制容器如何与其他容器和主机交互。这对于需要跨容器共享资源的场景非常有用,但同时也需要谨慎使用,以避免潜在的安全问题和资源冲突。

端口映射以供外部使用

通过使用 -p 标志,可以将应用程序的公开端口映射到主机端口。例如,httpd 的 80 端口可以映射到主机的 8080 端口,如下所示:

$ podman run -p 8080:80 -d -i -t fedora/httpd

在这个例子中,-p 8080:80 表示将容器内的 80 端口映射到宿主机的 8080 端口。这样,当外部访问宿主机的 8080 端口时,实际上会转发到容器内部的 80 端口上。

挂载外部卷

要将宿主机目录挂载为容器卷,需要指定宿主机目录的绝对路径和容器目录的绝对路径,两者之间用冒号分隔。如果来源是 Podman 维护的命名卷,则建议使用其名称而不是卷的路径。否则,该卷将被视为孤立卷,并可能被 podman volume prune 命令清除:

$ podman run -v /var/db:/data1 -i -t fedora bash

在这个命令中,-v /var/db:/data1 将宿主机的 /var/db 目录挂载到容器的 /data1 目录。

如果容器内的非 root 用户需要可写的挂载卷,可以使用 U 选项。此选项告诉 Podman 更改源卷的所有权,以匹配容器内使用的默认 UID 和 GID。

$ podman run -d -e MARIADB_ROOT_PASSWORD=root --user mysql --userns=keep-id -v ~/data:/var/lib/mysql:Z,U mariadb

在这个例子中,U 选项确保挂载的卷对于容器内的 mysql 用户是可写的。

另外,如果容器内的非 root 用户需要可写的卷,--userns=keep-id 选项允许用户将执行 Podman 的用户的 UID 和 GID 映射到容器内的特定 UID 和 GID。由于容器内运行的进程以用户的 UID 运行,因此它们可以读写用户拥有的文件。

$ podman run -d -e MARIADB_ROOT_PASSWORD=root --user mysql --userns=keep-id:uid=999,gid=999 -v ~/data:/var/lib/mysql:Z mariadb

在这个命令中,--userns=keep-id:uid=999,gid=999 指定了在容器内部使用的 UID 和 GID,确保容器内的 mysql 用户可以访问和修改挂载的卷。注意,这里的 UID 和 GID 应该与宿主机上用户的 UID 和 GID 相匹配,或者至少是宿主机用户有权限读写的 UID 和 GID。这样,容器内的进程就可以以与宿主机用户相同的权限来访问挂载的卷了。

使用 --mount 标志来挂载主机目录作为容器文件夹时,需要指定目录的绝对路径或卷名称,以及容器内的绝对路径:

$ podman run --mount type=bind,src=/var/db,target=/data1 busybox sh

$ podman run --mount type=bind,src=volume-name,target=/data1 busybox sh

在使用 SELinux 时,请注意主机对容器的 SELinux 策略一无所知。因此,在上面的例子中,如果启用了 SELinux 策略,/var/db 目录将不可写给容器。此时会出现“Permission Denied”消息,并且会在主机的系统日志中添加一个 avc: 消息。

为了解决这个问题,在编写此手册页时,需要运行以下命令,以便将适当的 SELinux 策略类型标签附加到主机目录:

$ chcon -Rt svirt_sandbox_file_t /var/db

现在,在容器中写入 /data1 卷是被允许的,更改将反映在主机上的 /var/db 目录中。

使用替代的安全标签

通过指定 --security-opt 标志,可以覆盖每个容器的默认标签方案。例如,指定 MCS/MLS 级别,这是 MLS 系统的要求。在以下命令中指定级别允许在容器之间共享相同的内容。

podman run --security-opt label=level:s0:c100,c200 -i -t fedora bash

MLS 的一个示例可能是:

$ podman run --security-opt label=level:TopSecret -i -t rhel7 bash

在这个 MLS 示例中,--security-opt label=level:TopSecret 指定了容器的安全级别为 TopSecret,这对于需要在容器内处理高度敏感信息的场景非常重要。通过这种方式,可以确保只有满足特定安全级别要求的容器才能访问敏感数据,从而增强系统的安全性。

--permissive 标志

使用 --permissive 标志时,你可以运行以下命令来允许容器在 SELinux 策略下运行,但不会对任何访问违规进行强制限制(即,处于宽容模式):

$ podman run --security-opt label=permissive -i -t fedora bash

这条命令将容器运行在宽容模式下,即使容器试图访问它没有权限访问的资源,SELinux 也不会阻止或杀死进程。这通常用于调试或测试目的,但请注意,在生产环境中使用宽容模式可能会导致安全风险。

为容器进程指定替代的安全类型

你可以通过指定一个替代类型来加强容器内进程的安全策略。例如,如果你想要运行一个容器,它只允许监听 Apache 端口,你可以执行以下命令:

$ podman run --security-opt label=type:svirt_apache_t -i -t centos bash

请注意,你必须有一个定义了 svirt_apache_t 类型的 SELinux 策略。

屏蔽容器中的特定路径

如果你想要屏蔽容器中的某些特定路径,可以使用 mask 选项与 --security-opt 标志,并指定以冒号分隔的路径。

$ podman run --security-opt mask=/foo/bar:/second/path fedora bash

这将屏蔽容器内的 /foo/bar/second/path 路径。

取消屏蔽默认屏蔽的路径

要取消屏蔽所有默认被屏蔽的路径,可以将 unmask 选项设置为 ALL。或者,如果要仅取消屏蔽特定路径,可以像上面使用 mask 选项那样指定路径。

$ podman run --security-opt unmask=ALL fedora bash

这条命令将取消屏蔽容器内所有默认被屏蔽的路径。

如果你想要取消屏蔽所有以 /proc 开头的路径,可以设置 unmask 选项为 /proc/*

$ podman run --security-opt unmask=/proc/* fedora bash

或者,你可以指定要取消屏蔽的特定路径:

$ podman run --security-opt unmask=/foo/bar:/sys/firmware fedora bash

使用 --blkio-weight-device 标志设置设备权重

你可以使用 --blkio-weight-device 标志来设置特定块设备的 I/O 权重,从而控制容器对磁盘的访问优先级。

$ podman run -it --blkio-weight-device "/dev/sda:200" ubuntu

这条命令将为容器设置 /dev/sda 设备的 I/O 权重为 200。

使用来自管道的输入运行 podman 容器

你可以将来自管道的数据作为输入传递给 podman 容器。这通常通过重定向和 --rm(运行后自动删除容器)及 --entrypoint(覆盖容器的默认入口点)标志来实现。

$ echo "asdf" | podman run --rm -i --entrypoint /bin/cat someimage
asdf

在这个例子中,echo "asdf" 命令的输出被传递给 podman run 命令,后者运行一个名为 someimage 的容器,并将 /bin/cat 作为入口点。容器读取从管道传入的数据(在这里是 "asdf"),然后将其输出到标准输出。--rm 标志确保容器在退出后自动删除。

设置自动用户命名空间隔离的容器

Podman 支持自动为用户设置命名空间隔离的容器。这可以通过 --userns 标志实现,允许容器运行在其自己的用户命名空间内,与宿主机上的用户ID和组ID隔离。

以下是如何使用自动用户命名空间运行的示例:

# podman run --userns=auto:size=65536 ubi8-micro cat /proc/self/uid_map
0 2147483647 65536
# podman run --userns=auto:size=65536 ubi8-micro cat /proc/self/uid_map
0 2147549183 65536

在上面的例子中,我们为 ubi8-micro 镜像的容器设置了自动用户命名空间,并指定了每个命名空间的用户ID映射大小为65536。每次运行时,Podman 都会自动为容器生成一个新的用户ID映射范围。

设置命名空间内核参数(Sysctls)

--sysctl 标志用于在容器中设置命名空间内核参数(Sysctls)。例如,如果你想在容器的网络命名空间中启用IP转发,可以运行以下命令:

$ podman run --sysctl net.ipv4.ip_forward=1 someimage

请注意,并非所有的 sysctl 都是命名空间的。Podman 不支持修改也会修改宿主机系统的 sysctl。随着内核的发展,我们期望更多的 sysctl 变得命名空间化。

要查看当前支持的 sysctl 列表,请参阅 --sysctl 选项的说明。

在新的用户命名空间中设置UID/GID映射

在新的用户命名空间中运行容器需要映射宿主机上的UIDs和GIDs。

$ podman run --uidmap 0:30000:7000 --gidmap 0:30000:7000 fedora echo hello

上面的命令将宿主机上的UID和GID从30000开始映射到容器内的UID和GID范围,范围大小为7000。

从命令行配置存储选项

Podman 允许通过更改 /etc/containers/storage.conf 中的值或使用全局选项来配置存储。下面展示了如何使用全局选项设置并使用 fuse-overlayfs 来一次性运行 busybox。

podman --log-level=debug --storage-driver overlay --storage-opt "overlay.mount_program=/usr/bin/fuse-overlayfs" run busybox /bin/sh

在这个例子中,我们指定了使用 overlay 作为存储驱动,并设置了 overlay.mount_program 选项以使用 fuse-overlayfs 作为挂载程序。然后,我们运行了一个 busybox 容器。请注意,你可能需要根据你的系统和安装情况调整 fuse-overlayfs 的路径。

在容器中配置时区

在容器中配置时区可以通过设置 TZ 环境变量或使用 --tz 标志来实现。--tz 标志允许你指定一个时区,它将被应用到容器内运行的所有进程。

$ podman run --tz=local alpine date
$ podman run --tz=Asia/Shanghai alpine date
$ podman run --tz=US/Eastern alpine date

在上面的例子中,我们分别设置了本地时区、上海时区和美国东部时区,并运行了 alpine 镜像的容器来显示当前日期和时间。

需要注意的是,一些应用(比如 Java 应用)可能不会直接使用系统时区设置,而是有自己的时区配置方式。在这种情况下,你可能需要在应用内部配置时区,而不是依赖容器的系统时区设置。

添加依赖容器

在某些情况下,你可能希望一个容器在另一个容器启动之前先运行。可以使用 --requires 标志来指定依赖关系。

$ podman create --name container1 -t -i fedora bash
$ podman run --name container2 --requires container1 -t -i fedora bash

在这个例子中,我们首先使用 podman create 命令创建了一个名为 container1 的容器,但没有启动它。然后,我们使用 podman run 命令启动 container2,并指定它依赖于 container1。这样,在启动 container2 之前,Podman 会自动启动 container1

你也可以指定多个依赖容器:

$ podman create --name container1 -t -i fedora bash
$ podman create --name container2 -t -i fedora bash
$ podman run --name container3 --requires container1,container2 -t -i fedora bash

配置保持辅助组以访问卷

在某些情况下,你可能希望容器内的进程能够保留其辅助组(supplemental groups)的权限,以便能够访问挂载的卷。可以使用 --group-add keep-groups 选项来实现这一功能。

$ podman run -v /var/lib/design:/var/lib/design --group-add keep-groups ubi8

在这个例子中,我们将宿主机的 /var/lib/design 目录挂载到容器的 /var/lib/design 目录,并使用 --group-add keep-groups 选项来保持容器的辅助组权限。

使用 personality 标志配置容器的执行域

Podman 允许你使用 --personality 标志来设置容器的执行域(execution domain)。这对于运行不同架构的二进制文件很有用。

$ podman run --name container1 --personality=LINUX32 fedora bash

在这个例子中,我们创建了一个名为 container1 的容器,并使用 --personality=LINUX32 标志将其执行域设置为 LINUX32。这允许你在 64 位系统上运行 32 位二进制文件。

使用外部 rootfs 作为 overlay 运行容器

Podman 支持使用外部 rootfs 作为 overlay 来运行容器。这允许你将一个现有的 rootfs 目录挂载到容器中,并在其上应用 overlay 文件系统。

$ podman run --name container1 --rootfs /path/to/rootfs:O bash

在这个例子中,我们使用 --rootfs 标志指定了一个外部 rootfs 目录 /path/to/rootfs,并使用了 :O 后缀来指示使用 overlay 文件系统。然后,我们运行了一个 bash shell 会话。

在容器中的 Java 应用中处理时区

在容器中运行 Java 应用时,如果需要使用非 UTC 时区,你需要在容器内部设置 TZ 环境变量。Java 应用不会直接使用 --tz 选项设置的时区。你可以通过以下方式在容器中设置 TZ 环境变量:

$ podman run -e TZ=Asia/Shanghai -it openjdk:8-jdk-alpine java -jar your-app.jar

在这个例子中,我们使用 -e TZ=Asia/Shanghai 来设置 TZ 环境变量为 Asia/Shanghai,然后运行了一个 Java 应用。这样,Java 应用就会使用上海时区而不是默认的 UTC 时区。

示例运行

在容器内设置时区,并查看 Java 应用中的默认时区:

$ podman run -ti --rm -e TZ=EST mytzimage bash
# 查看 /etc/localtime 链接指向的时区文件
lrwxrwxrwx. 1 root root 29 Nov 3 08:51 /etc/localtime -> ../usr/share/zoneinfo/Etc/UTC
# 显示当前时间和时区
Now with default timezone:
Fri Nov 19 18:10:55 EST 2021
# 使用 Java 查看默认时区
Java default sees the following timezone:
2021-11-19T18:10:55.651130-05:00
# 强制 Java 使用 UTC 时区
Forcing UTC:
Fri Nov 19 23:10:55 UTC 2021

在这个示例中,我们运行了一个名为 mytzimage 的镜像,并设置了环境变量 TZEST(美国东部时间)。然后,我们在容器内使用 bash shell,并查看 /etc/localtime 链接以确定系统时区设置。接下来,我们打印了当前时间和时区,以及 Java 应用看到的默认时区。最后,我们展示了如何强制 Java 使用 UTC 时区。

将容器连接到两个网络(名为 net1 和 net2)并设置静态 IP

$ podman run --network net1:ip=10.89.1.5 --network net2:ip=10.89.10.10 alpine ip addr

这个命令将启动一个 alpine 镜像的容器,并将其同时连接到两个网络:net1net2。在 net1 网络中,容器的 IP 地址被设置为 10.89.1.5,在 net2 网络中,容器的 IP 地址被设置为 10.89.10.10。容器启动后,会运行 ip addr 命令来显示容器的网络接口和地址信息。

无根容器

Podman 在大多数系统上作为非 root 用户运行。这个功能要求安装足够新版本的 shadow-utils 包,该包必须包括 newuidmap(1) 和 newgidmap(1) 可执行文件。

为了让用户能够运行无根容器,/etc/subuid/etc/subgid 文件中必须有该用户名的条目,这些条目列出了其用户命名空间的 UID。

如果安装了 fuse-overlayfs 和 slirp4netns 包,无根 Podman 的运行效果会更好。fuse-overlayfs 包提供了一个用户空间的 overlay 存储驱动程序,否则用户需要使用 vfs 存储驱动程序,这可能会占用大量磁盘空间且性能不如其他驱动程序。

要在容器上启用 VPN,需要指定 slirp4netns 或 pasta;否则,容器需要以 --network=host 标志运行。

环境

容器内的环境变量可以通过多种不同的选项进行设置,以下是它们的优先级顺序(后面的条目会覆盖前面的条目):

  • 容器镜像:在容器镜像中指定的任何环境变量。
  • --http-proxy:默认情况下,会从主机传递一些环境变量,例如 http_proxyno_proxy。详情参见 --http-proxy
  • --env-host:将执行 Podman 的进程的主机环境变量添加进来。
  • --env-file:通过 env-files 指定的任何环境变量。如果指定了多个文件,则它们将按照条目顺序相互覆盖。
  • --env:指定的任何环境变量将覆盖之前的设置。

运行容器并设置以 * 结尾的环境变量。只有在未指定值时,尾部的 * 通配符功能才有效:

$ export ENV1=a
$ podman run --env 'ENV*' alpine env | grep ENV
ENV1=a
$ podman run --env 'ENV*=b' alpine env | grep ENV
ENV*=b

CONMON

当 Podman 启动容器时,它实际上会执行 conmon 程序,然后 conmon 会执行 OCI Runtime。Conmon 是容器监视器。它是一个小型程序,其任务是监视容器的主进程,如果容器死亡,则保存退出代码。它还保持容器的 tty 打开状态,以便稍后附加。这使得 Podman 可以在分离模式下(后台运行),Podman 可以退出,但 conmon 继续运行。每个容器都有自己的 conmon 实例。Conmon 等待容器退出,收集并保存退出代码,然后启动 Podman 进程以完成容器清理,通过关闭网络和存储。有关 conmon 的更多信息,请参阅 conmon(8) 手册页。

文件

/etc/subuid

/etc/subgid

注意:使用环境变量 TMPDIR 来更改下载的容器镜像的临时存储位置。Podman 默认使用 /var/tmp

另请参阅

podman(1), podman-save(1), podman-ps(1), podman-attach(1), podman-pod-create(1), podman-port(1), podman-start(1), podman-kill(1), podman-stop(1), podman-generate-systemd(1), podman-rm(1), subgid(5), subuid(5), containers.conf(5), systemd.unit(5), setsebool(8), slirp4netns(1), conmon(8)

其他相关的手册页和文档可能包括:

  • fuse-overlayfs(1):关于 fuse-overlayfs 的信息,Podman 可能会使用它来支持 overlayfs 文件系统。
  • proc(5):关于 /proc 文件系统的信息,它提供了内核和进程信息。

历史

脚注

Podman 项目致力于包容性,这是开源的核心价值观之一。这里使用的 masterslave 挂载传播术语是有问题的,且会造成分裂,需要改变。然而,这些术语目前仍在 Linux 内核中使用,因此目前必须照原样使用。当内核维护者纠正这种用法时,Podman 会立即跟进。

请注意,开源社区一直在努力消除语言中的歧视性和冒犯性术语。随着时间的推移,更多的项目将采用更加包容和尊重的术语。如果您在 Podman 或其他开源项目中发现了类似的问题,请考虑提交一个问题或贡献一个补丁来帮助改进。这样,我们可以共同创造一个更加友好和包容的开源环境。