继docker之后podman容器技术崛起

一、什么是podman与OCI

Podman是一个无守护进程、开源的原生容器工具,旨在基于 Open Containers Initiative ( OCI )组织及规范,让镜像容器能够轻松查找、运行、构建、共享和部署应用程序。

提到podman就不能不说说OCI,这个组织有点意思。Docker容器技术出现并且迅速风靡全球,为传统的持续集成与持续发布领域带来了革命性的变化。 这个时候各个大佬们(谷歌,Redhat、微软、IBM、Intel、思科)就有点坐不住了,大家一起喝喝茶聊聊天就决定要成立一个新的组织:OCI。这个组织成立的目的很明显,就是要防止容器技术被docker一家垄断。docker方面虽然心不甘、情不愿,但是也没有什么太好的办法,也加入了该组织,毕竟胳膊拧不过大腿。另外还有以下几个原因

  • docker的容器概念和设计很新颖,但是底层实现并不是什么高精尖的技术,很容易被模仿。
  • docker方面希望被推广使用,离不开大佬们的支持。
  • docker本身还存在几个硬伤,确实容易被超越和追赶。

有的朋友说podman是docker运行、构建、共享的辅助工具,这么说并不正确哈,podman目前的发展其本身就是一种独立的容器技术,其运行时环境不依赖于docker。

二、docker有什么硬伤?

硬伤一:docker存在一个名为dockerd 的进程,会占用比较多的CPU资源。同时一个dockerd守护进程还可能导致单点故障的问题,该守护进程挂掉了,容器也就无法正常提供服务。

硬伤二:docker守护进程以root用户运行,这给操作系统的安全性和容器安全性带来了非常大的挑战。

然而Podman 不需要以 root 身份运行的守护进程,Podman 容器的运行权限与启动它们的linux用户相同,这解决了一个重大的安全问题。Podman 是一个无守护进程的容器引擎,并且Podman 不需要守护进程来启动和管理容器。这是两个开源项目之间的一个最重要区别。这也是笔者看好podman未来会代替docker成为主流容器技术的核心原因。

三、从docker过度到podman非常easy

如果你使用过docker的CLI命令行,podman几乎没有任何的区别,只需要把docker换成podman即可,参数顺序、含义都是一样的。如:

docker pull nginx
换成
podman pull nginx
即可

如果你不想将docker命令换成podman,因为这样需要修改以往的脚本。也可以通过映射命令alias docker=podman来实现,这样就可以无缝的将docker迁移到podman环境下使用。

另外容器镜像格式方面在 Docker 和 Podman 之间也是完全兼容的。所以现有的镜像,不论是docker官方镜像,还是我们以往自己构建的docker镜像,都可以在podman环境下使用。

四、上手podman

4.1.安装

下面我们就来简单的搞一搞,在CentOS操作系统可以直接使用yum命令安装podman。事先说明的是我这个是一台新的最小化安装的CentOS7虚拟机,并不包含docker,也不曾安装。

yum -y install podman    # root用户安装

查看版本

# podman version
Version:            1.6.4
RemoteAPI Version:  1
Go Version:         go1.12.12
OS/Arch:            linux/amd64

新建podman用户,后续使用该用户运行容器。

adduser podman   # root用户新建podman用户
adduser podman   # root用户新建podman用户

4.2.CentOS7环境下需要做的特殊处理

出于上文中所说的安全性考虑,我们不使用root用户操作镜像及容器。所以需要做如下的一些配置。

如果你使用CentOS7,需要做如下的一些特殊处理。其他的操作系统可能需要不同的解决方案,这些解决方案基本大同小异。

如果你使用root用户运行镜像容器,这些特殊处理就不需要做,直接就可以用

CentOS7默认关闭用户namespace,将它打开

echo 10000 > /proc/sys/user/max_user_namespaces;
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)";
echo "user.max_user_namespaces=10000" >> /etc/sysctl.conf;

4.3. 配置非root用户id及组id范围

尝试在linux宿主机操作系统新建用户podman用户环境下执行nginx镜像拉取

su - podman                               # 切换用户为podman
podman pull docker.io/library/nginx   # 执行拉取镜像

如果你有如下的报错信息

su - podman                               # 切换用户为podman
podman pull docker.io/library/nginx   # 执行拉取镜像

或者如下报错信息

 Error processing tar file(exit status 1): there might not be enough IDs available in the namespace

请退出podman用户切换回到root用户(exit命令),执行下列命令,podman为运行容器的一个非root用户

echo "podman:100000:65536" >> /etc/subuid
echo "podman:100000:65536" >> /etc/subgid

这段配置的作用就是设置一个容器内的操作系统与宿主机操作系统用户的uid、gid之间的映射关系。如上所示 100000 - 165535(100000 + 65535) 在宿主机的id就映射到容器内的 0-65535的用户。配置完之后执行如下命令

podman system migrate

官方解释上面的命令可以让配置生效,但是不知道什么原因,笔者执行该命令配置并未生效,而是重启了一下操作系统才生效。

五、在非root用户下容器镜像的使用

同样的先把root切换到宿主机的podman用户

su - podman

拉取镜像命令

$ podman pull docker.io/library/nginx

Trying to pull docker.io/library/nginx...
Getting image source signatures
Copying blob 1ae07ab881bd done
Copying blob 091c283c6a66 done
Copying blob 78091884b7be done
Copying blob 5eb5b503b376 done
Copying blob b559bad762be done
Copying blob 55de5851019b done
Copying config c316d5a335 done
Writing manifest to image destination
Storing signatures
c316d5a335a5cf324b0dc83b3da82d7608724769f6454f6d9a621f3ec2534a5a

查看镜像列表(在x用户下拉取的镜像,在y用户下是查看不到的)

$ podman images
REPOSITORY                TAG      IMAGE ID       CREATED       SIZE
docker.io/library/nginx   latest   c316d5a335a5   2 weeks ago   146 MB

运行容器镜像

podman run -p 8080:80 -d docker.io/library/nginx

其他的命令就不一一的列举了,和docker命令运行方式是一模一样的,参数顺序、名称也是一摸一样的。

总结

在单机环境下docker可以无缝的切换到podman环境,对docker-swarm或dcoker-compose支持需要验证,但笔者几乎从来不用这两个东西,所以暂时没有验证的动力。至于与k8s的兼容性,我想这是一定的,而且会越来越好,因为OCI组织的首席大佬就是谷歌,不可能不支持自己的产品之间的兼容性。

如果你使用root用户操作podman容器,与docker几乎是一模一样的,甚至连命令行都不需要改。但是我们用podman代替docker的主要原因我想就是使用非root用户,来提升容器安全性。所以不同的操作系统及版本需要针对非root用户的权限做一些额外配置,从而来满足使用要求。

以上就是继docker之后podman容器技术崛起的详细内容,更多关于podman容器技术的资料请关注我们其它相关文章!

(0)

相关推荐

  • 被弃用的 Docker 会被 Podman 取代吗

    Kubernetes 团队近日宣布将在最新版本中弃用 Docker 支持的功能,后续版本会陆续删除这些功能. 近日,Kubernetes 团队发布了最新的 1.20 版本,新版本更新了许多内容: 存储卷快照功能趋于稳定:Kubectl Debug 进入 Beta:Beta:API 优先级和公平性:IPV4/IPV6 Alpha 功能更新:GA:限制进程 PID:Dockershim 弃用:Exec 探针超时处理等等(详情可查看:https://kubernetes.io/blog/2020/12

  • Docker镜像发布到Docker Hub的实现方法

    目录 一.Docker 官网注册一个账号,新建仓库 二.制作镜像,保存修改后的容器镜像为例 三.镜像上传 四.镜像下载 在使用docker过程中,往往会用到镜像仓库,方便管理的同时也方便在其他环境下快速下载镜像,本文讲解如何将镜像传入docker官方仓库.操作系统以CentOS 8 为例讲解如何将自己的镜像上传到docker hub. 一.Docker 官网注册一个账号,新建仓库 二.制作镜像,保存修改后的容器镜像为例 # 本次不以docker build 为例 # docker ps -a E

  • podman容器工具的具体使用

    目录 podman简介 Podman和Docker的主要区别是什么? podman安装使用 配置镜像加速 相关工具 podman简介 Podman是一个开源项目,可在大多数Linux平台上使用并开源在GitHub上.Podman是一个无守护进程的容器引擎,用于在Linux系统上开发,管理和运行Open Container Initiative(OCI)容器和容器镜像.Podman提供了一个与Docker兼容的命令行前端,它可以简单地作为Docker cli,简单地说你可以直接添加别名:alias

  • Podman开机自启容器实现过程及与Docker对比

    目录 1.podman介绍 2.与docker相比的优势 3.兼容性 4.后台服务单元文件的优先级 5.podman基本操作 安装 版本 仓库 命令帮助 镜像加速器 拉取镜像 6.运行一个web容器 后台启动一个web容器,并访问容器内容 暂停与删除容器 7.web容器设置开机自启 后台运行一个web容器 创建.service单元文件 查看生成的单元文件 删除刚才的容器 设置开机自启 1.podman介绍 podman之前是CRI-O项目的一部分,后被分离成独立的项目libpod,libpod是

  • 继docker之后podman容器技术崛起

    一.什么是podman与OCI Podman是一个无守护进程.开源的原生容器工具,旨在基于 Open Containers Initiative ( OCI )组织及规范,让镜像容器能够轻松查找.运行.构建.共享和部署应用程序. 提到podman就不能不说说OCI,这个组织有点意思.Docker容器技术出现并且迅速风靡全球,为传统的持续集成与持续发布领域带来了革命性的变化. 这个时候各个大佬们(谷歌,Redhat.微软.IBM.Intel.思科)就有点坐不住了,大家一起喝喝茶聊聊天就决定要成立一

  • Docker 镜像、容器、仓库的概念及应用详解

    Docker 镜像.容器.仓库的概念 Docker镜像 Docker镜像(Image)类似于虚拟机的镜像,可以将他理解为一个面向Docker引擎的只读模板,包含了文件系统. 例如:一个镜像可以完全包含了Ubuntu操作系统环境,可以把它称作一个Ubuntu镜像.镜像也可以安装了Apache应用程序(或其他软件),可以把它称为一个Apache镜像. 镜像是创建Docker容器的基础,通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像.用户可以从网上下载一个已经

  • Docker镜像与容器的导入导出操作实践

    目录 一.前言 二.docker镜像的导入和导出 1.docker镜像的导出 2.docker镜像的导入 三.docker容器的导入和导出 1.docker容器的导出 2.docker容器的导入 四.总结 一.前言 随着容器技术的发展,现在很多的应用程序系统都会选择使用docker容器进行部署,但是有时候使用docker容器进行部署的时候会遇到问题,比如说我们的应用程序里面需要依赖其他第三方的镜像,如果这时候服务器是在内网不能连接外网的情况下,那么就无法部署了.基于这种情况,docker官方支持

  • IDEA远程管理docker镜像及容器服务的实现

    目录 一.开启docker远程访问服务 二.IDEA安装Dokcer插件 使用命令行的方式管理服务器镜像及容器是运维人员最常用的方式,但是有的时候我们不得不远程操作docker或者是面向对docker并不熟悉的技术人员提供能力(配置管理员.测试人员),这种情况下图形界面就有必要了.提供图形界面的方式来操作docker也的确是比使用命令行的方式更直接.更简单.所以很多的厂商基于docker RESTful API向用户提供了用于docker容器镜像管理的用户图形界面,Portainer.Docke

  • Docker 中的容器完全解析

    Docker 中的容器完全解析 Docker中的容器可以看成是镜像的一个运行环境,它带有额外的可写文件层. 一.创建容器: 1.新建容器: docker create -it --name [CONTAINERNAME] [NAME]:[TAG] 比如: docker create -it --name container ubuntu:add /bin/bash 此为根据镜像的名称创建容器,容器的名称为container 2.查看容器详情列表: docker ps -a 可以查看到容器的ID,

  • Docker 镜像和容器的区别详解

    最近学习Docker,被Docker 的镜像和容器搞的晕头转向,索性上网查找相关资料并整理下彻底的理解这块内容,有需要的小伙伴可以看下,少走点弯路. Docker的镜像和容器的区别 一.Docker镜像 要理解Docker镜像和Docker容器之间的区别,确实不容易. 假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的.这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态. 一个Docker镜像可以构建于另一个Docker镜像之上,这种层

  • Docker 手动配置容器网络实例详解

    Docker 手动配置容器网络 docker容器的网络是net命名空间与虚拟设备的结合,容器在启动时会创建一对虚拟接口veth pair,这一对接口分别放到本地和容器中,在本地的veth会被分配类似vethxxxx的名称并被桥接到指定网桥的上(默认为docker0),可以通过brctl show命令查看网桥上挂载的接口,在容器中的veth会从网桥获取一个未使用地址,该veth的名称会被更改为eth0并配置默认路由到vethxxxx,docker允许在启动容器的时候通过--net参数指定不同的网络

  • 深入了解docker(docker镜像、容器、仓库的基本概念)

    本文重点给大家介绍docker镜像.容器.仓库的基本概念的知识. Docker概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 httpd或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. Dock

  • docker实践之容器的导入与导出

    前言 Docker的流行与它对容器的易分享和易移植密不可分.用户不仅可以把容器提交到公共服务器上,还可以将容器导出到本地文件系统中.同样,我们也可以将导出的容器重新导入到Docker环境中去. 如果要导出本地某个容器,可以使用 Docker export 命令,可以使用 docker import 从容器快照文件中再导入为镜像 1.首先查找正在运行的容器ID 2.然后使用 docker export 命令将容器导出(这里以GWAS_HF容器为例) 3.查看导出结果,scp命令传输到另一台服务器

随机推荐