繼docker之后podman容器技術(shù)崛起
一、什么是podman與OCI
Podman是一個(gè)無守護(hù)進(jìn)程、開源的原生容器工具,旨在基于 Open Containers Initiative ( OCI )組織及規(guī)范,讓鏡像容器能夠輕松查找、運(yùn)行、構(gòu)建、共享和部署應(yīng)用程序。
提到podman就不能不說說OCI,這個(gè)組織有點(diǎn)意思。Docker容器技術(shù)出現(xiàn)并且迅速風(fēng)靡全球,為傳統(tǒng)的持續(xù)集成與持續(xù)發(fā)布領(lǐng)域帶來了革命性的變化。 這個(gè)時(shí)候各個(gè)大佬們(谷歌,Redhat、微軟、IBM、Intel、思科)就有點(diǎn)坐不住了,大家一起喝喝茶聊聊天就決定要成立一個(gè)新的組織:OCI。這個(gè)組織成立的目的很明顯,就是要防止容器技術(shù)被docker一家壟斷。docker方面雖然心不甘、情不愿,但是也沒有什么太好的辦法,也加入了該組織,畢竟胳膊擰不過大腿。另外還有以下幾個(gè)原因
- docker的容器概念和設(shè)計(jì)很新穎,但是底層實(shí)現(xiàn)并不是什么高精尖的技術(shù),很容易被模仿。
- docker方面希望被推廣使用,離不開大佬們的支持。
- docker本身還存在幾個(gè)硬傷,確實(shí)容易被超越和追趕。
有的朋友說podman是docker運(yùn)行、構(gòu)建、共享的輔助工具,這么說并不正確哈,podman目前的發(fā)展其本身就是一種獨(dú)立的容器技術(shù),其運(yùn)行時(shí)環(huán)境不依賴于docker。
二、docker有什么硬傷?
硬傷一:docker存在一個(gè)名為dockerd 的進(jìn)程,會(huì)占用比較多的CPU資源。同時(shí)一個(gè)dockerd守護(hù)進(jìn)程還可能導(dǎo)致單點(diǎn)故障的問題,該守護(hù)進(jìn)程掛掉了,容器也就無法正常提供服務(wù)。
硬傷二:docker守護(hù)進(jìn)程以root用戶運(yùn)行,這給操作系統(tǒng)的安全性和容器安全性帶來了非常大的挑戰(zhàn)。
然而Podman 不需要以 root 身份運(yùn)行的守護(hù)進(jìn)程,Podman 容器的運(yùn)行權(quán)限與啟動(dòng)它們的linux用戶相同,這解決了一個(gè)重大的安全問題。Podman 是一個(gè)無守護(hù)進(jìn)程的容器引擎,并且Podman 不需要守護(hù)進(jìn)程來啟動(dòng)和管理容器。這是兩個(gè)開源項(xiàng)目之間的一個(gè)最重要區(qū)別。這也是筆者看好podman未來會(huì)代替docker成為主流容器技術(shù)的核心原因。
三、從docker過度到podman非常easy
如果你使用過docker的CLI命令行,podman幾乎沒有任何的區(qū)別,只需要把docker換成podman即可,參數(shù)順序、含義都是一樣的。如:
docker pull nginx 換成 podman pull nginx 即可
如果你不想將docker命令換成podman,因?yàn)檫@樣需要修改以往的腳本。也可以通過映射命令alias docker=podman來實(shí)現(xiàn),這樣就可以無縫的將docker遷移到podman環(huán)境下使用。
另外容器鏡像格式方面在 Docker 和 Podman 之間也是完全兼容的。所以現(xiàn)有的鏡像,不論是docker官方鏡像,還是我們以往自己構(gòu)建的docker鏡像,都可以在podman環(huán)境下使用。
四、上手podman
4.1.安裝
下面我們就來簡(jiǎn)單的搞一搞,在CentOS操作系統(tǒng)可以直接使用yum命令安裝podman。事先說明的是我這個(gè)是一臺(tái)新的最小化安裝的CentOS7虛擬機(jī),并不包含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用戶,后續(xù)使用該用戶運(yùn)行容器。
adduser podman # root用戶新建podman用戶
4.2.CentOS7環(huán)境下需要做的特殊處理
出于上文中所說的安全性考慮,我們不使用root用戶操作鏡像及容器。所以需要做如下的一些配置。
如果你使用CentOS7,需要做如下的一些特殊處理。其他的操作系統(tǒng)可能需要不同的解決方案,這些解決方案基本大同小異。
如果你使用root用戶運(yùn)行鏡像容器,這些特殊處理就不需要做,直接就可以用
CentOS7默認(rèn)關(guān)閉用戶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宿主機(jī)操作系統(tǒng)新建用戶podman用戶環(huán)境下執(zhí)行nginx鏡像拉取
su - podman # 切換用戶為podman podman pull docker.io/library/nginx # 執(zhí)行拉取鏡像
如果你有如下的報(bào)錯(cuò)信息
ERRO[0000] cannot find mappings for user podman: No subuid ranges found for user "podman" in /etc/subuid
或者如下報(bào)錯(cuò)信息
Error processing tar file(exit status 1): there might not be enough IDs available in the namespace
請(qǐng)退出podman用戶切換回到root用戶(exit命令),執(zhí)行下列命令,podman為運(yùn)行容器的一個(gè)非root用戶
echo "podman:100000:65536" >> /etc/subuid echo "podman:100000:65536" >> /etc/subgid
這段配置的作用就是設(shè)置一個(gè)容器內(nèi)的操作系統(tǒng)與宿主機(jī)操作系統(tǒng)用戶的uid、gid之間的映射關(guān)系。如上所示 100000 - 165535(100000 + 65535) 在宿主機(jī)的id就映射到容器內(nèi)的 0-65535的用戶。配置完之后執(zhí)行如下命令
podman system migrate
官方解釋上面的命令可以讓配置生效,但是不知道什么原因,筆者執(zhí)行該命令配置并未生效,而是重啟了一下操作系統(tǒng)才生效。
五、在非root用戶下容器鏡像的使用
同樣的先把root切換到宿主機(jī)的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
運(yùn)行容器鏡像
podman run -p 8080:80 -d docker.io/library/nginx
其他的命令就不一一的列舉了,和docker命令運(yùn)行方式是一模一樣的,參數(shù)順序、名稱也是一摸一樣的。
總結(jié)
在單機(jī)環(huán)境下docker可以無縫的切換到podman環(huán)境,對(duì)docker-swarm或dcoker-compose支持需要驗(yàn)證,但筆者幾乎從來不用這兩個(gè)東西,所以暫時(shí)沒有驗(yàn)證的動(dòng)力。至于與k8s的兼容性,我想這是一定的,而且會(huì)越來越好,因?yàn)镺CI組織的首席大佬就是谷歌,不可能不支持自己的產(chǎn)品之間的兼容性。
如果你使用root用戶操作podman容器,與docker幾乎是一模一樣的,甚至連命令行都不需要改。但是我們用podman代替docker的主要原因我想就是使用非root用戶,來提升容器安全性。所以不同的操作系統(tǒng)及版本需要針對(duì)非root用戶的權(quán)限做一些額外配置,從而來滿足使用要求。
以上就是繼docker之后podman容器技術(shù)崛起的詳細(xì)內(nèi)容,更多關(guān)于podman容器技術(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker安裝MySQL及授權(quán)遠(yuǎn)程訪問的詳細(xì)教程
Docker是一種流行的容器化平臺(tái),可以簡(jiǎn)化應(yīng)用程序的部署和管理,下面這篇文章主要給大家介紹了關(guān)于Docker安裝MySQL及授權(quán)遠(yuǎn)程訪問的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
詳解使用docker 1.12 搭建多主機(jī)docker swarm集群
本篇文章主要介紹了使用docker 1.12 搭建多主機(jī)docker swarm集群,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
docker 可用鏡像服務(wù)地址的使用(親測(cè)可用)
Docker可用的鏡像服務(wù)地址通常指的是Docker鏡像倉(cāng)庫(kù)的地址,用于拉取和推送鏡像,本文就來介紹了docker 可用鏡像服務(wù)地址的使用,感興趣的可以了解一下2024-10-10
docker如何對(duì)已經(jīng)啟動(dòng)的容器添加目錄映射(掛載目錄)
當(dāng)我們創(chuàng)建容器之后,不可避免會(huì)遇到修改配置文件的操作,下面這篇文章主要給大家介紹了關(guān)于docker如何對(duì)已經(jīng)啟動(dòng)的容器添加目錄映射(掛載目錄)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
Docker安裝iTop快速搭建IT服務(wù)管理平臺(tái)
本文主要介紹了Docker安裝iTop快速搭建IT服務(wù)管理平臺(tái),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Docker部署ELK7.3.0日志收集服務(wù)最佳實(shí)踐
這篇文章主要介紹了Docker部署ELK7.3.0日志收集服務(wù)最佳實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
docker實(shí)現(xiàn)MySQL的主從復(fù)制
在學(xué)習(xí)項(xiàng)目的時(shí)候?qū)崿F(xiàn)讀寫分離用到了主從復(fù)制,但是一般要實(shí)現(xiàn)的話需要虛擬機(jī)或服務(wù)器非常麻煩,但是docker可以完美解決這一問題,本文主要介紹了docker實(shí)現(xiàn)MySQL的主從復(fù)制,感興趣的可以了解一下2024-01-01
docker 基于golang鏡像構(gòu)建 ssh服務(wù)的方法
這篇文章主要介紹了docker 基于golang鏡像構(gòu)建 ssh服務(wù)的方法,添加goland環(huán)境變量的方法及centos下sshd和goland環(huán)境的docker文件配置方法,需要的朋友可以參考下2021-07-07

