跳到主要内容

创建新的容器

摘要

podman create [选项] 镜像 [命令 [参数 ...]]

podman container create [选项] 镜像 [命令 [参数 ...]]

描述

在指定的镜像上创建一个可写的容器层,并准备运行指定的命令。然后将容器ID打印到标准输出。这与 podman run -d 类似,只是容器从未启动。使用 podman start 容器 命令可以在任何时间点启动容器。

使用 podman create 创建的容器的初始状态是 'created'。

默认设置位于 containers.conf 文件中。大多数远程连接的设置使用服务器的 containers.conf,除非在手册页中另有说明。

镜像

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

dir:_path_

一个现有的本地目录 _path_,存储清单、层 tarballs 和签名作为单独的文件。这是一种非标准化的格式,主要用于调试或非侵入式容器检查。

podman save --format docker-dir fedora -o /tmp/fedora
podman create 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 create 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 create 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 create docker-daemon:docker.io/library/fedora echo hello

oci-archive:_path_**:**_tag_ 位于指定_path_的符合“Open Container Image Layout Specification”的目录中的镜像,并使用 _tag_指定。

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

选项

以下是一些 podman create 命令的选项:

@@option add-host 添加自定义主机到容器的 /etc/hosts 文件。

@@option annotation.container 为容器设置注解。

@@option arch 设置容器架构。

@@option attach 附加到容器的标准输入、输出和错误流。

@@option authfile 指定认证文件的路径,用于访问私有镜像仓库。

@@option blkio-weight 设置块 I/O 权重。

@@option blkio-weight-device 设置特定设备的块 I/O 权重。

@@option cap-add 向容器添加 Linux 能力。

@@option cap-drop 从容器中删除 Linux 能力。

@@option cgroup-conf 指定 cgroup 配置文件的路径。

@@option cgroup-parent 为容器指定父 cgroup。

@@option cgroupns 启用或禁用 cgroup 命名空间。

@@option cgroups 为容器设置 cgroup 控制器。

@@option chrootdirs 设置 chroot 目录列表。

@@option cidfile.write 将容器 ID 写入指定的文件。

@@option conmon-pidfile 指定 conmon 进程的 PID 文件的路径。

@@option cpu-period 限制 CPU CFS 调度器周期。

@@option cpu-quota 限制 CPU CFS 调度器配额。

@@option cpu-rt-period 限制实时 CPU 周期。

@@option cpu-rt-runtime 限制实时 CPU 运行时间。

@@option cpu-shares 设置 CPU 使用权共享(相对权重)。

@@option cpus.container 设置容器可以使用的 CPU 数。

@@option cpuset-cpus 限制容器可以使用的 CPU 集。

@@option cpuset-mems 限制容器可以使用的内存节点集。

@@option decryption-key 指定用于解密镜像的密钥。

@@option device 向容器添加设备映射。

请注意,这里的 @@option 符号表示实际的手册页中应该使用正确的选项格式和描述。这些选项的完整列表和详细解释可以在 podman create 的手册页中找到。您可以使用 man podman-create 命令来查看手册页。

注意:如果用户仅通过组拥有访问权限,那么从非特权容器内部访问设备将失败。使用 --group-add keep-groups 标志将用户的辅助组访问权限传递到容器中。

@@option device-cgroup-rule

@@option device-read-bps

@@option device-read-iops

@@option device-write-bps

@@option device-write-iops

@@option disable-content-trust

@@option dns

此选项不能与设置为 nonecontainer:_id_--network 选项一起使用。

@@option dns-option.container

@@option dns-search.container

@@option entrypoint

@@option env

关于优先级和示例,请参阅下面的【环境变量】说明。

@@option env-file

关于优先级和示例,请参阅下面的【环境变量】说明。

@@option env-host

@@option env-merge

@@option expose

@@option gidmap.container

@@option gpus

@@option group-add

@@option group-entry

@@option health-cmd

@@option health-interval

@@option health-on-failure

@@option health-retries

@@option health-start-period

@@option health-startup-cmd

@@option health-startup-interval

@@option health-startup-retries

@@option health-startup-success

@@option health-startup-timeout

@@option health-timeout

--help

打印使用说明

@@option hostname.container

@@option hostuser

@@option http-proxy

@@option image-volume

@@option init

--init-ctr=type

(仅用于 Pods)。 当使用 Pods 时,创建一个初始化风格的容器,该容器在基础容器启动后但在常规 Pod 容器启动前运行。初始化容器对于运行 Pod 应用程序的设置操作很有用。

init-ctr 类型的有效值是 alwaysoncealways 值意味着容器在每次 pod start 时都会运行,而 once 值意味着容器仅在 Pod 启动时运行一次,然后容器将被删除。

初始化容器仅在 Pod start 时运行。重新启动 Pod 并不会执行任何初始化容器。此外,初始化容器只能在 Pod 未运行时在 Pod 中创建。

@@option init-path

@@option interactive

@@option ip

@@option ip6

@@option ipc

@@option label

@@option label-file

@@option link-local-ip

@@option log-driver

@@option log-opt

@@option mac-address

@@option memory

@@option memory-reservation

@@option memory-swap

@@option memory-swappiness

@@option mount

@@option name.container

@@option network

如果与设置为 nonecontainer:_id_--network 一起使用 --dns--dns-option--dns-search,则无效。

如果与 --pod 一起使用,则容器不会加入 Pod 的网络命名空间。

@@option network-alias

@@option no-healthcheck

@@option no-hosts

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

@@option oom-kill-disable

@@option oom-score-adj

@@option os.pull

@@option passwd-entry

@@option personality

@@option pid.container

@@option pidfile

@@option pids-limit

@@option platform

@@option pod.run

@@option pod-id-file.container

@@option privileged

@@option publish

publish 选项用于将容器的网络端口发布到宿主机的端口,这样外部网络可以访问容器内的服务。发布端口时,需要指定容器内的端口号和宿主机上的端口号。容器内的端口号是服务在容器内监听的端口,而宿主机上的端口号是外部网络访问该服务的入口。

使用 publish 选项时,可以指定单个端口映射,也可以指定多个端口映射。每个端口映射由两部分组成:容器内端口和宿主机端口。它们之间用冒号分隔,多个端口映射之间用空格分隔。

例如,要将容器内的 80 端口映射到宿主机的 8080 端口,可以使用以下命令:

podman器,并将所有到达该端口的流量转发到容器内的 80 端口。

请注意,如果宿主机上的端口已经被其他进程占用,则无法成功发布端口。在这种情况下,您需要选择一个未被占用的端口进行映射,或者停止占用该端口的进程。

此外,publish 选项还可以与其他网络相关的选项一起使用,例如 --network 选项,用于指定容器所使用的网络模式。

注意: 如果容器在 Pod 内运行,则无需为 Pod 中的容器发布端口。端口只需由 Pod 本身发布。Pod 的网络堆栈就像主机上的网络堆栈一样——当 Pod 中有多个容器和容器中的程序时,它们共享一个接口、一个 IP 地址和相关端口。如果一个容器绑定到一个端口,那么在 Pod 中使用该端口时,其他容器不能使用该端口。Pod 中的容器还可以通过让一个容器在 Pod 中绑定到 localhost,另一个容器连接到该端口,在 localhost 上进行通信。

@@option publish-all

@@option pull

--quiet, -q

在拉取镜像时抑制输出信息。

@@option rdt-class

@@option read-only

@@option read-only-tmpfs

@@option replace

@@option requires

@@option restart

@@option retry

@@option retry-delay

--rm

当容器退出时,自动删除容器以及与其关联的任何匿名未命名卷。默认值为 false。使用此选项可以确保容器运行完毕后,其占用的存储资源得到及时清理。

@@option rootfs

@@option sdnotify

@@option seccomp-policy

@@option secret

@@option security-opt

@@option shm-size

@@option shm-size-systemd

@@option stop-signal

@@option stop-timeout

@@option subgidname

@@option subuidname

@@option sysctl

@@option systemd

@@option timeout

@@option tls-verify

@@option tmpfs

@@option tty

@@option tz

@@option uidmap.container

@@option ulimit

@@option umask

@@option unsetenv

@@option unsetenv-all

@@option user

@@option userns.container

@@option uts.container

@@option variant.container

@@option volume

如果希望将用户的辅助组访问权限传递到容器中,可以使用 --group-add keep-groups 选项。

@@option volumes-from

@@option workdir

示例

使用本地镜像创建一个容器:

podman create alpine ls

使用本地镜像创建一个容器,并为其添加注解:

podman create --annotation HELLO=WORLD alpine ls

使用本地镜像创建一个容器,为其分配一个伪终端(pseudo-TTY),保持标准输入(stdin)打开,并为其命名为 myctr:

podman create -t -i --name myctr alpine ls

在这些示例中,podman create 命令用于创建一个新的容器,但并不立即启动它。-t 选项为容器分配一个伪终端,-i 选项保持容器的标准输入打开,--name 选项用于为容器指定一个名称。这样,您可以稍后使用 podman start 命令来启动这个容器,或者使用 podman rm 命令来删除它。

使用 --rm 选项时,容器运行完毕后会自动删除。这特别适用于那些一次性运行并完成后不需要保留的容器。这个选项对于快速测试或运行短生命周期的任务非常有用,因为它可以自动清理不再需要的容器,避免手动删除。

例如,假设您想要运行一个临时任务并查看其输出,然后自动删除该容器,您可以使用以下命令:

podman run --rm my-image my-command

my-command 执行完毕后,对应的容器会被自动删除,无需手动执行 podman rm 命令。

这个选项可以与许多其他 podman run 的选项一起使用,以定义容器的运行环境和行为。请注意,如果容器以非零状态退出(表示发生了错误),它仍然会被删除,除非您使用了其他选项(如 --restart)来指定重试策略。

总之,--rm 选项为临时容器提供了一种方便的方式来自动清理资源,简化了容器管理的过程。

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

podman create --uidmap 0:30000:7000 --gidmap 0:30000:7000 fedora echo hello

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

# podman create --userns=auto:size=65536 ubi8-init

在容器中配置时区:

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

确保第一个容器(container1)正在运行,然后再启动第二个容器(container2):

podman create --name container1 -t -i fedora bash
podman create --name container2 --requires container1 -t -i fedora bash
podman start --attach container2

创建一个需要多个容器的容器:

podman create --name container1 -t -i fedora bash
podman create --name container2 -t -i fedora bash
podman create --name container3 --requires container1,container2 -t -i fedora bash
podman start --attach container3

使用通配符将容器内的共享库以只读方式暴露出来:

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

创建一个允许补充组访问卷的容器:

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

使用个性(personality)选项为容器配置执行域:

podman create --name container1 --personality=LINUX32 fedora bash

创建一个具有外部rootfs作为覆盖层挂载的容器:

podman create --name container1 --rootfs /path/to/rootfs:O bash

创建一个连接到两个网络(称为net1和net2)并具有静态IP地址的容器:

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

无根容器

Podman 在大多数系统上作为非 root 用户运行。这一特性要求安装足够新版本的 shadow-utils。shadow-utils 包必须包含 newuidmap 和 newgidmap 可执行文件。

为了让用户能够以无根方式运行,/etc/subuid 和 /etc/subgid 文件中必须有一个针对其用户名的条目,这些条目列出了用于其用户命名空间的 UID。

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

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

环境变量

可以使用多种不同的选项来设置容器内的环境变量。本节将描述它们的优先级顺序。

优先级顺序(后面的条目会覆盖前面的条目):

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

创建容器并设置以 __*__ 结尾的环境变量。只有当没有指定值时,末尾的 __*__通配符功能才有效:

export ENV1=a
podman create --name ctr1 --env 'ENV*' alpine env
podman start --attach ctr1 | grep ENV
ENV1=a
podman create --name ctr2 --env 'ENV*=b' alpine env
podman start --attach ctr2 | 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), pasta(1), fuse-overlayfs(1), proc(5), conmon(8), personality(2)

历史

2017年10月,由Dan Walsh从Docker文档转换为Podman文档,用于Podman <dwalsh@redhat.com>

2014年11月,由Sven Dowideit更新 <SvenDowideit@home.org.au>

2014年9月,由Sven Dowideit更新 <SvenDowideit@home.org.au>

2014年8月,由Sven Dowideit更新 <SvenDowideit@home.org.au>

备注

Podman项目致力于包容性,这是开源的核心价值之一。这里使用的“master”和“slave”挂载传播术语是有问题的,且具有分裂性,需要更改。然而,这些术语目前在Linux内核中使用,必须按原样使用。当内核维护者纠正这种用法时,Podman将立即跟进。