podman初試-和docker對比


podman初試-和docker對比

1,什么是docker?

Docker 是一個開源的應用容器引擎,屬於 Linux 容器的一種封裝,Docker 提供簡單易用的容器使用接口,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上。容器是完全使用沙箱機制,相互之間不會有任何接口。

2,什么是Podman?

Podman 是一個開源的容器運行時項目,可在大多數 Linux 平台上使用。Podman 提供與 Docker 非常相似的功能。正如前面提到的那樣,它不需要在你的系統上運行任何守護進程,並且它也可以在沒有 root 權限的情況下運行。
Podman 可以管理和運行任何符合 OCI(Open Container Initiative)規范的容器和容器鏡像。Podman 提供了一個與 Docker 兼容的命令行前端來管理 Docker 鏡像。

  1. Podman 官網地址:https://podman.io/
  2. Podman 項目地址:https://github.com/containers/libpod

3,Podman 和docker不同之處?

  1. docker 需要在我們的系統上運行一個守護進程(docker daemon),而podman 不需要
  2. 啟動容器的方式不同:
    docker cli 命令通過API跟 Docker Engine(引擎)交互告訴它我想創建一個container,然后docker Engine才會調用OCI container runtime(runc)來啟動一個container。這代表container的process(進程)不會是Docker CLIchild process(子進程),而是Docker Enginechild process
    Podman是直接給OCI containner runtime(runc)進行交互來創建container的,所以container process直接是podmanchild process
  3. 因為docke有docker daemon,所以docker啟動的容器支持--restart策略,但是podman不支持,如果在k8s中就不存在這個問題,我們可以設置pod的重啟策略,在系統中我們可以采用編寫systemd服務來完成自啟動
  4. docker需要使用root用戶來創建容器,但是podman不需要

4,podman的安裝

4.1,Arch Linux & Manjaro Linux

sudo pacman -S podman

4.2,Fedora,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 相同,官方給出了這么個例子alias docker=podman,所以說經常使用DOcker CLI的人使用podman上手非常快

運行一個容器

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

列出當前所有的容器

# 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 

查看一個鏡像信息

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

查看容器運行的日志

podman logs   nginx

查看運行中容器資源使用情況

# 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 支持將容器從一台機器遷移到另一台機器。
首先,在源機器上對容器設置檢查點,並將容器打包到指定位置。

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

其次,在目標機器上使用源機器上傳輸過來的打包文件對容器進行恢復。

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

podman的程序如何設置自啟動

由於 Podman 不再使用守護進程管理服務,所以不能通過守護進程去實現自動重啟容器的功能。那如果要實現開機自動重啟容器,又該如何實現呢?
其實方法很簡單,現在大多數系統都已經采用 Systemd 作為守護進程管理工具。這里我們就可以使用 Systemd 來實現 Podman 開機重啟容器,這里我們以剛才啟動的nginx為例。
建立一個 Systemd 服務配置文件。

$ 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

接下來,啟用這個 Systemd 服務

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

之后每次系統重啟后 Systemd 都會自動啟動這個服務所對應的容器,容器死亡之后也會啟動這個容器,我們可以用下面的例子做測試
打一個sleep 30的docker包,這個容器運行起來一次只能堅持30s

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

然后按照上述方式設置啟動自啟動

演示下Podman 下啟動的容器為Podman的子進程

我們剛才啟動了一個nginx的podman 現在我們來看一下他的進程

# 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 

然后查看這個nginx的父進程是那個

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

所以驗證了我上面的說法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM