【问题标题】:How to run docker images in containerd using ctr in CLI?如何在 CLI 中使用 ctr 在 containerd 中运行 docker 映像?
【发布时间】:2020-04-11 02:13:57
【问题描述】:

正在探索如何使用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。是否有任何与ctrcontainerd 相关的文档对初学者有帮助?

对我来说,仅将图像作为容器运行就足够了。

【问题讨论】:

  • ctr run 中使用更多参数时需要考虑的一些事项。例如。同时使用--uidmap--gidmap,以防您想在没有主机root 权限的情况下运行容器(请参阅this question 为什么)。同样使用--net-host 使主机网络可用不适用于无根容器(请参阅here

标签: docker containers containerd


【解决方案1】:

ctr run 命令创建一个容器并执行它

ctr run <imageName> <uniqueValue>

例如,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.
~~~~

我仍然不确定创建容器的用途。 run 命令创建一个容器并执行一次。 ctr c create 只是创建一个容器,然后可以用ctr c ls 列出,但我无法以任何有意义的方式使用它们。谁能澄清一下它的目的?


PS: 如果没有 --rm 标志,则需要为每个 run 输入一个新的唯一值,因为旧容器被保留,我们得到一个错误:ctr: snapshot "v1": already exists

【讨论】:

  • 如何在“ctr run”命令中使用经典的 docker 选项,例如转发端口 (-p) 或分离容器 (-d) 或绑定卷 (-v)
  • @RedaDrissi 从 1.3.3 版开始使用 -d 分离并使用 --mount 绑定卷。虽然不确定端口转发。 man ctr 了解更多详情。
  • 第 5 步 --rm 位置错误。如图所示,它被视为 exec arg。我最初运行了推荐的命令,但出错了。对于v1,需要清理snapshot removecontainer delete。当--rm 在正确的位置(在图像名称之前)时,该命令可以正常工作。
猜你喜欢
  • 2018-03-20
  • 2019-04-25
  • 2021-07-14
  • 2020-05-16
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
相关资源
最近更新 更多