名称

podman-pod-create - 创建新的 Pod

概要

podman pod create [选项] [名称]

描述

创建一个空的 Pod 或多个容器的单元,并准备将容器添加到其中。Pod 可以使用特定名称创建。如果未提供名称,则会生成随机名称。Pod ID 会打印到标准输出。然后,您可以使用 podman create --pod <pod_id|pod_name> 将容器添加到 Pod 中,以及 podman pod start <pod_id|pod_name> 启动 Pod。

操作者可以通过三种方式识别 Pod:UUID 长标识符(“f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778”)UUID 短标识符(“f78375b1c487”)名称(“jonah”)

podman 为每个 Pod 生成 UUID,如果容器未通过 --name 指定名称,则会为其生成随机字符串名称。此名称有助于识别 Pod。

注意:与资源限制相关的标志通过在 Pod 的 cgroup 父级中为加入 Pod 的所有容器显式设置限制来工作。容器可以在加入 Pod 时覆盖资源限制。例如,如果 Pod 是通过 podman pod create --cpus=5 创建的,指定 podman container create --pod=<pod_id|pod_name> --cpus=4 会导致容器使用较小的限制。此外,指定自己的 cgroup 的容器(例如 --cgroupns=host)不会获得分配的 Pod 级 cgroup 资源。

选项

--add-host=主机名[;主机名[;…]]:ip

将自定义主机到 IP 映射添加到 Pod 的 /etc/hosts 文件。

该选项接受一个或多个以分号分隔的主机名,这些主机名将映射到一个单独的 IPv4 或 IPv6 地址,地址之间用冒号分隔。它还可以用于覆盖 Podman 默认添加到 /etc/hosts 的主机名的 IP 地址(另请参阅 --name--hostname 选项)。此选项可以多次指定,以向 /etc/hosts 添加其他映射。它与 --no-hosts 选项冲突,并与 containers.conf 中的 no_hosts=true 冲突。

除了 IP 地址,还可以使用特殊标记 host-gateway。这将解析为容器可以用来连接到主机的 IP 地址。所选择的 IP 地址取决于您的网络设置,因此无法保证 Podman 可以自动确定 host-gateway 地址,这将导致 Podman 失败并显示错误消息。您可以使用 containers.conf 中的 host_containers_internal_ip 选项覆盖此 IP 地址。

host-gateway 地址也由 Podman 用于自动将 host.containers.internalhost.docker.internal 主机名添加到 /etc/hosts。您可以通过提供 --no-hosts 选项,或在 containers.conf 中设置 host_containers_internal_ip=”none” 来阻止这种情况。如果未手动配置 host-gateway 地址,并且 Podman 无法自动确定 IP 地址,Podman 将静默跳过将这些内部主机名添加到 /etc/hosts。如果 Podman 在使用 podman machine 的虚拟机中运行(这包括 Mac 和 Windows 主机),Podman 将静默跳过将内部主机名添加到 /etc/hosts,除非手动配置了 IP 地址;内部主机名将由 gvproxy DNS 解析器解析。

Podman 默认情况下将使用主机的 /etc/hosts 文件作为基础,即此文件中存在的任何主机名也会存在于容器的 /etc/hosts 文件中。可以使用 containers.conf 中的 base_hosts_file 配置来配置不同的基础文件。

/etc/hosts 文件在 Pod 中的所有容器之间共享。

--blkio-weight=权重

块 IO 相对权重。权重101000 之间的值。

此选项在 cgroups V1 无根系统上不受支持。

--blkio-weight-device=设备:权重

块 IO 相对设备权重。

--cgroup-parent=路径

在其中创建 Pod 的 cgroup 的 cgroup 路径。如果路径不是绝对路径,则路径被视为相对于 init 进程的 cgroup 路径。如果 cgroup 不存在,则会创建它们。

--cpu-shares, -c=份额

CPU 份额(相对权重)。

默认情况下,所有容器都获得相同比例的 CPU 周期。可以通过更改容器的 CPU 份额权重相对于所有正在运行的容器的组合权重来修改此比例。默认权重为 1024

此比例仅在 CPU 密集型进程运行时适用。当一个容器中的任务处于空闲状态时,其他容器可以使用剩余的 CPU 时间。实际的 CPU 时间量取决于系统上运行的容器数量。

例如,考虑三个容器,一个容器的 cpu-share 为 1024,另外两个容器的 cpu-share 设置为 512。当三个容器中的进程都尝试使用 100% 的 CPU 时,第一个容器将获得 50% 的总 CPU 时间。如果添加第四个容器,其 cpu-share 为 1024,则第一个容器仅获得 33% 的 CPU。剩余容器分别获得 16.5%、16.5% 和 33% 的 CPU。

在多核系统上,CPU 时间份额分布在所有 CPU 内核上。即使容器被限制为低于 100% 的 CPU 时间,它也可以使用每个单独 CPU 内核的 100%。

例如,考虑一个拥有三个以上内核的系统。如果容器 C0 使用 --cpu-shares=512 启动,运行一个进程,另一个容器 C1 使用 --cpu-shares=1024 运行两个进程,这会导致以下 CPU 份额分配:

PID

容器

CPU

CPU 份额

100

C0

0

CPU0 的 100%

101

C1

1

CPU1 的 100%

102

C1

2

CPU2 的 100%

在某些系统上,对于非 root 用户可能不允许更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--cpus=数量

设置委托给 Pod 的 CPU 总数。默认值为 0.000,表示对计算能力没有限制。

--cpuset-cpus=数字

允许执行的 CPU。可以指定为以逗号分隔的列表(例如 0,1),作为范围(例如 0-3),或任何组合(例如 0-3,7,11-15)。

在某些系统上,对于非 root 用户可能不允许更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--cpuset-mems=节点

允许执行的内存节点(MEM)(0-3、0、1)。仅在 NUMA 系统上有效。

如果系统上有四个内存节点(0-3),使用 --cpuset-mems=0,1,则容器中的进程仅使用前两个内存节点的内存。

在某些系统上,对于非 root 用户可能不允许更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--device=主机设备[:容器设备][:权限]

将主机设备添加到 Pod。可选的 权限 参数可用于通过组合 r(读)、w(写)和 mmknod(2))来指定设备权限。

示例:--device=/dev/sdc:/dev/xvdc:rwm

注意:如果 主机设备 是符号链接,则会先解析它。Pod 仅存储主机设备的主编号和次编号。

Podman 可能会加载使用指定设备所需的内核模块。Podman 在必要时加载模块的设备为:/dev/fuse。

在无根模式下,新设备会从主机绑定挂载到容器中,而不是 Podman 在容器空间中创建它。由于绑定挂载在 SELinux 系统上保留其 SELinux 标签,因此容器在访问挂载的设备时可能会获得权限被拒绝错误。修改 SELinux 设置以允许容器通过以下命令使用所有设备标签

$ sudo setsebool -P container_use_devices=true

注意:Pod 通过存储用户传递的初始配置并在添加到 Pod 的每个容器上重新创建设备来实现设备。

--device-read-bps=路径:速率

限制从设备读取的速率(以每秒字节为单位)(例如 --device-read-bps=/dev/sda:1mb)。

在某些系统上,对于非 root 用户可能不允许更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--device-write-bps=路径:速率

限制向设备写入的速率(以每秒字节为单位)(例如 --device-write-bps=/dev/sda:1mb)。

在某些系统上,对于非 root 用户可能不允许更改资源限制。有关更多详细信息,请参阅 https://github.com/containers/podman/blob/main/troubleshooting.md#26-running-containers-with-resource-limits-fails-with-a-permissions-error

此选项在 cgroups V1 无根系统上不受支持。

--dns=ipaddr

在所有容器之间共享的 /etc/resolv.conf 文件中设置自定义 DNS 服务器。允许使用特殊选项“none”,它会禁用为 Pod 创建 /etc/resolv.conf。

--dns-option=选项

在所有容器之间共享的 /etc/resolv.conf 文件中设置自定义 DNS 选项。

--dns-search=

在所有容器之间共享的 /etc/resolv.conf 文件中设置自定义 DNS 搜索域。

--exit-policy=continue | stop

设置最后一个容器退出时 pod 的退出策略。支持的策略有

退出策略

描述

continue

当最后一个容器退出时,pod 会继续运行,通过保持其基础设施容器处于活动状态。默认使用。

stop

当最后一个容器退出时,pod(包括其基础设施容器)将停止。在 kube play 中使用。

--gidmap=pod_gid:host_gid:amount

用户命名空间的 GID 映射。使用此标志会在启用用户命名空间的情况下运行 pod 中的所有容器。它与 --userns--subgidname 标志冲突。

--gpus=ENTRY

要添加到容器的 GPU 设备(“all” 表示传递所有 GPU)。目前仅支持 Nvidia 设备。

--help, -h

打印使用说明。

--hostname=name

在所有容器中设置 pod 的主机名。

给定的主机名也会使用容器的主 IP 地址添加到 /etc/hosts 文件中(另请参阅 --add-host 选项)。

--infra

创建一个基础设施容器并将其与 pod 关联。基础设施容器是一个轻量级容器,用于协调 pod 的共享内核命名空间。默认值:true。

--infra-command=command

用于启动基础设施容器的命令。默认值:“/pause”。

--infra-conmon-pidfile=file

将基础设施容器的 conmon 进程的 pid 写入文件。由于 conmon 在与 Podman 不同的进程中运行,因此在使用 systemd 管理 Podman 容器和 pod 时,这是必需的。

--infra-image=image

用于基础设施容器的自定义镜像。除非指定,否则 Podman 会构建一个自定义本地镜像,它不需要拉取镜像。

--infra-name=name

用于 pod 的基础设施容器的名称。

--ip=ipv4

为 pod 指定一个静态 IPv4 地址,例如 10.88.64.128。此选项只能在 pod 加入单个网络时使用 - 也就是说,--network=network-name 最多使用一次 - 并且如果 pod 不通过 --network=container:id 加入另一个容器的网络命名空间。该地址必须位于网络的 IP 地址池内(默认值为 10.88.0.0/16)。

要为每个 pod 指定多个静态 IP 地址,请使用 --network 选项设置多个网络,并为每个网络使用 ip 模式为此选项指定一个静态 IP 地址。

--ip6=ipv6

为 pod 指定一个静态 IPv6 地址,例如 fd46:db93:aa76:ac37::10。此选项只能在 pod 加入单个网络时使用 - 也就是说,--network=network-name 最多使用一次 - 并且如果 pod 不通过 --network=container:id 加入另一个容器的网络命名空间。该地址必须位于网络的 IPv6 地址池内。

要为每个 pod 指定多个静态 IPv6 地址,请使用 --network 选项设置多个网络,并为每个网络使用 ip6 模式为此选项指定一个静态 IPv6 地址。

--label, -l=key=value

向 pod 添加元数据。

--label-file=file

读取一个以换行符分隔的标签文件。

--mac-address=address

Pod 网络接口 MAC 地址(例如 92:d0:c6:0a:29:33)此选项只能在 pod 加入单个网络时使用 - 也就是说,--network=network-name 最多使用一次 - 并且如果 pod 不通过 --network=container:id 加入另一个容器的网络命名空间。

请记住,以太网网络中的 MAC 地址必须是唯一的。根据 RFC4862,IPv6 链接本地地址基于设备的 MAC 地址。

要为每个 pod 指定多个静态 MAC 地址,请使用 --network 选项设置多个网络,并为每个网络使用 mac 模式为此选项指定一个静态 MAC 地址。

--memory, -m=number[unit]

内存限制。unit 可以是 b(字节)、k(KiB)、m(MiB)或 g(GiB)。

允许限制容器可用的内存。如果主机支持交换内存,则 -m 内存设置可以大于物理 RAM。如果指定了 0 的限制(不使用 -m),则容器的内存不会受到限制。实际限制可能会向上舍入到操作系统页大小的倍数(该值非常大,即数百万兆兆字节)。

此选项在 cgroups V1 无根系统上不受支持。

--memory-swap=number[unit]

等于内存加交换的限制值。unit 可以是 b(字节)、k(KiB)、m(MiB)或 g(GiB)。

必须与 -m--memory)标志一起使用。参数值必须大于 -m--memory)的值。默认情况下,它被设置为 --memory 值的两倍。

number 设置为 -1 以启用无限交换。

此选项在 cgroups V1 无根系统上不受支持。

--name, -n=name

为 pod 指定一个名称。

--network=mode, --net

设置 pod 的网络模式。

有效的 mode 值有

  • bridge[:OPTIONS,…]:在默认桥接器上创建网络堆栈。这是 rootful 容器的默认值。可以指定以下附加选项

    • alias=name:添加网络范围的容器别名。

    • ip=IPv4:为该容器指定一个静态 IPv4 地址。

    • ip6=IPv6:为该容器指定一个静态 IPv6 地址。

    • mac=MAC:为该容器指定一个静态 MAC 地址。

    • interface_name=name:指定在容器内部创建的网络接口的名称。

    例如,要设置一个静态 ipv4 地址和一个静态 mac 地址,请使用 --network bridge:ip=10.88.0.10,mac=44:33:22:11:00:99

  • <network name or ID>[:OPTIONS,…]:连接到用户定义的网络;这是通过 podman network create 创建的网络的网络名称或 ID。可以指定与上面桥接模式下描述的相同选项。多次使用 --network 选项以指定其他网络。
    为了向后兼容,也可以在第一个 --network 参数上指定以逗号分隔的网络,但这会阻止你使用上面桥接部分中描述的选项。

  • none:为容器创建网络命名空间,但不为其配置网络接口,因此容器没有网络连接。

  • container:id:重用另一个容器的网络堆栈。

  • host:不创建网络命名空间,容器使用主机的网络。注意:主机模式让容器完全访问本地系统服务(例如 D-bus),因此被认为是不安全的。

  • ns:path:要加入的网络命名空间的路径。

  • private:为容器创建一个新的命名空间。这将对 rootful 容器使用 bridge 模式,对 rootless 容器使用 slirp4netns

  • slirp4netns[:OPTIONS,…]:使用 slirp4netns(1) 创建一个用户网络堆栈。可以指定以下附加选项,它们也可以通过容器中的 network_cmd_options 设置

    • allow_host_loopback=true|false:允许 slirp4netns 访问主机回环 IP(默认值为 10.0.2.2,或更改后来自 slirp4netns cidr 子网的第二个 IP,请参阅下面的 cidr 选项)。默认值为 false。

    • mtu=MTU:指定要用于此网络的 MTU。(默认值为 65520)。

    • cidr=CIDR:指定要用于此网络的 IP 范围。(默认值为 10.0.2.0/24)。

    • enable_ipv6=true|false:启用 IPv6。默认值为 true。(对于 outbound_addr6 来说是必需的)。

    • outbound_addr=INTERFACE:指定 slirp 绑定的出站接口(仅限 IPv4 流量)。

    • outbound_addr=IPv4:指定 slirp 绑定的出站 IPv4 地址。

    • outbound_addr6=INTERFACE:指定 slirp 绑定的出站接口(仅限 IPv6 流量)。

    • outbound_addr6=IPv6:指定 slirp 绑定的出站 IPv6 地址。

    • port_handler=rootlesskit:使用 rootlesskit 进行端口转发。默认值。
      注意:Rootlesskit 将传入数据包的源 IP 地址更改为容器网络命名空间中的一个 IP 地址,通常是 10.0.2.100。如果应用程序需要真实的源 IP 地址(例如 Web 服务器日志),请使用 slirp4netns 端口处理程序。当连接到用户定义的网络时,rootlesskit 端口处理程序也用于 rootless 容器。

    • port_handler=slirp4netns:使用 slirp4netns 端口转发,它比 rootlesskit 慢,但会保留正确的源 IP 地址。此端口处理程序不能用于用户定义的网络。

  • pasta[:OPTIONS,…]:使用 pasta(1) 创建一个用户模式网络堆栈。
    这是 rootless 容器的默认值,并且仅在 rootless 模式下受支持。
    默认情况下,IPv4 和 IPv6 地址和路由以及 pod 接口名称将从主机复制。如果未配置端口转发,则端口会在 init 命名空间或容器命名空间中的任一侧绑定服务时动态转发。端口转发会保留原始源 IP 地址。pasta(1) 中描述的选项可以作为逗号分隔的参数指定。
    在 pasta(1) 选项方面,默认情况下会提供 **--config-net** 以在容器启动时配置网络,并且默认情况下也会假设 **--no-map-gw**,以避免容器使用网关地址直接访问主机。 后者可以通过在特定于 pasta 的选项中传递 **--map-gw** 来覆盖(尽管它不是实际的 pasta(1) 选项)。
    此外,如果分别没有配置从主机到容器的 TCP 或 UDP 端口转发,则将传递 **-t none** 和 **-u none**,以禁用基于绑定端口的自动端口转发。 类似地,**-T none** 和 **-U none** 用于禁用从容器到主机的相同功能。
    一些示例

    • **pasta:--map-gw**: 允许容器使用网关地址直接访问主机。

    • **pasta:--mtu,1500**: 为容器中的 tap 接口指定 1500 字节的 MTU。

    • **pasta:--ipv4-only,-a,10.0.2.0,-n,24,-g,10.0.2.2,--dns-forward,10.0.2.3,-m,1500,--no-ndp,--no-dhcpv6,--no-dhcp**, 等效于默认的 slirp4netns(1) 选项:禁用 IPv6,将 10.0.2.0/24 分配给容器中的 tap0 接口,网关为 10.0.2.3,启用位于 10.0.2.3 的 DNS 转发器,将 MTU 设置为 1500 字节,禁用 NDP、DHCPv6 和 DHCP 支持。

    • **pasta:-I,tap0,--ipv4-only,-a,10.0.2.0,-n,24,-g,10.0.2.2,--dns-forward,10.0.2.3,--no-ndp,--no-dhcpv6,--no-dhcp**, 等效于带有 Podman 覆盖的默认 slirp4netns(1) 选项:与上面相同,但将 MTU 保持为 65520 字节

    • **pasta:-t,auto,-u,auto,-T,auto,-U,auto**: 启用基于观察到的主机和容器两侧绑定端口的自动端口转发

    • **pasta:-T,5201**: 启用从容器到主机转发 TCP 端口 5201,使用回环接口而不是 tap 接口以提高性能

如果使用 **--dns**、**--dns-option** 或 **--dns-search** 且 **--network** 设置为 **none** 或 **container:***id***,则无效。

**--network-alias**=***alias***

为 pod 添加网络范围的别名,为容器加入的所有网络设置别名。 若要仅为特定网络设置名称,请使用别名选项,如 **--network** 选项下所述。 如果网络启用了 DNS(podman network inspect -f {{.DNSEnabled}} <name>),则这些别名可用于在给定网络上进行名称解析。 此选项可以指定多次。 注意:使用 CNI 时,pod 只能访问它加入的第一个网络上的别名。 netavark/aardvark-dns 不存在此限制。

**--no-hosts**

不要修改 pod 中的 /etc/hosts 文件。

Podman 默认情况下控制 pod 的 /etc/hosts 文件,并添加容器名称(见 **--name** 选项)和主机名(见 **--hostname** 选项)的条目,内部 host.containers.internalhost.docker.internal 主机,以及使用 **--add-host** 选项添加的任何主机名。 有关详细信息,请参阅 **--add-host** 选项。 传递 **--no-hosts** 会禁用此功能,以便保持映像的 /etc/hosts 文件不变。 通过在 containers.conf 中设置 no_hosts=true,可以实现相同的全局效果。

此选项与 **--add-host** 冲突。

**--pid**=***pid***

设置 pod 的 PID 模式。 默认情况下,为 pod 创建一个私有 PID 命名空间。 需要通过 --share 共享 PID 命名空间。

host: use the host’s PID namespace for the pod
ns: join the specified PID namespace
private: create a new namespace for the pod (default)

**--pod-id-file**=***path***

将 pod ID 写入文件。

**--publish**, **-p**=***[[ip:][hostPort]:]containerPort[/protocol]***

将容器的端口或端口范围发布到此 pod 内的主机上。

hostPortcontainerPort 都可以指定为端口范围。 当为两者指定范围时,范围内的容器端口数量必须与范围内的主机端口数量匹配。

如果主机 IP 设置为 0.0.0.0 或根本没有设置,则端口将绑定到主机上的所有 IP 上。

默认情况下,Podman 发布 TCP 端口。 要改为发布 UDP 端口,请将 udp 作为协议。 要发布 TCP 和 UDP 端口,请分别使用 tcpudp 作为协议,将 --publish 设置两次。 根容器也可以使用 sctp 协议发布端口。

主机端口不必指定(例如 podman run -p 127.0.0.1::80)。 如果没有指定,则容器端口会在主机上随机分配一个端口。

使用 **podman port** 查看实际映射:podman port $CONTAINER $CONTAINERPORT

请注意,网络驱动程序 macvlanipvlan 不支持端口转发,它对这些网络没有影响。

注意:您不能单独发布 pod 中容器的端口,而只能通过 pod 本身发布。

注意:此选项在 pod 创建后无法修改。

**--replace**

如果另一个具有相同名称的 pod 已经存在,则替换并删除它。 默认值为 **false**。

**--restart**=***policy***

容器退出时要遵循的重启策略。 如果容器通过 **podman kill** 或 **podman stop** 命令停止,重启策略不会生效。

有效的 policy 值为

  • no : 容器退出时不重启

  • never : no 的同义词;容器退出时不重启

  • on-failure[:max_retries] : 容器以非零退出代码退出时重启,无限期重试或直到达到可选的 max_retries 计数

  • always : 容器退出时重启,无论状态如何,无限期重试

  • unless-stopped : 与 always 相同

Podman 提供了一个 systemd 单元文件 podman-restart.service,它在系统重启后重启容器。

在 systemd 服务中运行容器时,使用 systemd 提供的重启功能。 换句话说,不要在容器单元中使用此选项,而是在 [Service] 部分中设置 Restart= systemd 指令。 请参阅 podman-systemd.unit(5) 和 systemd.service(5)。

pod 中所有容器的默认重启策略。

**--security-opt**=***option***

安全选项

  • **apparmor=unconfined** : 为 pod 关闭 apparmor 限制

  • **apparmor**=***alternate-profile*** : 为 pod 设置 apparmor 限制配置文件

  • **label=user:***USER***: 为 pod 进程设置标签用户

  • **label=role:***ROLE***: 为 pod 进程设置标签角色

  • **label=type:***TYPE***: 为 pod 进程设置标签进程类型

  • **label=level:***LEVEL***: 为 pod 进程设置标签级别

  • **label=filetype:***TYPE***: 为 pod 文件设置标签文件类型

  • **label=disable**: 为 pod 关闭标签分离

注意:可以通过在 containers.conf/etc/containers/containers.conf$HOME/.config/containers/containers.conf)文件中设置 label=false 来为所有 pod/容器禁用标记。

  • **label=nested**: 允许在容器内修改 SELinux 标签。 只要 SELinux 策略允许,容器就可以修改文件和进程上的 SELinux 标签。 没有 **nested**,容器会将 SELinux 视为已禁用,即使它在主机上启用也是如此。 容器被禁止设置任何标签。

  • **mask**=***/path/1:/path/2***: 用冒号分隔的要屏蔽的路径。 被屏蔽的路径在 pod 内的容器中无法访问。

  • **no-new-privileges**: 禁用容器进程获得额外权限。

  • **seccomp=unconfined**: 为 pod 关闭 seccomp 限制。

  • **seccomp=profile.json**: 用作 seccomp 过滤器的 JSON 文件。 请注意,io.podman.annotations.seccomp 注释使用指定的 value 设置,如 podman inspect 中所示。

  • **proc-opts**=***OPTIONS*** : 用于 /proc 挂载点的逗号分隔选项列表。 有关可能挂载选项的更多详细信息,请参阅 proc(5) 手册页。

  • **unmask**=***ALL*** 或 ***/path/1:/path/2***,或 shell 扩展路径 (/proc/*):用冒号分隔的要取消屏蔽的路径。 如果设置为 **ALL**,则会取消屏蔽默认情况下被屏蔽或设置为只读的所有路径。 默认的屏蔽路径是 **/proc/acpi, /proc/kcore, /proc/keys, /proc/latency_stats, /proc/sched_debug, /proc/scsi, /proc/timer_list, /proc/timer_stats, /sys/firmware, and /sys/fs/selinux**,** /sys/devices/virtual/powercap**。 默认的只读路径是 **/proc/asound**,**/proc/bus**,**/proc/fs**,**/proc/irq**,**/proc/sys**,**/proc/sysrq-trigger**,** /sys/fs/cgroup**。

注意:可以通过在 containers.conf(5) 文件中设置 label=false 来为所有容器禁用标记。

**--share**=***namespace***

要共享的内核命名空间的逗号分隔列表。 如果指定了 none 或 “”,则不共享任何命名空间,并且不会创建基础设施容器,除非通过 **--infra=true** 显式指定。 可供选择的命名空间是 cgroup、ipc、net、pid、uts。 如果选项以 “+” 为前缀,则命名空间将附加到默认列表。 否则,它将替换默认列表。 默认值与 Kubernetes 默认值匹配(ipc、net、uts)

**--share-parent**

此布尔值确定进入 pod 的所有容器是否都使用 pod 作为其 cgroup 父级。 此选项的默认值为 true。 使用 **--share** 选项共享 cgroup 命名空间,而不是 pod 中的 cgroup 父级。

注意:此选项与 **--share=cgroup** 选项冲突,因为该选项将 pod 设置为 cgroup 父级,但会将容器放入与基础设施容器相同的 cgroupNS 中。

**--shm-size**=***number[unit]***

/dev/shm 的大小。 unit 可以是 **b**(字节)、**k**(kibibytes)、**m**(mebibytes)或 **g**(gibibytes)。 如果省略了单位,则系统使用字节。 如果省略了大小,则默认值为 **64m**。 当 size 为 **0** 时,对 pod 使用的 IPC 内存量没有限制。 此选项与 **--ipc=host** 冲突。

--shm-size-systemd=number[unit]

systemd 特定 tmpfs 挂载的大小,例如 /run、/run/lock、/var/log/journal 和 /tmp。unit 可以是 b(字节)、k(Kibibytes)、m(Mebibytes)或 g(Gibibytes)。如果省略了单位,则系统使用字节。如果省略了大小,则默认值为 64m。当 size0 时,使用量限制为主机可用内存的 50%。

--subgidname=name

在新的用户命名空间中运行容器,使用 /etc/subgid 文件中具有 name 的映射。如果以非特权用户运行,则用户需要有权使用映射。请参见 subgid(5)。此标志与 --userns--gidmap 冲突。

--subuidname=name

在新的用户命名空间中运行容器,使用 /etc/subuid 文件中具有 name 的映射。如果以非特权用户运行,则用户需要有权使用映射。请参见 subuid(5)。此标志与 --userns--uidmap 冲突。

--sysctl=name=value

为 Pod 中的所有容器配置命名空间内核参数。

对于 IPC 命名空间,允许以下 sysctls

  • kernel.msgmax

  • kernel.msgmnb

  • kernel.msgmni

  • kernel.sem

  • kernel.shmall

  • kernel.shmmax

  • kernel.shmmni

  • kernel.shm_rmid_forced

  • 以 fs.mqueue.* 开头的 Sysctls

注意:如果 IPC 命名空间未在 Pod 内共享,则不允许使用以上 sysctls。

对于网络命名空间,仅允许以 net.* 开头的 sysctls。

注意:如果网络命名空间未在 Pod 内共享,则不允许使用以上 sysctls。

--uidmap=container_uid:from_uid:amount

在新的用户命名空间中运行 Pod 中的所有容器,使用提供的映射。此选项与 --userns--subuidname 选项冲突。此选项提供了一种将主机 UID 映射到容器 UID 的方法。它可以多次传递以映射不同的范围。

--userns=mode

设置 Pod 中所有容器的用户命名空间模式。它默认为 PODMAN_USERNS 环境变量。空值(“”)表示禁用用户命名空间。

非特权用户 --userns=Key 映射

Key

主机用户

容器用户

“”

$UID

0(默认用户帐户映射到容器中的 root 用户。)

host

$UID

0(默认用户帐户映射到容器中的 root 用户。)

keep-id

$UID

$UID(将用户帐户映射到容器中的相同 UID。)

auto

$UID

nil(主机用户 UID 未映射到容器。)

nomap

$UID

nil(主机用户 UID 未映射到容器。)

有效的 mode 值有

  • auto[:OPTIONS,…]:自动创建命名空间。可以指定这些选项到 auto

    • gidmapping=CONTAINER_GID:HOST_GID:SIZE 强制在用户命名空间中存在 GID 映射。

    • size=SIZE:为自动用户命名空间指定显式大小。例如 --userns=auto:size=8192。如果未指定 size,则 auto 会估计用户命名空间的大小。

    • uidmapping=CONTAINER_UID:HOST_UID:SIZE 强制在用户命名空间中存在 UID 映射。

  • host:在调用者的用户命名空间中运行。在容器中运行的进程对主机的权限与调用用户启动的任何其他进程相同(默认值)。

  • keep-id:创建一个用户命名空间,其中当前非特权用户的 UID:GID 映射到容器中的相同值。对于 root 用户创建的容器,此选项不允许。

  • nomap:创建一个用户命名空间,其中当前非特权用户的 UID:GID 未映射到容器中。对于 root 用户创建的容器,此选项不允许。

--uts=mode

设置 Pod 的 UTS 命名空间模式。支持以下值

  • host:在 Pod 内使用主机的 UTS 命名空间。

  • private:为 Pod 创建一个新的命名空间(默认值)。

  • ns:[path]:在给定的现有 UTS 命名空间中运行 Pod。

--volume, -v=[[SOURCE-VOLUME|HOST-DIR:]CONTAINER-DIR[:OPTIONS]]

创建绑定挂载。如果指定了 -v /HOST-DIR:/CONTAINER-DIR,Podman 会将主机的 /HOST-DIR 绑定挂载到 Podman 容器的 /CONTAINER-DIR 中。类似地,-v SOURCE-VOLUME:/CONTAINER-DIR 将主机上的命名卷挂载到容器中。如果不存在此类命名卷,Podman 会创建一个。如果没有提供源,则该卷将作为匿名命名卷创建,并具有随机生成的名称,并在 Pod 通过 --rm 标志或 podman rm --volumes 命令删除时被删除。

(注意,在使用远程客户端(包括 Mac 和 Windows(不包括 WSL2)机器)时,卷将从远程服务器挂载,不一定从客户端机器挂载。)

OPTIONS 是一个用逗号分隔的列表,可以包含以下一个或多个选项

  • rw|ro

  • z|Z

  • [O]

  • [U]

  • [no]copy

  • [no]dev

  • [no]exec

  • [no]suid

  • [r]bind

  • [r]shared|[r]slave|[r]private[r]unbindable [1]

  • idmap[=options]

CONTAINER-DIR 必须是绝对路径,例如 /src/docs。卷将挂载到容器中的此目录。

如果指定了卷源,则它必须是主机上的路径或命名卷的名称。主机路径可以是绝对路径或相对路径;相对路径相对于运行 Podman 的目录解析。如果源不存在,Podman 会返回错误。用户必须预先创建源文件或目录。

任何以 ./ 开头的源都被视为命名卷的名称。如果不存在具有该名称的卷,则会创建它。使用名称创建的卷不是匿名的,不会被 --rm 选项和 podman rm --volumes 命令删除。

指定多个 -v 选项以将一个或多个卷挂载到 Pod 中。

Write Protected Volume Mounts

添加 :ro:rw 选项分别以只读或读写模式挂载卷。默认情况下,卷以读写模式挂载。请参见示例。

Chowning Volume Mounts

默认情况下,Podman 不会更改挂载到容器中的源卷目录的所有者和组。如果在新的用户命名空间中创建 Pod,则容器中的 UID 和 GID 可能对应于主机上的另一个 UID 和 GID。

后缀 :U 告诉 Podman 使用基于 Pod 内的 UID 和 GID 的正确主机 UID 和 GID,以递归更改源卷的所有者和组。Chowning 遍历卷下的文件系统并更改每个文件上的 UID/GID。如果卷有成千上万个 inode,此过程需要很长时间,会延迟 Pod 的启动。

警告 谨慎使用,因为它会修改主机文件系统。

Labeling Volume Mounts

像 SELinux 这样的标签系统要求在挂载到 Pod 中的卷内容上放置适当的标签。如果没有标签,安全系统可能会阻止 Pod 中运行的进程使用内容。默认情况下,Podman 不会更改操作系统设置的标签。

要在 Pod 上下文中更改标签,请将两个后缀中的任何一个 :z:Z 添加到卷挂载中。这些后缀告诉 Podman 重新标记共享卷上的文件对象。z 选项告诉 Podman 两个或多个 Pod 共享卷内容。因此,Podman 会使用共享内容标签标记内容。共享卷标签允许所有容器读取/写入内容。Z 选项告诉 Podman 使用私有未共享标签标记内容。只有当前 Pod 可以使用私有卷。注意:pod 内的所有容器共享相同的 SELinux 标签。这意味着该 Pod 内的所有容器都可以读取/写入使用 :Z 创建的容器中共享的卷。重新标记会遍历卷下的文件系统并更改每个文件上的标签,如果卷有成千上万个 inode,此过程需要很长时间,会延迟 Pod 的启动。如果卷之前已使用 z 选项重新标记,则 Podman 经过优化不会第二次重新标记。如果将文件移动到卷中,则可以使用 chcon -Rt container_file_t PATH 命令手动更改标签。

注意:不要重新标记系统文件和目录。重新标记系统内容可能会导致机器上的其他受限服务失败。对于这些类型的容器,我们建议禁用 SELinux 分离。选项 --security-opt label=disable 会为 Pod 禁用 SELinux 分离。例如,如果用户想要将整个主目录卷挂载到 Pod 中,则需要禁用 SELinux 分离。

$ podman pod create --security-opt label=disable -v $HOME:/home/user fedora touch /home/user/file

Overlay Volume Mounts

:O 标志告诉 Podman 使用 overlay file system 将主机上的目录挂载为临时存储。Pod 进程可以修改挂载点内的内容,这些内容存储在容器存储中的一个单独目录中。在 overlay 术语中,源目录是 lower,容器存储目录是 upper。对挂载点的修改会在 Pod 结束执行时销毁,类似于 unmount tmpfs 挂载点。

对于高级用户,overlay 选项还支持 overlay 挂载的自定义非易失性 upperdirworkdir。用户可以完全自行管理自定义 upperdirworkdir,Podman 不会在生命周期完成后将其删除。例如 :O,upperdir=/some/upper,workdir=/some/work

容器的后续执行会看到原始源目录内容,之前的 Pod 执行中的任何更改都不再存在。

overlay 挂载的一个用例是将主机的包缓存共享到容器中,以加快构建速度。

注意:O 标志与上面列出的其他选项冲突。

挂载到容器中的内容用 private 标签标记。在 SELinux 系统上,源目录中的标签必须可由 Pod 基础设施容器标签读取。通常,容器可以读取/执行 container_share_t,并且可以读取/写入 container_file_t。如果无法更改源卷上的标签,则必须为 Pod 或基础设施容器禁用 SELinux 容器隔离才能正常工作。

不要修改使用 overlay 挂载挂载到 Pod 中的源目录,这会导致意外故障。仅在容器运行结束后修改目录。

Mounts propagation

默认情况下,绑定挂载的卷是 private。这意味着 Pod 内部完成的任何挂载都不会在主机上可见,反之亦然。可以通过指定卷挂载传播属性来更改此行为。当卷为 shared 时,在 Pod 内部该卷下完成的挂载在主机上可见,反之亦然。将卷设为 slave[1] 仅启用单向挂载传播:在主机上该卷下完成的挂载在容器内部可见,反之亦然。

为了控制卷的挂载传播属性,可以使用 [r]shared、[r]slave、[r]private 或 [r]unbindable 传播标志。传播属性只能为绑定挂载的卷指定,不能为内部卷或命名卷指定。为了使挂载传播生效,源挂载点(源目录挂载到的挂载点)必须具有正确的传播属性。对于共享卷,源挂载点必须是共享的。对于从属卷,源挂载点必须是共享的或从属的。[1]

要递归地将卷及其所有子挂载挂载到 Pod 中,请使用 rbind 选项。默认情况下使用 bind 选项,源目录的子挂载不会挂载到 Pod 中。

使用 copy 选项挂载卷会告诉 podman 将内容从底层目标目录复制到新创建的内部卷中。copy 仅在卷首次创建时发生。卷随后在不同容器上使用时不会复制内容。copy 选项在绑定挂载上会被忽略,并且没有效果。

使用 nosuid 选项挂载卷意味着卷上的 SUID 可执行文件不能被应用程序用于更改其权限。默认情况下,卷以 nosuid 方式挂载。

使用 noexec 选项挂载卷意味着卷上的任何可执行文件都不能在 Pod 中执行。

使用 nodev 选项挂载卷意味着卷上的任何设备都不能被 Pod 中的进程使用。默认情况下,卷以 nodev 方式挂载。

如果 HOST-DIR 是一个挂载点,那么内核会忽略 devsuidexec 选项。

使用 df HOST-DIR 来确定源挂载,然后使用 findmnt -o TARGET,PROPAGATION source-mount-dir 来确定源挂载的传播属性。如果 findmnt(1) 实用程序不可用,那么可以在 /proc/self/mountinfo 中查看源挂载点的挂载条目。查看“可选字段”,看看是否指定了任何传播属性。在那里,shared:N 表示挂载是共享的,master:N 表示挂载是从属的,如果没有,则挂载是私有的。[1]

要更改挂载点的传播属性,请使用 mount(8) 命令。例如,如果要绑定挂载源目录 /foo,可以执行 mount --bind /foo /foomount --make-private --make-shared /foo。这会将 /foo 转换为共享挂载点。或者,可以直接更改源挂载的传播属性。假设 //foo 的源挂载,那么使用 mount --make-shared // 转换为共享挂载。

注意:如果用户仅通过组拥有访问权限,则从无根 Pod 内部访问卷会失败。

Idmapped mount

如果指定了 idmap,则创建到容器中目标用户命名空间的 idmapped 挂载。idmap 选项支持自定义映射,该映射可能与容器使用的用户命名空间不同。映射可以在 idmap 选项之后指定,例如:idmap=uids=0-1-10#10-11-10;gids=0-100-10。对于每个三元组,第一个值是映射到主机上第二个值的备份文件系统 ID 的起始位置。此映射的长度在第三个值中给出。多个范围用 # 分隔。

--volumes-from=CONTAINER[:OPTIONS]

从指定的容器(s)挂载卷。用于在容器和 Pod 之间共享卷。options 是一个逗号分隔的列表,包含以下可用元素

  • rw|ro

  • z

将源容器中已挂载的卷挂载到另一个 Pod 上。CONTAINER 可以是名称或 ID。要共享卷,请在运行目标容器时使用 --volumes-from 选项。即使源容器未运行,也可以共享卷。

默认情况下,Podman 以与源容器中挂载相同的模式(读写或只读)挂载卷。这可以通过添加 rorw option 来更改。

像 SELinux 这样的标签系统要求在挂载到 Pod 中的卷内容上放置适当的标签。如果没有标签,安全系统可能会阻止容器内部运行的进程使用该内容。默认情况下,Podman 不会更改操作系统设置的标签。

要更改 Pod 上下文中的标签,请在卷挂载中添加 z。此后缀告诉 Podman 重新标记共享卷上的文件对象。z 选项告诉 Podman 两个实体共享卷内容。因此,Podman 使用共享内容标签标记内容。共享卷标签允许所有容器读取/写入内容。

如果来自源容器的卷的位置与目标 Pod 上驻留的数据重叠,那么该卷会隐藏目标上的数据。

EXAMPLES

创建一个命名 Pod。

$ podman pod create --name test

创建一个命名 Pod。

$ podman pod create mypod

创建一个没有基础设施容器的 Pod。

$ podman pod create --infra=false

创建一个命名 Pod,其中基础设施容器命令要运行。

$ podman pod create --infra-command /top toppod

创建一个在主机上发布了端口的 Pod。

$ podman pod create --publish 8443:443

创建一个具有指定网络配置的 Pod。

$ podman pod create --network slirp4netns:outbound_addr=127.0.0.1,allow_host_loopback=true

创建一个具有指定网络的 Pod。

$ podman pod create --network pasta

创建一个在两个网络上的 Pod。

$ podman pod create --network net1:ip=10.89.1.5 --network net2:ip=10.89.10.10

SEE ALSO

podman(1), podman-pod(1), podman-kube-play(1), containers.conf(1), cgroups(7)

Troubleshooting

有关常见问题的解决方案,请参阅 podman-troubleshooting(7)

HISTORY

2018 年 7 月,最初由 Peter Hunt 编译 pehunt@redhat.com

FOOTNOTES

1: Podman 项目致力于包容性,这是开源的核心价值观。此处使用的 masterslave 挂载传播术语存在问题,并且具有争议性,需要更改。但是,这些术语目前在 Linux 内核中使用,现在必须按原样使用。当内核维护者纠正此用法时,Podman 会立即效仿。