这两者如何比较?据我所知,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上运行。Runc
Linux 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