容器入門(2) - podman


說明

安裝Podman環境

在配置好RedHat的Yum即可安裝Podman。

$ yum install pod

客戶端配置文件

Podman使用了/etc/containers/registries.conf和/etc/containers/storage.conf文件定義客戶端環境配置。其中registries.conf定義了podman能夠訪問到的container registry服務器的信息,而storage.conf定義了podman保存在本地的容器鏡像和其運行容器的文件目錄。我們可以通過執行“podman info”查看這些配置是否生效。

$ podman info
host:
  BuildahVersion: 1.9.0
  Conmon:
    package: podman-1.4.4-4.el7.x86_64
    path: /usr/libexec/podman/conmon
    version: 'conmon version 0.3.0, commit: unknown'
  Distribution:
    distribution: '"rhel"'
    version: "7.7"
  MemFree: 1084551168
  MemTotal: 2096144384
  OCIRuntime:
    package: runc-1.0.0-65.rc8.el7.x86_64
    path: /usr/bin/runc
    version: 'runc version spec: 1.0.1-dev'
  SwapFree: 2145644544
  SwapTotal: 2147479552
  arch: amd64
  cpus: 1
  hostname: registry
  kernel: 3.10.0-1062.el7.x86_64
  os: linux
  rootless: false
  uptime: 19h 40m 40.17s (Approximately 0.79 days)
registries:
  blocked: null
  insecure:
  - registry.domain.com
  search:
  - docker.io
  - registry.fedoraproject.org
  - quay.io
  - registry.access.redhat.com
  - registry.centos.org
  - registry.domain.com
store:
  ConfigFile: /etc/containers/storage.conf
  ContainerStore:
    number: 2
  GraphDriverName: overlay
  GraphOptions: null
  GraphRoot: /var/lib/containers/storage
  GraphStatus:
    Backing Filesystem: xfs
    Native Overlay Diff: "true"
    Supports d_type: "true"
    Using metacopy: "false"
  ImageStore:
    number: 2
  RunRoot: /var/run/containers/storage
  VolumePath: /var/lib/containers/storage/volumes

系統全局的配置文件位於/etc/containers/registries.conf和/etc/containers/storage.conf,用戶也可以使用“~/.config/containers/registries.conf”、“~/.config/containers/storage.conf”覆蓋系統全局的配置。
在registries.conf文件中“[registries.search]”是podman搜索鏡像的目標registry,而“[registries.insecure]”定義了可以不通過TLS訪問的registry。

[registries.search]
registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io']
 
[registries.insecure]
registries = []
 
[registries.block]
registries = []

在storage.conf文件中,“graphroot”參數是用來定義存放Image和容器可寫內容的目錄(其下面對應相關的子目錄);而“runroot”參數是用來定義存放容器臨時可寫內容的目錄;“VolumePath”參數指定了“podman volume create”命令創建的目錄位置。

登錄Registry

$ podman login -u user1 -p password1 ${REGISTRY_DOMAIN}:5000

查詢鏡像

  1. podman默認是搜索/etc/containers/registries.conf文件中“[registries.search]”中配置的registry。
  2. 查詢“docker.io/busybox”鏡像,只返回3個結果。
$ podman search docker.io/busybox --limit 3
INDEX       NAME                              DESCRIPTION                                       STARS   OFFICIAL   AUTOMATED
docker.io   docker.io/library/busybox         Busybox base image.                               1931    [OK]
docker.io   docker.io/radial/busyboxplus      Full-chain, Internet enabled, busybox made f...   31                 [OK]
docker.io   docker.io/yauritux/busybox-curl   Busybox with CURL                                 8
  1. 查本地Registry上的busybox鏡像。
$ podman search ${REGISTRY_DOMAIN}:5000/busybox --limit 3
INDEX             NAME                               DESCRIPTION   STARS   OFFICIAL   AUTOMATED
domain.com:5000   registry.domain.com:5000/busybox                 0

pull/push 鏡像

  1. 將busybox鏡像從docker.io拉到本地緩存。注意“Storing signatures”後面的字符創。
$ podman pull busybox
Trying to pull docker.io/library/busybox...Getting image source signatures
Copying blob 91f30d776fb2 done
Copying config c7c37e472d done
Writing manifest to image destination
Storing signatures
c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998
  1. 查看本地鏡像緩存。注意“IMAGE ID”的內容是上面““Storing signatures”的一部分。
$ podman images
REPOSITORY                  TAG      IMAGE ID       CREATED      SIZE
docker.io/library/busybox   latest   c7c37e472d31   2 days ago   1.44 MB
  1. 設置podman在本地存放鏡像的目錄。
$ PODMAN_DATA_DIR=/var/lib/containers/storage
  1. 查看鏡像的存儲目錄,確認有上面有對應“IMAGE ID”的“c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998”目錄。
$ ll ${PODMAN_DATA_DIR}/overlay-images
total 8
drwx------.  2 root root  244 Jul  2 13:55 c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998
-rw-------.  1 root root 1134 Jul  2 13:55 images.json
-rw-------.  1 root root   64 Ju
l  2 13:55 images.lock

訪問非安全的Registry

當podman訪問Registry的時候進行build、commit、pull或push操作的時候,如果所訪問的Registry在“[registries.insecure]”中,那麼podman缺省用“–tls-verify=false”發起請求。如果訪問其它Registry(沒有在registries.conf中定義或在registries.conf中定義爲“[registries.search]”),podman缺省用“–tls-verify=true”發起請求。如果需要不使用上述缺省訪問,可以在命令中會用“–tls-verify”。

查看鏡像分層目錄

$ podman image tree busybox
Image ID: c7c37e472d31
Tags:    [docker.io/library/busybox:latest]
Size:    1.444MB
Image Layers
└──  ID: 50761fe126b6 Size: 1.442MB Top Layer of: [docker.io/library/busybox:latest]

保存鏡像-恢復鏡像

  1. 執行命令,確認本地有busybox鏡像。
$ podman images
REPOSITORY                  TAG      IMAGE ID       CREATED      SIZE
docker.io/library/busybox   latest   c7c37e472d31   4 days ago   1.44 MB
  1. 執行命令,將本地docker.io/library/busybox:latest鏡像保存到文件中。
$ podman save --quiet -o busybox.tar docker.io/library/busybox:latest
Getting image source signatures
Copying blob 50761fe126b6 done
Copying config c7c37e472d done
Writing manifest to image destination
Storing signatures
 
$ ll busybox.tar
-rw-r--r--. 1 root root 1451008 Jul  3 16:08 busybox.tar
  1. 將本地docker.io/library/busybox:latest鏡像刪除。
$ podman rmi docker.io/library/busybox:latest
c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998
 
$ podman images
REPOSITORY   TAG   IMAGE ID   CREATED   SIZE
  1. 從busybox.tar文件加載busybox鏡像,然後確認鏡像已經加載成功。
$ podman load --quiet -i busybox.tar
Loaded image(s): docker.io/library/busybox:latest
 
$ podman images
REPOSITORY                  TAG      IMAGE ID       CREATED      SIZE
docker.io/library/busybox   latest   c7c37e472d31   4 days ago   1.44 MB

運行容器,並觀察對應進程和使用的存儲

  1. 在Terminal 1中運行busybox容器,然後在其中創建1個目錄和hello.txt,然後查看容器內的主機名。注意不要退出。
$ podman run --name busybox-local -it ${REGISTRY_DOMAIN}:5000/busybox
/ # mkdir mydir1
/ # echo hello > mydir1/hello.txt
/ # hostname
84625108be74
  1. 在Terminal 2中運命令,查看運行的容器。其中“CONTAINER ID”爲“84625108be74”,和容器內的主機名相同。
$ podman ps
CONTAINER ID  IMAGE                                    COMMAND  CREATED         STATUS             PORTS  NAMES
84625108be74  registry.domain.com:5000/busybox:latest  sh       1 minutes ago   Up 1 minutes ago         busybox-local
  1. 在Terminal 2中運命令,查看系統進程,確認能看到容器是通過“/usr/libexec/podman/conmon”進程運行起來的,運行的容器就是一個系統進程。另外,其中的“/var/lib/containers/storage/overlay-containers/xxxxxxxxxx/userdata”中的“xxxxxxxxxx”就是該容器的ID。
$ ps -ef | grep busybox
root      5340     1  0 13:52 ?        00:00:00 /usr/libexec/podman/conmon -s -c 84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686 -u 84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686 -n busybox-local -r /usr/bin/runc -b /var/lib/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata -p /var/run/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/pidfile --exit-dir /var/run/libpod/exits --exit-command /usr/bin/podman --exit-command-arg --root --exit-command-arg /var/lib/containers/storage --exit-command-arg --runroot --exit-command-arg /var/run/containers/storage --exit-command-arg --log-level --exit-command-arg error --exit-command-arg --cgroup-manager --exit-command-arg systemd --exit-command-arg --tmpdir --exit-command-arg /var/run/libpod --exit-command-arg --runtime --exit-command-arg runc --exit-command-arg --storage-driver --exit-command-arg overlay --exit-command-arg container --exit-command-arg cleanup --exit-command-arg 84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686 --socket-dir-path /var/run/libpod/socket -t -l k8s-file:/var/lib/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/ctr.log --log-level error
 
$ more /var/run/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/pidfile
5340
 
$ more /var/run/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/hostname
84625108be74  
 
$ more /var/run/containers/storage/overlay-containers/84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686/userdata/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.6     registry.domain.com
10.88.0.21      84625108be74  
  1. 執行命令,列出所有已掛載容器掛載點。返回結果包括容器ID和其掛載點目錄。
$ podman mount
84625108be74  /var/lib/containers/storage/overlay/8a1697a77a6f7acc87a6ce5042c7b890b30260bf8d64c31f01105af5adf3cf12/merged
  1. 在Terminal 2中運命令,查找名爲“hello.txt”的文件。確認可以查到2個名爲“hello.txt”的文件,一個是在“xxxxxxxxxxxxxxxxxx/diff/mydir1”目錄中,另一個在“xxxxxxxxxxxxxxxxxx/merged/mydir1”中。
$ find / -name hello.txt
/var/lib/containers/storage/overlay/8a1697a77a6f7acc87a6ce5042c7b890b30260bf8d64c31f01105af5adf3cf12/diff/mydir1/hello.txt
/var/lib/containers/storage/overlay/8a1697a77a6f7acc87a6ce5042c7b890b30260bf8d64c31f01105af5adf3cf12/merged/mydir1/hello.txt
  1. 在Terminal 1中運命令,從“busybox”容器中退出。
/ # exit
  1. 再次在Terminal 2中運命令,查找名爲“hello.txt”的文件。確認只能在“xxxxxxxxxxxxxxxxxx/diff/mydir1”目錄中查到1個名爲“hello.txt”的文件了。
$ find / -name hello.txt
/var/lib/containers/storage/overlay/8a1697a77a6f7acc87a6ce5042c7b890b30260bf8d64c31f01105af5adf3cf12/diff/mydir1/hello.txt
  1. 執行命令,查看busybox-local容器的文件系統變化情況。
$ podman diff busybox-local
C /etc
A /mydir1
A /mydir1/hello.txt
C /root
A /root/.ash_history

查看容器日誌

  1. 在Terminal 1中執行命令,查看所有運行的容器,其中有剛剛運行並退出的“busybox-local”容器。此時該容器的環境還在,只不過沒有運行。
$ podman ps -a
CONTAINER ID  IMAGE                                    COMMAND  CREATED         STATUS                      PORTS  NAMES
84625108be74  registry.domain.com:5000/busybox:latest  sh       48 seconds ago  Exited (0) 30 seconds ago          busybox-local
  1. 執行命令,查看名爲 busybox-local的容器日誌。
$ podman logs busybox-local
/ # mkdir mydir1
/ # echo hello > ./mydir1/hello.txt
/ # exit

查看容器運行實時狀態

  1. 在Terminal 1中運行命令,繼續運行busybox-local容器。
$ podman start -ia busybox-local
  1. 執行命令,查看容器運行運行的實施消耗資源情況。
$ podman stats --all
ID             NAME            CPU %   MEM USAGE / LIMIT   MEM %   NET IO        BLOCK IO   PIDS
e8193ad15aee   busybox-local   --      53.25kB / 2.096GB   0.00%   698B / 656B   -- / --    1

運行停止的容器

  1. 在Terminal 1中執行命令,查看所有運行的容器,其中有剛剛運行並退出的“busybox-local”容器。此時該容器的環境還在,只不過沒有運行。
$ podman ps -a
CONTAINER ID  IMAGE                                    COMMAND  CREATED         STATUS                      PORTS  NAMES
84625108be74  registry.domain.com:5000/busybox:latest  sh       48 seconds ago  Exited (0) 30 seconds ago          busybox-local
  1. 在Terminal 1中再次執行以下命令,將報錯,提示已經名爲“busybox-local”的容器已經在本地存儲中了。
$ podman run --name busybox-local -ai ${REGISTRY_DOMAIN}:5000/busybox
Error: error creating container storage: the container name "busybox-local" is already in use by "84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686". You have to remove that container to be able to reuse that name.: that name is already in use
  1. 在Terminal 1中執行命令,根據在本地已有的“busybox-local”容器重新運行。在進入“busybox-local”容器內部後再次退出。
$ podman start -ai busybox-local
/ # exit

刪除容器

  1. 在Terminal 1中執行命令,查看所有運行的容器,其中有剛剛運行並退出的“busybox-local”容器。此時該容器的環境還在,只不過沒有運行。
$ podman ps -a
CONTAINER ID  IMAGE                                    COMMAND  CREATED            STATUS                       PORTS  NAMES
84625108be74  registry.domain.com:5000/busybox:latest  sh       44 minutes ago     Exited (0) 7 minutes ago            busybox-local
  1. 在Terminal 1中執行命令,刪除busybox-local容器。
$ podman rm busybox-local
84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686
  1. 或者在Terminal 1中執行以下命令,將所有不運行的容器全部刪除,
$ podman container prune
84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686
  1. 在Terminal 1中執行命令,已經找不到“hello.txt”了。
$ find / -name hello.txt

Podman運行環境管理

查看運行環境信息

$ podman system df
TYPE            TOTAL   ACTIVE   SIZE     RECLAIMABLE
Images          1       0        1.44MB   1.44MB (100%)
Containers      0       0        0B       0B (0%)
Local Volumes   1       0        0B       0B (0%)

刪除所有不用的容器、鏡像和本地存儲卷

$ podman system prune --all --volumes

參考

https://fossies.org/linux/libpod/troubleshooting.md

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章