docker的平替--podman
前言
我们都知道,docker这个东西,是CaaS(Container as a Service,容器即服务)的通常解法。我们使用docker来管理容器的生命周期,比如镜像的生成、容器的管理和定制(Dockerfile)、仓库的上传和下载等。
但是docker存在很多不方便使用的地方,所以我们可以使用podman来做平替。
podman介绍
Podman(Pod Manager), 是由RedHat公司推出的容器管理工具。它可以做为docker的平替,使用上也非常相似。但其实二者之间也存在非常显著的差别,相比起来podman会比docker更加完善一些。
podman与docker的差异
1. 底层CRI
docker:使用的是docker-shim, 这个CRI(Container Runtime Interface, 容器运行接口)并不是docker实现的,而是kubernetes帮它实现的。由于早期没有docker平替工具,故kubernetes开发了一个api调用docker管理下的容器资源。后来由于有了其他的平替工具,所以kubernetes在1.20版本正式停止维护docker-shim这个CRI,使用其余CRI(可以由其他容器管理工具实现,例如CRI-O等)。这也就是当时讲的“kubernetes停止对docker维护”的意思。
podman:使用的是CRI-O,该接口来自于开放容器计划(OCI), 可以让kubelet来调用下层的容器资源,而不需要人为管理,如图所示。
其余比较知名的CRI还有containerd、lxd等。

2. 守护进程
docker:后台有docker-daemon,需要root权限
podman:没有daemon,不需要root权限
3. 安全性
docker:如果你在容器外有一些文件无法访问,在启动镜像映射文件的时候,你将此文件映射到容器中时,使用docker exec进入容器后,就可以编辑了。
podman:即使你将容器外无法访问的文件映射到容器中时,也无法编辑此文件。
因此,podman比docker安全性更好。
podman安装
1. ubuntu
1) ubuntu22.04,可直接apt安装
apt install -y podman
2)ubuntu18.04和20.04,需要添加源
. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L "https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key" | sudo apt-key add -
apt install -y podman
2. centos
1)cent8可以直接yum安装docker,默认装的是podman
yum install -y docker
2)cent7,可以安装epel-release, 然后yum安装podman
yum install -y epel-release
yum install -y podman
如果非root用户来使用podman,可能会遇到namespace没权限的问题:
user namespaces are not enabled in /proc/sys/user/max_user_namespaces
此功能是Centos3.8添加进去的,默认关闭,需要打开。
[root@node2 ~]# cat /proc/sys/user/max_user_namespaces
0
# 临时打开
[root@node2 ~]# echo 200 > /proc/sys/user/max_user_namespaces
# kernel 设置
[root@node2 ~]# grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
# 写入配置文件
[root@node2 ~]# echo "user.max_user_namespaces=200" >> /etc/sysctl.conf
# 生效
[root@node2 ~]# sysctl -p
# 关闭namespace
[root@node2 ~]# grubby --remove-args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
别名
当然,如果你敲docker上瘾,也可以使用alias修改别名。
echo "alias docker=podman" >> ~/.bashrc
source ~/.bashrc
仓库源
如果podman使用默认的仓库源,可能会pull不下来,所以需要修改仓库源。
由于podman不需要root权限,任何人都可以使用,所以每个人可以设置自己的源,就像环境变量一样,每人一个。
全局配置: /etc/containers/registries.conf
个人配置: ~/.config/containers/registries.conf
配置方法:
unqualified-search-registries = ["docker.io", "registry.access.redhat.com"]
[[registry]]
prefix = "docker.io"
location = "docker.io"
[[registry.mirror]]
location = "docker.mirrors.ustc.edu.cn"
[[registry.mirror]]
location = "registry.docker-cn.com"
使用
podman pull的时候,比docker多了一个镜像选择的过程
young@home:/opt$ podman pull nginx
docker.io/library/nginx:latest
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 589b7251471a done
Copying blob 186b1aaa4aa6 done
Copying blob a0bcbecc962e done
Copying blob b4df32aa5a72 done
Copying blob a9edb18cadd1 done
Copying blob a2abf6c4d29d done
Copying config 605c77e624 done
Writing manifest to image destination
Storing signatures
605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
young@home:/opt$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/nginx latest 605c77e624dd 6 months ago 146 MB
young@home:/opt$ podman run -d -p 8000:80 docker.io/library/nginx
6e898573edec454699c760b9d5f23091cb22143563e038e8d2cdf0d5277c03dc
young@home:/opt$
young@home:/opt$ docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e898573edec docker.io/library/nginx:latest nginx -g daemon o... 4 seconds ago Up 5 seconds ago 0.0.0.0:8000->80/tcp hopeful_brattain
然后访问ip:8000, 发现run起来了。

docker的平替--podman的更多相关文章
- k8s+crio+podman搭建集群
前言 在传统的k8s集群中,我们都是使用docker engine做为底层的容器管理软件的,而docker engine因为不是k8s亲生的解决方案,所以实际使用中会有更多的分层.之前我们也讲过,k8 ...
- Docker Vs Podman
翻译自 Chetansingh 2020年4月24日的博文<Docker Vs Podman> [1] 容器化的一场全新革命是从 Docker 开始的,Docker 的守护进程管理着所有的 ...
- Podman and Buildah for Docker users
转自:https://developers.redhat.com/blog/2019/02/21/podman-and-buildah-for-docker-users/ I was asked re ...
- podman初试-和docker对比
podman初试-和docker对比 1,什么是docker? Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单易用的容器使用接口,让开发者可以打包他们 ...
- Podman 使用指南
原文链接:Podman 使用指南 Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod.Podman 的使用体验和 Docker 类似,不同的是 Podman 没 ...
- 下一代容器架构已出,Docker何去何处?看看这里的6问6答!!
我猜很多人一看这个标题已经感觉很懵逼了,什么?下一代容器都出来了,我还没学Docker呢!!! 咳咳~~在这里我给大家做一个保证,下一代容器目前也只是各个公司在测试阶段,Github上面也有很多Iss ...
- 向Docker告别的时候到了
在容器的远古时期(大约4年前),Docker是容器游戏中仅有的参与者.但是现在情况不一样了,Docker不再是唯一的一个了,只是另一个容器引擎而已.Docker允许我们构建,运行,拉取,上传,查看容器 ...
- 求求你了,用Docker吧
这是一个开始使用 Docker 的 Tutorial 大无语事件发生!大数据课实验课要用到Hadoop,实验指导是在一个Ubuntu虚机上通过安装包安装Hadoop并运行一个词频统计程序,整个实验就是 ...
- 十、RHEL Podman命令
Podman介绍 Podman 是一个开源的容器运行时项目,可在大多数 Linux 平台上使用.Podman 提供与 Docker 非常相似的功能.正如前面提到的那样,它不需要在你的系统上运行任何守护 ...
随机推荐
- python学习-Day33
目录 今日内容详细 socket socket套接字简介 socket模块 服务端 客户端 通信循环 服务端 客户端 链接循环 半连接池 概念 产生半连接的两种情况 黏包问题 多次发送被并为一次 TC ...
- Bugku练习题---MISC---蜜雪冰城~
Bugku练习题---MISC---蜜雪冰城~ flag:flag{1251_521_m1xueb1n9chen9ti@nm1mi} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现有好几个文件 ...
- 『现学现忘』Git基础 — 19、Git中忽略文件
目录 1.忽略文件说明 2.忽略文件的原则 3..gitignore忽略规则 1.忽略文件说明 有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们到本地版本库,通常都是些自动生成的文件. ...
- 引入『客户端缓存』,Redis6算是把缓存玩明白了…
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是没更新就是在家忙着带娃的Hydra. 在前面介绍两级缓存的文章中,我们总共给出了4种实现方案,在项目中整合了本地缓存Caffe ...
- QMetaObject::connectSlotsByName: No matching signal for XXX 原理探究
问题引出: 在尝试实现<Qt5.9 c++开发指南>混合UI编程章节时,用纯代码形式实现了个小按钮,然后加了个对应的槽函数,运行时就提示了这个信息. 原因探究: 首先查阅官方手册中的说明: ...
- 劳动节快乐!手写个核心价值观编码工具 - Python实现
前言 今天是五一劳动节,祝各位无产阶级劳动者节日快乐! 然后来整活分享一些有趣的东西~ 这个小工具是我大学时做着玩的,对于各位接班人来说,12个词的核心价值观这东西,大家都非常熟悉了,这工具可以实现将 ...
- 《Mybatis 手撸专栏》第8章:把反射用到出神入化
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么,读不懂框架源码? 我们都知道作为一个程序员,如果想学习到更深层次的技术,就需 ...
- 48. Rotate Image - LeetCode
Question 48. Rotate Image Solution 把这个二维数组(矩阵)看成一个一个环,循环每个环,循环每条边,每个边上的点进行旋转 public void rotate(int[ ...
- vue2 sass主题一键修改功能
1.先创建一个 _theme.scss文件 作为各类主题颜色的整理 $themes: ( light: ( //字体 font_color1: #414141, font_color2: white, ...
- 异常——JavaSE基础
异常 异常的分类 检查性异常 运行时异常:可能被程序员避免的异常,运行时异常可以在编译时被忽略 错误ERROR:错误不是异常 在Java中把异常当作对象来处理,并且定义了一个基类java.lang.T ...