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不需要

https://ithelp.ithome.com.tw/upload/images/20200918/20130321DoqR3E66JK.png

 

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  -e /tmp/checkpoint.tar.gz
$ scp /tmp/checkpoint.tar.gz :/tmp

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

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

備份映象檔和容器

如圖所示,我們可以使用 save/load 來備份跟還原映像檔 還可以用 export/import 來備份及導入運行中的容器。但是如果您掛載 tmpfs volume在運行的容器,則 export/import 不能作為該容器的備份解決方案,因為 export 不會備份Memory內存檔案。 當您從 tar 文件中導入容器時,tmpfs中的資料將會遺失。此時您可以改用 checkpoint/restore 功能。 對於Docker,您需要打開啟動“實驗性功能”才可以使用此指令。而 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 。。。。

 

參考來源

https://www.796t.com/article.php?id=65390

https://igene.tw/?s=podman&submit=Search

https://ithelp.ithome.com.tw/articles/10238749

By tony

自由軟體愛好者~喜歡不斷的思考各種問題,有新的事物都會想去學習嘗試 做實驗並熱衷研究 沒有所謂頂天的技術 只有謙虛及不斷的學習 精進專業,本站主要以分享系統及網路相關知識、資源而建立。 Github http://stnet253.github.io

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料