这两者如何比较?据我所知,runC是容器的运行时环境.这意味着该组件提供了运行容器所必需的环境.那时容器的作用是什么?如果它完成其余的工作(网络,卷管理等),那么Docker Engine的作用是什么?那容器式垫片怎么样?基本上,我试图了解每个组件的作用.
我试图更好地理解Docker世界,并且似乎无法将我的大脑包围在这些之间的差异.我相信 OCF是一个由OpenContainers认可的新兴容器标准,我相信 Docker将成为该标准的第一个参考实现.但即便如此,我也担心Google Gods似乎没有提供以下答案:
我读过许多与我的问题类似的链接,但它们都没有帮助我解决问题。
类似链接:
问题描述:
我已经使用创建了一个新的 Kubernetes 集群Kubespray。当我想在其中一个容器中执行一些命令时,我遇到了以下错误:
kubectl exec -it -n rook-ceph rook-ceph-tools-68d847b88d-7kw2v -- sh
Run Code Online (Sandbox Code Playgroud)
OCI 运行时执行失败:执行失败:无法启动容器进程:打开 /dev/pts/1:不允许操作:未知命令以退出代码 126 终止
我也登录了运行pod的节点,并尝试使用docker exec命令执行容器,但错误没有改变。
解决方法:
据我发现,错误代码(126)意味着权限不足,但我sh在 Docker 或 Kubernetes 中没有遇到过这种错误(例如执行)。
我还检查了是否SELinux启用(正如第三个链接中所述)。
apt install policycoreutils
sestatus
# Output
SELinux status: disabled
Run Code Online (Sandbox Code Playgroud)
在第5个链接中,据说检查你是否更新了内核,而我没有升级节点上的任何内容。
id; stat /dev/pts/0
# output
uid=0(root) gid=0(root) groups=0(root)
File: /dev/pts/0
Size: 0 Blocks: …Run Code Online (Sandbox Code Playgroud)在Archlinux上安装docker时,出现以下错误:
error: runc: signature from "Frederik Schwan <frederik.schwan@linux.com>" is unknown trust
:: File /var/cache/pacman/pkg/runc-1.0.3-1-x86_64.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题,因为它阻止我安装 docker 吗?
我使用 minikube 设置了 2 个 k8s 环境。一张带--container-runtime=docker旗帜,一张带--container-runtime=containerd旗帜。这是我看到的差异。
当我设定时container-runtime=docker,这些事情就会发生
dockerd服务正在运行dockerd生成containerd/usr/bin/containerd-shim-runc-v2进程运行实际的容器,每个进程的父进程containerd-shim-runc-v2在系统上都是 PID 1。当我设定时container-runtime=containerd,这些事情就会发生
dockerd服务,没有任何含糊之处。containerd进程,其所有者为 PID 1。同样,这并不奇怪。containerd-shim进程运行实际的容器,每个containerd-shim进程的父进程是containerd这是我的问题
containerd-shim和之间有什么区别containerd-shim-runc-v2?他们似乎大多采用相似的旗帜等。编辑:刚刚想到编辑。在ubuntu 20机器上,如果我安装docker,dockerd是一个单独的进程,其父进程是PID 1,containerd是一个单独的进程,其父进程是PID 1,所有容器都是container-shim-runc-v2的子进程,其PID为1 ?!?!为什么不是containerd孩子dockerd?这是在哪里配置的?
从我读到的内容来看,它似乎是困扰 docker 的一切问题的答案。用户目录中的图像、只有用户权限的容器、没有守护进程等。 然而,每个安装指南似乎都依赖于系统的包管理器,而构建似乎依赖于正在安装的包(runc、common),这也需要系统包管理器的权限。
那么如何让 podman 在我只有普通用户访问权限的系统上运行呢?
我注意到该命令docker build有一个参数--shm-size bytes用于设置 /dev/shm 的大小。但我不知道为什么docker build需要使用共享内存。
该docker build命令仅遵循 Dockerfile 并运行一组中间容器来构建目标容器环境并将其作为映像提交。在这个过程中,Dockerfile中的所有参数和命令都被解析并打包为一个struct,传入不同的组件(docker client、docker daemon、containerd、runc ...)。似乎docker build不需要共享内存来传递信息。
但为什么docker build要提供这个参数--shm-size bytes呢?也许我对这个过程有一些误解。请纠正我。谢谢!
我们在 swarm 环境中使用 docker。一切都很好......但是对于几天前出现的一个名为“exe”的奇怪进程:
14126 root 20 0 446836 33648 184 R 49.0 0.2 0:05.98 exe
1 root 20 0 52356 532 332 S 34.3 0.0 2750:22 systemd
13789 root 20 0 5424660 49784 0 S 5.6 0.3 2381:57 dockerd
Run Code Online (Sandbox Code Playgroud)
它确实占用了 100% 的 CPU。
我们试图了解它来自哪里,但它非常不稳定,它的 pid 每 3-4 秒就会改变一次。你可以猜想,这样的行为引发了一些警报。
最终,我们设置了一些监控工具(使用auditd)来拍摄它的快照,并看到:
Syscall event curl /usr/bin/curl 24242 24234
Syscall event 4 / 24240 24234
Syscall event exe /usr/bin/runc 24240 24234
Syscall event runc /usr/bin/runc 24234 10444
Run Code Online (Sandbox Code Playgroud)
“main”runc 的父进程是:
root 10444 2621 0 …Run Code Online (Sandbox Code Playgroud) 我有多个 Docker 映像和容器在 VM 上运行。但是像“runc list”这样的命令没有列出任何这些。
如何让 runc/containerd 知道我现有的 docker 镜像?
请原谅我刚刚开始学习理解Docker。据我所知,Docker曾经依赖过LXC。然后转到libcontainer.Now it is Runc(from docker 1.11). 这是(开放容器格式)的实现OCF。而且我知道Runc只能在Linux上运行。RuncLinux docker 的底层也是如此。Runc我的问题是Windows docker 上的Linux docker 相当于什么?谢谢。
当我第一次听说微软正在努力运行docker容器时,它没有任何意义.
有一段时间,似乎Docker 以Linux为中心,依赖于Linux容器.
现在看来Docker 已经从LXC 切换到runc中的Open Containers Format(OCF)规范的实现.
我的问题是:OCF规范是否意味着Docker不再以Linux为中心?(也就是说它是如何工作的?这是否意味着在OSX上也存在理论上的能力?)
据我所知,runc list允许传递容器存储的根目录。但是我不知道要为 docker 传递什么根目录。我试过了,/var/lib/docker/containers但它说容器不存在。我确实有容器出现在docker ps(仅供参考)中。
或者我假设 docker 仍然使用 runc 来运行容器是错误的吗?
编辑:基于 Niklas 的回答。有没有办法找到 runc 的根目录 - 从 docker 或扫描文件系统?
我想在 Raspbian GNU/Linux 10 (buster)、Linux 4.19.97-v7+ 上构建 runC。
我下载了 go1.15.6 ARMv6 版本,解压到/usr/local并更新了$PATH& $GOPATH。
go version 返回
go version go1.15.6 linux/arm
Run Code Online (Sandbox Code Playgroud)
和 echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/local/go/bin
Run Code Online (Sandbox Code Playgroud)
按照构建 runC的说明,运行sudo make install返回
make: go: command not found
install -D -m0755 runc /usr/local/sbin/runc
Run Code Online (Sandbox Code Playgroud)
为什么找不到 go 二进制文件?
runc ×13
docker ×10
containerd ×4
containers ×2
linux ×2
archlinux ×1
docker-swarm ×1
dockerfile ×1
go ×1
kubernetes ×1
lxc ×1
makefile ×1
minikube ×1
podman ×1
ps ×1
raspberry-pi ×1
windows ×1