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 鏡像。nginx

  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上手很是快git

運行一個容器

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

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

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

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

podman的程序如何設置自啓動

因爲 Podman 再也不使用守護進程管理服務,因此不能經過守護進程去實現自動重啓容器的功能。那若是要實現開機自動重啓容器,又該如何實現呢?
其實方法很簡單,如今大多數系統都已經採用 Systemd 做爲守護進程管理工具。這裏咱們就可使用 Systemd 來實現 Podman 開機重啓容器,這裏咱們以剛纔啓動的nginx爲例。
創建一個 Systemd 服務配置文件。vim

$ 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 服務bash

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

以後每次系統重啓後 Systemd 都會自動啓動這個服務所對應的容器,容器死亡以後也會啓動這個容器,咱們能夠用下面的例子作測試
打一個sleep 30的docker包,這個容器運行起來一次只能堅持30sapp

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

而後按照上述方式設置啓動自啓動tcp

演示下Podman 下啓動的容器爲Podman的子進程

咱們剛纔啓動了一個nginx的podman 如今咱們來看一下他的進程ide

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

因此驗證了我上面的說法

相關文章
相關標籤/搜索