如何在 CLI 中使用 ctr 在 containerd 中 运行 docker 图像?
How to run docker images in containerd using ctr in CLI?
正在探索如何使用 containerd
代替 dockerd。这仅供学习,并作为 cli 工具,而不是与任何管道或自动化一起使用。
到目前为止,关于在 cli 中使用 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。是否有任何与 ctr
或 containerd
相关的文档对初学者有帮助?
只需 运行将图像作为容器就足够了。
ctr run
命令创建容器并执行
ctr run <imageName> <uniqueValue>
e.g., ctr run docker.io/library/hello-java-app:latest v1 --rm
这将使用打印语句执行我的基本 docker java 图像:
~~~~
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 docker.io/library/hello-java-app:latest v1 --rm
~~~~
HelloWorld from Java Application running in Docker.
~~~~
I am still unsure of the use of creating a container. The run command creates a container and executes it once. ctr c create
just creates a container which can then be listed with ctr c ls
but I am not able to utilize them in any meaningful way. Can anyone clarify its purpose?
PS:
如果没有 --rm 标志,则需要为每个 run
输入一个新的唯一值,因为保留了旧容器,我们得到一个错误:ctr: snapshot "v1": already exists
正在探索如何使用 containerd
代替 dockerd。这仅供学习,并作为 cli 工具,而不是与任何管道或自动化一起使用。
到目前为止,关于在 cli 中使用 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。是否有任何与 ctr
或 containerd
相关的文档对初学者有帮助?
只需 运行将图像作为容器就足够了。
ctr run
命令创建容器并执行
ctr run <imageName> <uniqueValue>
e.g., ctr run docker.io/library/hello-java-app:latest v1 --rm
这将使用打印语句执行我的基本 docker java 图像:
~~~~
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 docker.io/library/hello-java-app:latest v1 --rm
~~~~
HelloWorld from Java Application running in Docker.
~~~~
I am still unsure of the use of creating a container. The run command creates a container and executes it once.
ctr c create
just creates a container which can then be listed withctr c ls
but I am not able to utilize them in any meaningful way. Can anyone clarify its purpose?
PS:
如果没有 --rm 标志,则需要为每个 run
输入一个新的唯一值,因为保留了旧容器,我们得到一个错误:ctr: snapshot "v1": already exists