创建新的容器
摘要
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
此选项不能与设置为 none 或 container:_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
类型的有效值是 always 或 once。always 值意味着容器在每次 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
如果与设置为 none 或 container:_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_proxy 和 no_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将立即跟进。