containerd使用


Docker CLI 工具提供了需要增強用戶體驗的功能,containerd 同樣也提供一個對應的 CLI 工具:ctr,不過 ctr 的功能沒有 docker 完善,但是關於鏡像和容器的基本功能都是有的。具體看這篇文章:https://www.cnblogs.com/sanduzxcvbnm/p/15814400.html

問題:
創建容器后,運行的時候報錯:

# ctr -n k8s.io task start -d busybox
ctr: failed to create shim: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/k8s.io/busybox/log.json: no such file or directory): runc did not terminate successfully: exit status 127: unknown

通過運行runc命令排查,發現缺少依賴:seccomp_api_get
但是centos7.9系統已經安裝libseccomp-devel了,再次檢查發現,seccomp_api_get對libseccomp版本有要求,至少libseccomp v2.4版本才提供的有seccomp_api_get,安裝的版本是v2.3的,不帶這個 (軟件包 libseccomp-devel-2.3.1-4.el7.x86_64 已安裝並且是最新版本)

# runc
runc: symbol lookup error: runc: undefined symbol: seccomp_api_get

網上下載v2.4b版本的,地址:https://rpmfind.net/linux/rpm2html/search.php?query=libseccomp

centos7.9系統使用的最高版本就是v2.3了

換個其他網站:https://pkgs.org/download/libseccomp

估計只能源碼編譯安裝v2.4版本的了

幫助

直接輸入 ctr 命令即可獲得所有相關的操作命令使用方式:

# ctr
NAME:
   ctr - 
        __
  _____/ /______
 / ___/ __/ ___/
/ /__/ /_/ /
\___/\__/_/

containerd CLI


USAGE:
   ctr [global options] command [command options] [arguments...]

VERSION:
   v1.5.9

DESCRIPTION:
   
ctr is an unsupported debug and administrative client for interacting
with the containerd daemon. Because it is unsupported, the commands,
options, and operations are not guaranteed to be backward compatible or
stable from release to release of the containerd project.

COMMANDS:
   plugins, plugin            provides information about containerd plugins
   version                    print the client and server versions
   containers, c, container   manage containers
   content                    manage content
   events, event              display containerd events
   images, image, i           manage images
   leases                     manage leases
   namespaces, namespace, ns  manage namespaces
   pprof                      provide golang pprof outputs for containerd
   run                        run a container
   snapshots, snapshot        manage snapshots
   tasks, t, task             manage tasks
   install                    install a new package
   oci                        OCI tools
   shim                       interact with a shim directly
   help, h                    Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug                      enable debug output in logs
   --address value, -a value    address for containerd's GRPC server (default: "/run/containerd/containerd.sock") [$CONTAINERD_ADDRESS]
   --timeout value              total timeout for ctr commands (default: 0s)
   --connect-timeout value      timeout for connecting to containerd (default: 0s)
   --namespace value, -n value  namespace to use with commands (default: "default") [$CONTAINERD_NAMESPACE]
   --help, -h                   show help
   --version, -v                print the version

鏡像操作

拉取鏡像

拉取鏡像可以使用 ctr image pull 來完成,比如拉取 Docker Hub 官方鏡像 nginx:alpine,需要注意的是鏡像地址需要加上 docker.io Host 地址:

# ctr pull nginx:alpine # 命令中不帶image的執行結果
No help topic for 'pull'

# ctr image pull nginx:alpine # 命令中不帶鏡像所在倉庫的執行結果
ctr: failed to resolve reference "nginx:alpine": parse "dummy://nginx:alpine": invalid port ":alpine" after host

# ctr image pull docker.io/library/nginx:alpine
docker.io/library/nginx:alpine:                                                   resolved       |++++++++++++++++++++++++++++++++++++++| 
index-sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333:    done           |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:544ba2bfe312bf2b13278495347bb9381ec342e630bcc8929af124f1291784bb: done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:40e5d2fe5bcd566dbde3e961f33ced0f1503fc6ee320a427b185a07afe2f96ae:    done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:cc44224bfe208a46fbc45471e8f9416f66b75d6307573e29634e7f42e27a9268:   done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:59bf1c3509f33515622619af21ed55bbe26d24913cedbca106468a5fb37a50c3:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:f3322597df46099a66ed5773c10a9d1cb587faca7be14ceba985e3d1fbfdbc36:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:d09cf91cabdcf5f64672598b8e4da9b0b7d8546e83ec49633bdd92abb994ba61:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:3a97535ac2efcf94ab3e5f93a6ec4d934469de66909f17ba1229f86ee660970a:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:919ade35f869e23d663ea51fdf2e99aa183239a73b4b4780e052c8b248ed5b7e:    done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 2.6 s                                                                    total:  1.6 Ki (632.0 B/s)                                       
unpacking linux/amd64 sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333...
done: 686.665103ms

可以使用 --platform 選項指定對應平台的鏡像。當然對應的也有推送鏡像的命令 ctr image push,如果是私有鏡像則在推送的時候可以通過 --user 來自定義倉庫的用戶名和密碼。

列出本地鏡像

# ctr image ls
REF                            TYPE                                            DIGEST                                                                         SIZE    PLATFORMS         LABELS                                                                   
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333 9.7 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -    

# 使用 -q(--quiet) 選項可以只打印鏡像名稱。
# ctr image ls -q
docker.io/library/nginx:alpine

檢測本地鏡像

主要查看其中的 STATUS,complete 表示鏡像是完整可用的狀態。

# ctr image check
REF                            TYPE                                                      DIGEST                                                                  STATUS         SIZE            UNPACKED 
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333 complete (7/7) 9.7 MiB/9.7 MiB true

重新打標簽

# ctr image tag docker.io/library/nginx:alpine harbor.k8s.local/course/nginx:alpine
harbor.k8s.local/course/nginx:alpine

# ctr image ls -q
docker.io/library/nginx:alpine
harbor.k8s.local/course/nginx:alpine

刪除鏡像

加上 --sync 選項可以同步刪除鏡像和所有相關的資源

# ctr image rm harbor.k8s.local/course/nginx:alpine
harbor.k8s.local/course/nginx:alpine

# ctr image ls -q
docker.io/library/nginx:alpine

將鏡像掛載到主機目錄

# ctr image mount docker.io/library/nginx:alpine /mnt
sha256:4d6c031b167f0066022c3ba38f8fa9dfbae8a06d55e870293718252328ccae32
/mnt

# tree -L 1 /mnt/    
/mnt/
├── bin
├── dev
├── docker-entrypoint.d
├── docker-entrypoint.sh
├── etc
├── home
├── lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var

18 directories, 1 file

將鏡像從主機目錄上卸載

# ctr image unmount /mnt/
/mnt/

將鏡像導出為壓縮包 (有問題)

注意:使用這個命令最后提示:not found,且導出來的文件大小是0。導出有問題

# ctr image export nginx.tar.gz docker.io/library/nginx:alpine
ctr: content digest sha256:b04df8956da0a737150167d73d0c476aa6cf6b05c93ec8fe2bfa1d11676f2b17: not found

從壓縮包導入鏡像 (未驗證)

# ctr image import nginx.tar.gz

容器操作

容器相關操作可以通過 ctr container 獲取。

創建容器

# ctr container create docker.io/library/nginx:alpine nginx

通過 container create 命令創建的容器,並沒有處於運行狀態,只是一個靜態的容器。一個 container 對象只是包含了運行一個容器所需的資源及相關配置數據,表示 namespaces、rootfs 和容器的配置都已經初始化成功了,只是用戶進程還沒有啟動。
一個容器真正運行起來是由 Task 任務實現的,Task 可以為容器設置網卡,還可以配置工具來對容器進行監控等。
Task 相關操作可以通過 ctr task 獲取,如下我們通過 Task 來啟動容器:

列出容器

# ctr container ls
CONTAINER    IMAGE                             RUNTIME                  
nginx        docker.io/library/nginx:alpine    io.containerd.runc.v2

# 可以加上 -q 選項精簡列表內容:
# ctr container ls -q
nginx

查看容器詳細配置

類似於 docker inspect 功能

# ctr container info nginx
{
    "ID": "nginx",
    "Labels": {
        "io.containerd.image.config.stop-signal": "SIGQUIT"
    },
    "Image": "docker.io/library/nginx:alpine",
    "Runtime": {
        "Name": "io.containerd.runc.v2",
        "Options": {
            "type_url": "containerd.runc.v1.Options"
        }
    },
    "SnapshotKey": "nginx",
    "Snapshotter": "overlayfs",
    "CreatedAt": "2021-08-12T08:23:13.792871558Z",
    "UpdatedAt": "2021-08-12T08:23:13.792871558Z",
    "Extensions": null,
    "Spec": {
......

刪除容器

# ctr container rm nginx
# ctr container ls
CONTAINER    IMAGE    RUNTIME  

除了使用 rm 子命令之外也可以使用 delete 或者 del 刪除容器。

任務

通過 container create 命令創建的容器,並沒有處於運行狀態,只是一個靜態的容器。一個 container 對象只是包含了運行一個容器所需的資源及相關配置數據,表示 namespaces、rootfs 和容器的配置都已經初始化成功了,只是用戶進程還沒有啟動。

一個容器真正運行起來是由 Task 任務實現的,Task 可以為容器設置網卡,還可以配置工具來對容器進行監控等。

Task 相關操作可以通過 ctr task 獲取,如下我們通過 Task 來啟動容器:

# ctr task start -d nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/

啟動容器后可以通過 task ls 查看正在運行的容器:

# ctr task ls
TASK     PID     STATUS
nginx    3630    RUNNING

同樣也可以使用 exec 命令進入容器進行操作:

# ctr task exec --exec-id 0 -t nginx sh

不過這里需要注意必須要指定 --exec-id 參數,這個 id 可以隨便寫,只要唯一就行。

暫停容器,和 docker pause 類似的功能:

#  ctr task pause nginx

暫停后容器狀態變成了 PAUSED:

# ctr task ls
TASK     PID     STATUS
nginx    3630    PAUSED

同樣也可以使用 resume 命令來恢復容器:

# ctr task resume nginx
# ctr task ls
TASK     PID     STATUS
nginx    3630    RUNNING

不過需要注意 ctr 沒有 stop 容器的功能,只能暫停或者殺死容器。殺死容器可以使用 task kill 命令:

# ctr task kill nginx
# ctr task ls
TASK     PID     STATUS
nginx    3630    STOPPED

殺掉容器后可以看到容器的狀態變成了 STOPPED。同樣也可以通過 task rm 命令刪除 Task:

# ctr task rm nginx
# ctr task ls
TASK    PID    STATUS

除此之外我們還可以獲取容器的 cgroup 相關信息,可以使用 task metrics 命令用來獲取容器的內存、CPU 和 PID 的限額與使用量。

# 重新啟動容器
# ctr task metrics nginx
ID       TIMESTAMP
nginx    2021-08-12 08:50:46.952769941 +0000 UTC

METRIC                   VALUE
memory.usage_in_bytes    8855552
memory.limit_in_bytes    9223372036854771712
memory.stat.cache        0
cpuacct.usage            22467106
cpuacct.usage_percpu     [2962708 860891 1163413 1915748 1058868 2888139 6159277 5458062]
pids.current             9
pids.limit               0

還可以使用 task ps 命令查看容器中所有進程在宿主機中的 PID:

#  ctr task ps nginx
PID     INFO
3984    -
4029    -
4030    -
4031    -
4032    -
4033    -
4034    -
4035    -
4036    -
#  ctr task ls
TASK     PID     STATUS
nginx    3984    RUNNING

其中第一個 PID 3984 就是我們容器中的1號進程。

命名空間

另外 Containerd 中也支持命名空間的概念,比如查看命名空間:

#  ctr ns ls
NAME    LABELS
default

如果不指定,ctr 默認使用的是 default 空間。同樣也可以使用 ns create 命令創建一個命名空間:

# ctr ns create test
#  ctr ns ls
NAME    LABELS
default
test

使用 remove 或者 rm 可以刪除 namespace:

# ctr ns rm test
test
#  ctr ns ls
NAME    LABELS
default

有了命名空間后就可以在操作資源的時候指定 namespace,比如查看 test 命名空間的鏡像,可以在操作命令后面加上 -n test 選項:

# ctr -n test image ls
REF TYPE DIGEST SIZE PLATFORMS LABELS

我們知道 Docker 其實也是默認調用的 containerd,事實上 Docker 使用的 containerd 下面的命名空間默認是 moby,而不是 default,所以假如我們有用 docker 啟動容器,那么我們也可以通過 ctr -n moby 來定位下面的容器:

ctr -n moby container ls

同樣 Kubernetes 下使用的 containerd 默認命名空間是 k8s.io,所以我們可以使用 ctr -n k8s.io 來查看 Kubernetes 下面創建的容器。后續我們再介紹如何將 Kubernetes 集群的容器運行時切換到 containerd。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM