如何在CLI中使用ctr在containerd中运行docker镜像?

ds97pgxw  于 2023-11-17  发布在  Docker
关注(0)|答案(1)|浏览(152)

我正在探索如何使用containerd代替dockerd。这只是为了学习,作为一个工具,而不是任何管道或自动化。
到目前为止,关于在Python中使用containerd(通过ctr)的文档非常有限。即使是官方文档也使用Go lang直接使用containerd
我学到的是ctr命令扮演docker命令的角色来控制containerd。到目前为止,我已经创建了一个docker镜像并将其导出为.tar格式。现在使用ctr i import hello.tar我将其导入为镜像。
现在ctr i ls给出了以下输出:

REF                                     TYPE                                       DIGEST                                                                  SIZE      PLATFORMS   LABELS
docker.io/library/hello-java-app:latest application/vnd.oci.image.manifest.v1+json sha256:ef4acfd85c856ea020328959ff3cac23f37fa639b7edfb1691619d9bfe1e06c7 628.7 MiB linux/amd64 -

字符串
尝试运行一个容器会要求我提供镜像ID:

root@slave-node:~/images/sample# ctr run
ctr: image ref must be provided
root@slave-node:~/images/sample# ctr run docker.io/library/hello-java-app:latest
ctr: container id must be provided


我不知道从哪里获取镜像ID。有没有关于ctrcontainerd的文档可以帮助初学者?

只需将映像作为容器运行就足够了。

dxxyhpgq

dxxyhpgq1#

ctr run命令创建并执行容器

ctr run <imageName> <uniqueValue>

字符串
例如,ctr run --rm docker.io/library/hello-java-app:latest mypod
这将执行我的基本Docker Java镜像,并使用print语句:

~~~~
HelloWorld from Java Application running in Docker.
~~~~

步骤如下:

1 -一个java文件:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("~~~~\nHelloWorld from Java Application running in Docker.\n~~~~");
    }
}

2 -一张图片:

FROM java:8
COPY HelloWorld.java .
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]

3 -构建镜像并导出为.tar

  • docker build -t hello-java-app .
  • docker save -o ~/images/sample/hello-java-app.tar hello-java-app

4 -将镜像(.tar)导入containerd:

  • ctr i import hello-java-app.tar
unpacking docker.io/library/hello-java-app:latest (sha256:ef4acfd85c856ea020328959ff3cac23f37fa639b7edfb1691619d9bfe1e06c7)...done

  • ctr i ls
REF                                     TYPE                                       DIGEST                                                                  SIZE      PLATFORMS   LABELS
docker.io/library/hello-java-app:latest application/vnd.oci.image.manifest.v1+json sha256:ef4acfd85c856ea020328959ff3cac23f37fa639b7edfb1691619d9bfe1e06c7 628.7 MiB linux/amd64 -

5 -运行镜像:

  • ctr run --rm docker.io/library/hello-java-app:latest mypod
~~~~
HelloWorld from Java Application running in Docker.
~~~~


我仍然不确定创建容器的用途。run命令创建一个容器并执行一次。ctr c create只是创建一个容器,然后可以与ctr c ls一起列出,但我无法以任何有意义的方式使用它们。有人能澄清它的用途吗?
附言:如果没有--rm标志,则需要为每个run输入一个新的唯一值,因为旧的容器会被保留,我们会得到一个错误:ctr: snapshot "mypod": already exists

相关问题