什么是 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