什么是podman
Podman是一个无守护进程的开源 Linux 原生工具,旨在使用开放容器倡议 ( OCI )容器和容器映像轻松查找、运行、构建、共享和部署应用程序。Podman
提供了任何使用过 Docker
容器引擎的人都熟悉的命令行界面 (CLI) 。大多数用户可以简单地将 Docker 别名为 Podman(别名 docker=podman
),没有任何问题,不同的是 Podman
没有 daemon
。以前使用 Docker CLI
的时候,Docker CLI
会通过 gRPC API
去跟 Docker Engine
说「我要启动一个容器」,然后 Docker Engine
才会通过 OCI Container runtime
(默认是 runc
)来启动一个容器。这就意味着容器的进程不可能是 Docker CLI 的子进程,而是 Docker Engine 的子进程。与其他常见的容器引擎(Docker
、CRI-O
、containerd
)类似,Podman
依赖于符合 OCI 的容器运行时(runc
、crun
、runv
等)与操作系统交互并创建正在运行的容器。这使得 Podman
创建的运行容器与任何其他常见容器引擎创建的容器几乎没有区别。
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
,并传递到容器进程以便使用它们。
Podman 控制下的容器可以由 root 或非特权用户运行。Podman 使用libpod库管理整个容器生态系统,包括 pod、容器、容器镜像和容器卷。
有一个 RESTFul API
来管理容器。我们还有一个可以与 RESTFul
服务交互的远程 Podman
客户端。我们目前支持 Linux
、Mac
和 Windows
上的客户端。RESTFul
服务仅在 Linux
上受支持。
如果您完全不熟悉容器,我们建议您查看简介。对于高级用户或来自 Docker 的用户,请查看我们的教程。对于高级用户和贡献者,您可以通过查看我们的命令页面来获取有关 Podman CLI 的非常详细的信息。最后,对于寻求如何与 Podman API 交互的开发人员,请参阅我们的 API 文档参考。
安装
- 官方安装
我的机器环境CentOS Linux 7
yum -y install podman
配置
podman包附带文件
$ rpm -ql podman |grep -v '/usr/share/man/' # 去除 man 手册中内容
/etc/cni/net.d/87-podman-bridge.conflist
/usr/bin/podman
/usr/lib/.build-id
/usr/lib/.build-id/37
/usr/lib/.build-id/37/e7f04d352e5dbde603e9701baedb0b1be6bc37
/usr/lib/.build-id/9a
/usr/lib/.build-id/9a/2b43332ca5756f9e2a086bae9b953009ef5a37
/usr/lib/systemd/system/io.podman.service
/usr/lib/systemd/system/io.podman.socket
/usr/lib/tmpfiles.d/podman.conf
/usr/libexec/podman/conmon
/usr/share/bash-completion/completions/podman
/usr/share/containers/libpod.conf
/usr/share/licenses/podman
/usr/share/licenses/podman/LICENSE
/etc/cni
可以看到只有一个配置文件是在 /etc/cni
路径下的,与 Bridge
的配置有关:
$ cat /etc/cni/net.d/87-podman-bridge.conflist
{
"cniVersion": "0.4.0",
"name": "podman",
"plugins": [
{
"type": "bridge",
"bridge": "cni-podman0",
"isGateway": true,
"ipMasq": true,
"ipam": {
"type": "host-local",
"routes": [
{
"dst": "0.0.0.0/0"
}
],
"ranges": [
[
{
"subnet": "10.88.0.0/16",
"gateway": "10.88.0.1"
}
]
]
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
},
{
"type": "firewall"
}
]
}
registries.conf
/etc/containers/registries.conf
用于保存 registries
相关配置:
$ cat /etc/containers/registries.conf |grep -v '#' |grep -v ^$
[registries.search]
registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io']
[registries.insecure]
registries = []
[registries.block]
registries = []
mounts.conf
/usr/share/containers/mounts.conf
在执行 podman run
或者 podman build
命令时自动挂载的路径,该路径只会在容器运行时挂载,不会提交到容器镜像中。
$ cat /usr/share/containers/mounts.conf
/usr/share/rhel/secrets:/run/secrets
seccomp.json
/usr/share/containers/seccomp.json
是容器内允许的 seccomp
规则白名单。 seccomp
(secure computing)是一种安全保护机制,一般情况下,程序可以使用所有的 syscall
,但是为了避免安全问题发生,通常会指定相应的规则来保证。
$ cat /usr/share/containers/seccomp.json
{
"defaultAction": "SCMP_ACT_ERRNO",
"archMap": [
{
"architecture": "SCMP_ARCH_X86_64",
"subArchitectures": [
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
]
},
{
"architecture": "SCMP_ARCH_AARCH64",
"subArchitectures": [
"SCMP_ARCH_ARM"
]
},
{
"architecture": "SCMP_ARCH_MIPS64",
"subArchitectures": [
"SCMP_ARCH_MIPS",
"SCMP_ARCH_MIPS64N32"
]
},
·······················
policy.json
/etc/containers/policy.json
证书安全相关配置:
$ cat /etc/containers/policy.json
{
"default": [
{
"type": "insecureAcceptAnything"
}
],
"transports":
{
"docker-daemon":
{
"": [{"type":"insecureAcceptAnything"}]
}
}
}