溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

podman初試-和docker對(duì)比

發(fā)布時(shí)間:2020-07-26 16:14:31 來(lái)源:網(wǎng)絡(luò) 閱讀:4223 作者:鐵血軍人 欄目:系統(tǒng)運(yùn)維

podman初試-和docker對(duì)比

1,什么是docker?

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

2,什么是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 鏡像。

  1. Podman 官網(wǎng)地址:https://podman.io/
  2. Podman 項(xiàng)目地址:https://github.com/containers/libpod

3,Podman 和docker不同之處?

  1. docker 需要在我們的系統(tǒng)上運(yùn)行一個(gè)守護(hù)進(jìn)程(docker daemon),而podman 不需要
  2. 啟動(dòng)容器的方式不同:
    docker cli 命令通過(guò)API跟 Docker Engine(引擎)交互告訴它我想創(chuàng)建一個(gè)container,然后docker Engine才會(huì)調(diào)用OCI container runtime(runc)來(lái)啟動(dòng)一個(gè)container。這代表container的process(進(jìn)程)不會(huì)是Docker CLIchild process(子進(jìn)程),而是Docker Enginechild process。
    Podman是直接給OCI containner runtime(runc)進(jìn)行交互來(lái)創(chuàng)建container的,所以container process直接是podmanchild process。
  3. 因?yàn)閐ocke有docker daemon,所以docker啟動(dòng)的容器支持--restart策略,但是podman不支持,如果在k8s中就不存在這個(gè)問(wèn)題,我們可以設(shè)置pod的重啟策略,在系統(tǒng)中我們可以采用編寫(xiě)systemd服務(wù)來(lái)完成自啟動(dòng)
  4. docker需要使用root用戶來(lái)創(chuàng)建容器,但是podman不需要

4,podman的安裝

4.1,Arch Linux & Manjaro Linux

sudo pacman -S podman

4.2,F(xiàn)edora,Centos

sudo yum -y install podman

4.3,Gentoo

sudo emerge app-emulation/libpod

4.4,MacOS

brew cask install podman

5,Podman CLI介紹

Podman CLI 里面87%的指令都和DOcker CLI 相同,官方給出了這么個(gè)例子alias docker=podman,所以說(shuō)經(jīng)常使用DOcker CLI的人使用podman上手非???/p>

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

podman run -dt -p 80:80 --name nginx -v /data:/data -e NGINX_VERSION=1.16 nginx:1.16.0

列出當(dāng)前所有的容器

# podman  ps -a
CONTAINER ID  IMAGE                                       COMMAND               CREATED            STATUS             PORTS               NAMES
19f105d5dc1e  docker.io/library/nginx:1.16.0              nginx -g daemon o...  2 minutes ago      Up 2 minutes ago   0.0.0.0:80->80/tcp  nginx

查看一個(gè)鏡像信息

# podman inspect nginx  | grep -i "ipaddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "10.88.0.110",

查看容器運(yùn)行的日志

podman logs   nginx

查看運(yùn)行中容器資源使用情況

# podman  top nginx
USER    PID   PPID   %CPU    ELAPSED           TTY     TIME   COMMAND
root    1     0      0.000   5m26.420969043s   pts/0   0s     nginx: master process nginx -g daemon off;
nginx   6     1      0.000   5m26.421085502s   pts/0   0s     nginx: worker process

# podman  stats nginx
ID             NAME    CPU %   MEM USAGE / LIMIT   MEM %   NET IO           BLOCK IO   PIDS
19f105d5dc1e   nginx   --      2.036MB / 1.893GB   0.11%   978B / 10.55kB   -- / --    2

遷移容器

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

podman的程序如何設(shè)置自啟動(dòng)

由于 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)的nginx為例。
建立一個(gè) Systemd 服務(wù)配置文件。

$ vim /etc/systemd/system/nginx_podman.service

[Unit]
Description=Podman Nginx Service
After=network.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/podman start -a nginx
ExecStop=/usr/bin/podman stop -t 10 nginx
Restart=always

[Install]
WantedBy=multi-user.target

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

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

之后每次系統(tǒng)重啟后 Systemd 都會(huì)自動(dòng)啟動(dòng)這個(gè)服務(wù)所對(duì)應(yīng)的容器,容器死亡之后也會(huì)啟動(dòng)這個(gè)容器,我們可以用下面的例子做測(cè)試
打一個(gè)sleep 30的docker包,這個(gè)容器運(yùn)行起來(lái)一次只能堅(jiān)持30s

$ vim Dockerfile
FROM busybox:latest
CMD ["sh","-c","sleep 30"]

然后按照上述方式設(shè)置啟動(dòng)自啟動(dòng)

演示下Podman 下啟動(dòng)的容器為Podman的子進(jìn)程

我們剛才啟動(dòng)了一個(gè)nginx的podman 現(xiàn)在我們來(lái)看一下他的進(jìn)程

# ps -ef | grep [n]ginx
root     19368 19359  0 11:38 pts/0    00:00:00 nginx: master process nginx -g daemon off;
101      19381 19368  0 11:38 pts/0    00:00:00 nginx: worker process

然后查看這個(gè)nginx的父進(jìn)程是那個(gè)

# ps -ef | grep 19359
root     19359     1  0 11:38 ?        00:00:00 /usr/libexec/podman/conmon 。。。。

所以驗(yàn)證了我上面的說(shuō)法

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI