podman初試-和docker對比
1,什麼是docker?
Docker 是一個開源的應用容器引擎,屬于 Linux 容器的一種封裝,Docker 提供簡單易用的容器使用接口,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上。容器是完全使用沙箱機制,互相之間不會有任何接口。
2,什麼是Podman?
Podman 是一個開源的容器運作時項目,可在大多數 Linux 平台上使用。Podman 提供與 Docker 非常相似的功能。正如前面提到的那樣,它不需要在你的系統上運作任何守護程序,并且它也可以在沒有 root 權限的情況下運作。
Podman 可以管理和運作任何符合 OCI(Open Container Initiative)規範的容器和容器鏡像。Podman 提供了一個與 Docker 相容的指令行前端來管理 Docker 鏡像。
- Podman 官網位址:https://podman.io/
- Podman 項目位址:https://github.com/containers/libpod
3,Podman 和docker不同之處?
- docker 需要在我們的系統上運作一個守護程序(docker daemon),而podman 不需要
- 啟動容器的方式不同:
指令通過API跟docker cli
互動告訴它我想建立一個container,然後Docker Engine(引擎)
才會調用docker Engine
來啟動一個container。這代表container的process(程序)不會是OCI container runtime(runc)
的Docker CLI
,而是child process(子程序)
Docker Engine
。child process
是直接給Podman
進行互動來建立container的,是以OCI containner runtime(runc)
直接是container process
podman
child process
- 因為docke有docker daemon,是以docker啟動的容器支援
政策,但是podman不支援,如果在k8s中就不存在這個問題,我們可以設定pod的重新開機政策,在系統中我們可以采用編寫systemd服務來完成自啟動--restart
- 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的子程序
# 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
# ps -ef | grep 19359
root 19359 1 0 11:38 ? 00:00:00 /usr/libexec/podman/conmon 。。。。