Podman解析

什么是 Linux 容器?

Linux?容器是由?Linux?內(nèi)核所提供的具有特定隔離功能的進(jìn)程,Linux?容器技術(shù)能夠讓你對(duì)應(yīng)用及其整個(gè)運(yùn)行時(shí)環(huán)境(包括全部所需文件)一起進(jìn)行打包或隔離。從而讓你在不同環(huán)境(如開(kāi)發(fā)、測(cè)試和生產(chǎn)等環(huán)境)之間輕松遷移應(yīng)用的同時(shí)女嘲,還可保留應(yīng)用的全部功能。

Linux?容器還有利于明確劃分職責(zé)范圍诞帐,減少開(kāi)發(fā)和運(yùn)維團(tuán)隊(duì)間的沖突欣尼。這樣,開(kāi)發(fā)人員可以全心投入應(yīng)用開(kāi)發(fā)停蕉,而運(yùn)維團(tuán)隊(duì)則可專(zhuān)注于基礎(chǔ)架構(gòu)維護(hù)愕鼓。由于?Linux?容器基于開(kāi)源技術(shù)構(gòu)建,還將便于你在未來(lái)輕松采用各類(lèi)更新慧起、更強(qiáng)的技術(shù)產(chǎn)品菇晃。包括?CRI-O、Kubernetes?和?Docker?在內(nèi)的容器技術(shù)蚓挤,可幫助你的團(tuán)隊(duì)有效簡(jiǎn)化磺送、加速和編排應(yīng)用的開(kāi)發(fā)與部署剩失。

什么是 Docker?

Docker?是一個(gè)開(kāi)源的應(yīng)用容器引擎册着,屬于?Linux?容器的一種封裝,Docker?提供簡(jiǎn)單易用的容器使用接口脾歧,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的容器中甲捏,然后發(fā)布到任何流行的?Linux?機(jī)器上。容器是完全使用沙箱機(jī)制鞭执,相互之間不會(huì)有任何接口司顿。

Docker 是目前最流行的?Linux?容器解決方案,即使?Docker?是目前管理?Linux?容器的一個(gè)非常方便的工具兄纺,但它也有兩個(gè)缺點(diǎn):

Docker?需要在你的系統(tǒng)上運(yùn)行一個(gè)守護(hù)進(jìn)程大溜。

Docker?是以?root?身份在你的系統(tǒng)上運(yùn)行該守護(hù)程序。

這些缺點(diǎn)的存在可能有一定的安全隱患估脆,為了解決這些問(wèn)題钦奋,下一代容器化工具?Podman?出現(xiàn)了 。

什么是 Podman 疙赠?

Podman?是一個(gè)開(kāi)源的容器運(yùn)行時(shí)項(xiàng)目付材,可在大多數(shù)?Linux?平臺(tái)上使用。Podman?提供與?Docker?非常相似的功能圃阳。正如前面提到的那樣厌衔,它不需要在你的系統(tǒng)上運(yùn)行任何守護(hù)進(jìn)程,并且它也可以在沒(méi)有?root?權(quán)限的情況下運(yùn)行捍岳。

Podman?可以管理和運(yùn)行任何符合?OCI(Open Container Initiative)規(guī)范的容器和容器鏡像富寿。Podman?提供了一個(gè)與?Docker?兼容的命令行前端來(lái)管理?Docker?鏡像。

Podman 官網(wǎng)地址:https://podman.io/

Podman 項(xiàng)目地址:https://github.com/containers/libpod

安裝 Podman

Podman?目前已支持大多數(shù)發(fā)行版本通過(guò)軟件包來(lái)進(jìn)行安裝锣夹,下面我們來(lái)舉幾個(gè)常用發(fā)行版本的例子页徐。

Fedora / CentOS

$ sudo yum -y install podman

Ubuntu

$ sudo apt-get update -qq$ sudo apt-get install -qq -y software-properties-common uidmap$ sudo add-apt-repository -y ppa:projectatomic/ppa$ sudo apt-get update -qq$ sudo apt-get -qq -y install podman

MacOS

$ brew cask install podman

RHEL 7

$ sudo subscription-manager repos --enable=rhel-7-server-extras-rpms$ sudo yum -y install podman

Arch Linux

$ sudo pacman -S podman

更多系統(tǒng)的安裝方法,可參考官方文檔:https://github.com/containers/libpod/blob/master/install.md

使用 Podman

使用?Podman?非常的簡(jiǎn)單晕城,Podman?的指令跟?Docker?大多數(shù)都是相同的泞坦。下面我們來(lái)看幾個(gè)常用的例子:

運(yùn)行一個(gè)容器

$ podman run -dt -p 8080:8080/tcp? \-e HTTPD_VAR_RUN=/var/run/httpd? \-e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d \-e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf \-e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/ \registry.fedoraproject.org/f27/httpd /usr/bin/run-httpd

列出運(yùn)行的容器

$ podman ps -a

分析一個(gè)運(yùn)行的容器

$ podman inspect -l | grep IPAddress\":"SecondaryIPAddresses": null,"IPAddress": "",

查看一個(gè)運(yùn)行中容器的日志

$ sudo podman logs --latest10.88.0.1 - - [07/Feb/2018:15:22:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"10.88.0.1 - - [07/Feb/2018:15:22:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"10.88.0.1 - - [07/Feb/2018:15:22:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"10.88.0.1 - - [07/Feb/2018:15:22:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"10.88.0.1 - - [07/Feb/2018:15:22:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.55.1" "-"

查看一個(gè)運(yùn)行容器中的進(jìn)程資源使用情況

$ sudo podman top <container_id>? UID? PID? PPID? C STIME TTY? ? ? ? ? TIME CMD? ? 0 31873 31863? 0 09:21 ?? ? ? ? 00:00:00 nginx: master process nginx -g daemon off;? 101 31889 31873? 0 09:21 ?? ? ? ? 00:00:00 nginx: worker process

停止一個(gè)運(yùn)行中的容器

$ sudo podman stop --latest

刪除一個(gè)容器

$ sudo podman rm --latest

以上這些特性基本上都和?Docker?一樣,Podman?除了兼容這些特性外砖顷,還支持了一些新的特性贰锁。

給容器設(shè)置一個(gè)檢查點(diǎn)

$ sudo podman container checkpoint <container_id>

需要 CRIU 3.11 以上版本支持,CRIU 項(xiàng)目地址:https://criu.org/

根據(jù)檢查點(diǎn)位置恢復(fù)容器

$ sudo podman container restore <container_id>

遷移容器

Podman 支持將容器從一臺(tái)機(jī)器遷移到另一臺(tái)機(jī)器滤蝠。

首先豌熄,在源機(jī)器上對(duì)容器設(shè)置檢查點(diǎn),并將容器打包到指定位置物咳。

$ sudo podman container checkpoint <container_id> -e /tmp/checkpoint.tar.gz$ scp /tmp/checkpoint.tar.gz <destination_system>:/tmp

其次锣险,在目標(biāo)機(jī)器上使用源機(jī)器上傳輸過(guò)來(lái)的打包文件對(duì)容器進(jìn)行恢復(fù)。

$ sudo podman container restore -i /tmp/checkpoint.tar.gz

配置別名

如果習(xí)慣了使用?Docker?命令,可以直接給?Podman?配置一個(gè)別名來(lái)實(shí)現(xiàn)無(wú)縫轉(zhuǎn)移芯肤。你只需要在?.bashrc?下加入以下行內(nèi)容即可:

$ echo "alias docker=podman" >> .bashrc$ source .bashrc

Podman 如何實(shí)現(xiàn)開(kāi)機(jī)重啟容器

由于?Podman?不再使用守護(hù)進(jìn)程管理服務(wù)巷折,所以不能通過(guò)守護(hù)進(jìn)程去實(shí)現(xiàn)自動(dòng)重啟容器的功能。那如果要實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)重啟容器崖咨,又該如何實(shí)現(xiàn)呢锻拘?

其實(shí)方法很簡(jiǎn)單,現(xiàn)在大多數(shù)系統(tǒng)都已經(jīng)采用?Systemd?作為守護(hù)進(jìn)程管理工具击蹲。這里我們就可以使用?Systemd?來(lái)實(shí)現(xiàn)?Podman?開(kāi)機(jī)重啟容器署拟,這里我們以啟動(dòng)一個(gè)?Nginx容器為例子。

首先歌豺,我們先運(yùn)行一個(gè)?Nginx?容器推穷。

$ sudo podman run -t -d -p 80:80 --name nginx nginx

然后,在建立一個(gè)?Systemd?服務(wù)配置文件类咧。

$ vim /etc/systemd/system/nginx_container.service[Unit]Description=Podman Nginx ServiceAfter=network.targetAfter=network-online.target[Service]Type=simpleExecStart=/usr/bin/podman start -a nginxExecStop=/usr/bin/podman stop -t 10 nginxRestart=always[Install]WantedBy=multi-user.target

接下來(lái)馒铃,啟用這個(gè)?Systemd?服務(wù)。

$ sudo systemctl daemon-reload$ sudo systemctl enable nginx_container.service$ sudo systemctl start nginx_container.service

服務(wù)啟用成功后轮听,我們可以通過(guò)?systemctl status?命令查看到這個(gè)服務(wù)的運(yùn)行狀況骗露。

$ sudo systemctl status nginx_container.service● nginx_container.service - Podman Nginx Service? Loaded: loaded (/etc/systemd/system/nginx_container.service; enabled; vendor preset: disabled)? Active: active (running) since Sat 2019-08-20 20:59:26 UTC; 1min 41s ago Main PID: 845 (podman)? ? Tasks: 16 (limit: 4915)? Memory: 37.6M? CGroup: /system.slice/nginx_container.service? ? ? ? ? └─845 /usr/bin/podman start -a nginxAug 20 20:59:26 Ubuntu-dev.novalocal systemd[1]: Started Podman Nginx Service.

之后每次系統(tǒng)重啟后?Systemd?都會(huì)自動(dòng)啟動(dòng)這個(gè)服務(wù)所對(duì)應(yīng)的容器。

其它相關(guān)工具

Podman?只是?OCI?容器生態(tài)系統(tǒng)計(jì)劃中的一部分血巍,主要專(zhuān)注于幫助用戶維護(hù)和修改符合?OCI?規(guī)范的容器鏡像萧锉。其它的組件還有?Buildah、Skopeo?等述寡。

Buildah

雖然?Podman?也可以支持用戶構(gòu)建?Docker?鏡像柿隙,但是構(gòu)建速度比較慢。并且默認(rèn)情況下使用?VFS?存儲(chǔ)驅(qū)動(dòng)程序會(huì)消耗大量磁盤(pán)空間鲫凶。

Buildah?是一個(gè)專(zhuān)注于構(gòu)建?OCI?容器鏡像的工具禀崖,Buildah?構(gòu)建速度非常快并使用覆蓋存儲(chǔ)驅(qū)動(dòng)程序螟炫,可以節(jié)約大量的空間波附。

Buildah?基于?fork-exec?模型,不以守護(hù)進(jìn)程運(yùn)行昼钻。Buildah?支持?Dockerfile?中的所有命令掸屡。你可以直接使用?Dockerfiles?來(lái)構(gòu)建鏡像,并且不需要任何?root?權(quán)限然评。Buildah?也支持用自己的語(yǔ)法文件構(gòu)建鏡像仅财,可以允許將其他腳本語(yǔ)言集成到構(gòu)建過(guò)程中。

下面是一個(gè)使用?Buidah?自有語(yǔ)法構(gòu)建的例子碗淌。

Buildah?和?Podman?之間的一個(gè)主要區(qū)別是:Podman?用于運(yùn)行和管理容器盏求, 允許我們使用熟悉的容器?CLI?命令在生產(chǎn)環(huán)境中管理和維護(hù)這些鏡像和容器抖锥,而?Buildah?主用于構(gòu)建容器。

項(xiàng)目地址:https://github.com/containers/buildah

Skopeo

Skopeo?是一個(gè)鏡像管理工具碎罚,允許我們通過(guò)?Push磅废、Pull和復(fù)制鏡像來(lái)處理?Docker和符合?OCI?規(guī)范的鏡像。

項(xiàng)目地址:https://github.com/containers/skopeo

延伸閱讀

什么是 OCI荆烈?

OCI?(Open Container Initiative)还蹲,是一個(gè)輕量級(jí),開(kāi)放的治理結(jié)構(gòu)(項(xiàng)目)耙考。在?Linux?基金會(huì)的支持下成立,致力于圍繞容器格式和運(yùn)行時(shí)創(chuàng)建開(kāi)放的行業(yè)標(biāo)準(zhǔn)潭兽。

OCI?項(xiàng)目由?Docker倦始、CoreOS?和容器行業(yè)中的其它領(lǐng)導(dǎo)者在 2015 年 6 月的時(shí)候啟動(dòng),OCI?的技術(shù)委員會(huì)成員包括?Red Hat山卦、Microsoft鞋邑、Docker、Cruise账蓉、IBM枚碗、Google、Red Hat?和?SUSE?等铸本。

什么是 CRI肮雨?

CRI(Container Runtime Interface)是?Kubernetes?v1.5 引入的容器運(yùn)行時(shí)接口,它將?Kubelet?與容器運(yùn)行時(shí)解耦箱玷,將原來(lái)完全面向?Pod?級(jí)別的內(nèi)部接口拆分成面向?Sandbox?和?Container?的?gRPC?接口怨规,并將鏡像管理和容器管理分離到不同的服務(wù)。

什么是 CNI锡足?

CNI(Container Network Interface)是?CNCF?旗下的一個(gè)項(xiàng)目波丰,是?Google?和?CoreOS?主導(dǎo)制定的容器網(wǎng)絡(luò)標(biāo)準(zhǔn)。CNI?包含方法規(guī)范舶得、參數(shù)規(guī)范等掰烟,是?Linux?容器網(wǎng)絡(luò)配置的一組標(biāo)準(zhǔn)和庫(kù),用戶可以根據(jù)這些標(biāo)準(zhǔn)和庫(kù)來(lái)開(kāi)發(fā)自己的容器網(wǎng)絡(luò)插件沐批。CNI?已經(jīng)被?Kubernetes纫骑、Mesos、Cloud Foundry珠插、RKT?等使用惧磺,同時(shí)?Calico、Weave等項(xiàng)目都在為 CNI 提供插件捻撑。

總結(jié)

本文介紹三個(gè)了符合?CRI?標(biāo)準(zhǔn)的容器工具?Podman磨隘、?Buildah?和?Skopeo缤底。這三個(gè)工具都是基于?*nix?傳統(tǒng)的?fork-exec?模型,解決了由于?Docker?守護(hù)程序?qū)е碌膯?dòng)和安全問(wèn)題番捂,提高了容器的性能和安全个唧。

參考文檔

https://igene.tw/podman-intro

https://zhuanlan.zhihu.com/p/77373246

https://zhuanlan.zhihu.com/p/47706426

https://xuanwo.io/2019/08/06/oci-intro/

http://www.reibang.com/p/62e71584d1cb

https://kubernetes.feisky.xyz/cha-jian-kuo-zhan/cri

https://blog.csdn.net/networken/article/details/98684527

https://www.zcfy.cc/article/demystifying-the-open-container-initiative-oci-specifications

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市设预,隨后出現(xiàn)的幾起案子徙歼,更是在濱河造成了極大的恐慌,老刑警劉巖鳖枕,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魄梯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宾符,警方通過(guò)查閱死者的電腦和手機(jī)酿秸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)魏烫,“玉大人辣苏,你說(shuō)我怎么就攤上這事『灏” “怎么了稀蟋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)呐赡。 經(jīng)常有香客問(wèn)我退客,道長(zhǎng),這世上最難降的妖魔是什么链嘀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任井辜,我火速辦了婚禮,結(jié)果婚禮上管闷,老公的妹妹穿的比我還像新娘粥脚。我一直安慰自己,他們只是感情好包个,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布刷允。 她就那樣靜靜地躺著,像睡著了一般碧囊。 火紅的嫁衣襯著肌膚如雪树灶。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天糯而,我揣著相機(jī)與錄音天通,去河邊找鬼。 笑死熄驼,一個(gè)胖子當(dāng)著我的面吹牛像寒,可吹牛的內(nèi)容都是我干的烘豹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诺祸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼携悯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起筷笨,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤憔鬼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胃夏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體轴或,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年仰禀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侮叮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悼瘾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出审胸,到底是詐尸還是另有隱情亥宿,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布砂沛,位于F島的核電站烫扼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碍庵。R本人自食惡果不足惜映企,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望静浴。 院中可真熱鬧堰氓,春花似錦、人聲如沸苹享。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)得问。三九已至囤攀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宫纬,已是汗流浹背焚挠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漓骚,地道東北人蝌衔。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓榛泛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親胚委。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挟鸠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容