docker容器如何存储在ram中并执行?

时间:2019-04-18 09:13:05

标签: docker process linux-kernel ram

我想知道Docker容器是如何由操作系统管理的。我可以在这里找到一些解释:https://stackoverflow.com/a/47784145/11377751,但我不太了解。

我了解操作系统的基础知识(有关PCB,ram,CPU,内核,系统调用等的概念)。

但是我不明白操作系统如何管理容器:

  • 容器是进程还是由Docker引擎“模拟”(这是唯一具有线程的进程)?如何在ram中表示一个容器?<​​/ li>
  • 如果在我的容器中启动一个包含“ fork();”的C应用程序,谁来调用内核:容器还是Docker引擎?谁复制pcb?还是“ malloc(..);”?
  • 内核中名称空间的概念是什么?在公羊里?这些表是在定义访问权限还是其他?为什么维基百科会说这个概念对于容器是必不可少的,因为知道在架构中Docker Engine是在容器和内核之间表示的?

图片:

这是我在这里找到的图片:https://stackoverflow.com/a/42111368/11377751


非常感谢

1 个答案:

答案 0 :(得分:3)

前言:这已在Arch Linux上进行了测试

  1. 容器是进程。我们有dockerdcontainerd-每个都只有一次。然后,每个正在运行的容器都有dockercontainerd-shim进程。注意,containerd-shim是容器的父级。目的是:

    • 首先,它允许运行时(即runc)在启动容器后退出。这样,我们不必为容器设置长时间运行的运行时进程。启动mysql时,您应该只会看到mysql进程和填充程序。

    • 第二,在容器和/或docker都死了的情况下,它会为容器保持STDIO和其他fds打开。如果垫片未运行,则管道的父侧或TTY主设备将关闭,容器将退出。

    • 最后,它允许将容器的退出状态报告回给更高级别的工具(如docker),而不必成为容器进程的实际父级并执行wait4。

(摘自https://groups.google.com/forum/#!topic/docker-dev/zaZFlvIx1_k

  1. 请阅读有关系统调用(https://stackoverflow.com/a/32842491/5247040)和码头工人角色(https://stackoverflow.com/a/46650343/5247040)的2个好的答案。另一本不错的https://medium.com/devopslinks/docker-containerd-standalone-runtimes-heres-what-you-should-know-b834ef155426

编辑:快速解答:C应用程序调用{​​{1}}和fork => Linux内核。 我错了,Docker Engine不参与系统调用,所有控制都是通过名称空间/ mallochttps://stackoverflow.com/a/34871045/5247040

进行的
  1. ram中名称空间的表示形式完全不同,您可以检查源代码以了解
  

为什么维基百科说这个概念对于容器是必不可少的

因为“各种容器软件将Linux命名空间与cgroup结合使用来隔离其进程,包括Docker [8]和LXC”(https://en.wikipedia.org/wiki/Linux_namespaces

基本上,名称空间是工具,Docker Engine通过该工具控制容器的资源