Podman
Podman是一个符合OCI标准的容器管理工具,它提供了与Docker类似的功能来管理容器,并且能够运行无root容器。
概述[ ]
Podman是一个用于管理容器和容器镜像的工具,它是一个轻量级的容器引擎,允许用户在Linux系统上创建、运行和管理OCI(Open Container Initiative)兼容的容器。与Docker相似,但是Podman在设计上更注重安全性和可移植性。
与Docker不同的是,Podman不需要守护进程(daemon)来管理容器,而是通过普通用户权限直接操作容器,这增强了安全性和用户体验。同时,Podman还支持多个容器管理工具(例如pod)和容器网络功能,使得它成为一个功能强大且灵活的容器管理工具。
Podman镜像[ ]
默认镜像库[ ]
文件 /etc/containers/registries.conf 是设置镜像地址配置文件,默认会搜索['registry.access.redhat.com', 'registry.redhat.io', 'docker.io', 'quay.io']等几个镜像库。不过,这几个镜像库下载速度非常慢,可以说是基本无法顺利的将镜像拉下来。所以,需要修改修改镜像库配置文件,也就是大家说的镜像加速方案。
镜像加速[ ]
只需2个步骤实现镜像加速:
1、改名并备份好文件:/etc/containers/registries.conf
2、再新建一个空的 registries.conf 文件,插入如下内容
unqualified-search-registries = ["docker.io"]registryprefix = "docker.io"location = "******.mirror.aliyuncs.com"
工作机制[ ]
1、无Daemon设计:与传统的Docker不同,Podman没有中央守护进程(Daemon)。这意味着Podman在运行时不需要一个长时间运行的背景服务来管理容器。这种设计简化了系统架构,减少了复杂性和潜在的安全风险。
2、直接与OCI运行时交互:Podman直接与OCI兼容的容器运行时(如runc)进行通信,以创建和管理容器。这消除了传统Docker模型中需要的额外抽象层,使得Podman能够以更高效的方式运行容器。
3、fork/exec模型:由于没有Daemon,Podman采用类似于Unix传统的fork/exec模型来启动容器。这意味着当Podman启动一个容器时,它会通过fork和exec系统调用直接创建容器进程。这使得容器成为Podman进程的直接子进程,而不是由Daemon管理的独立进程。
4、系统管理优势:由于容器是Podman进程的直接子进程,系统管理员可以更容易地追踪到是哪个用户或进程启动了特定的容器。此外,可以通过cgroups等机制对Podman进程施加资源限制,这些限制会自动应用于所有由Podman启动的容器。
5、与systemd的集成:Podman命令可以与systemd的SD_NOTIFY环境变量配合使用,以向systemd发送容器已准备好接受请求的信号。这允许systemd在容器准备就绪后自动启动其他服务或任务。
6、socket激活:Podman支持将systemd socket传递给容器,这使得容器可以直接使用这些socket进行通信,从而简化了服务间通信的设置。
与Docker的区别[ ]
- 架构设计:Podman不依赖于守护进程来管理容器,每个容器都是一个独立的进程。这种设计提高了安全性和隔离性,同时避免了潜在的安全风险。而Docker则需要一个长期运行的守护进程(dockerd)来管理容器。
- 权限管理:默认情况下,Docker需要root权限才能执行大部分操作,这可能引发安全性考虑。而Podman可以在无需root权限的情况下运行,它使用用户命名空间来隔离容器进程并限制其对主机资源的访问。
- 进程管理:Podman使用标准的Linux进程管理工具(如systemd)来管理容器进程。而Docker使用自己的进程管理方式,这意味着Podman可以与其他进程管理工具集成,而Docker不能。
- 兼容性和生态系统:虽然Docker拥有更广泛的生态系统和第三方工具支持,但Podman正在积极发展,并且与多种镜像仓库交互,包括Docker Hub和Quay.io等。