我正在探索如何使用containerd
代替dockerd。这仅用于学习,并且作为cli工具,而不是用于任何管道或自动化。
到目前为止,有关使用cli中的容器(通过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
相关的文档对初学者有用?
仅将图像作为容器运行就足够了。
答案 0 :(得分:2)
ctr run
命令创建并执行一个容器
ctr run <imageName> <uniqueValue>
例如,ctr运行docker.io/library/hello-java-app:latest v1 --rm
这将使用打印语句执行我的基本docker java映像:
~~~~
HelloWorld from Java Application running in Docker.
~~~~
已执行的步骤:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("~~~~\nHelloWorld from Java Application running in Docker.\n~~~~");
}
}
FROM java:8
COPY HelloWorld.java .
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]
docker build -t hello-java-app .
docker save -o ~/images/sample/hello-java-app.tar hello-java-app
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 -
ctr run docker.io/library/hello-java-app:latest v1 --rm
~~~~
HelloWorld from Java Application running in Docker.
~~~~
我仍然不确定创建容器的用途。 run命令创建一个容器并执行一次。
ctr c create
只是创建了一个容器,然后可以将其与ctr c ls
一起列出,但是我无法以任何有意义的方式利用它们。任何人都可以澄清其目的吗?
PS:
如果没有--rm标志,则由于保留了旧容器,因此需要为每个run
输入一个新的唯一值,并且会出现错误:ctr: snapshot "v1": already exists