天天看點

podman初試-和docker對比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 CLI

    child process(子程序)

    ,而是

    Docker Engine

    child process

    Podman

    是直接給

    OCI containner runtime(runc)

    進行互動來建立container的,是以

    container process

    直接是

    podman

    child 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的子程序

# 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 。。。。           

繼續閱讀