Docker容器内的进程是什么样的?


33

我最近听到几次关于Docker容器的困惑,尤其是关于在Docker容器内部调用的命令和进程时内部发生了什么。

有人可以提供最新情况的高层次概述吗?


3
虽然不准确(以及为什么我不打算将其写为答案),但我发现将docker视为花哨的chroot而不是虚拟机更容易。这是不准确的,但是在尝试将其可视化时会有所帮助。
coteyr

2
@coteyr-提到类比很有趣,我在尝试描述Docker在做什么时也使用了这个类比。与chroot相比,IMO Docker与虚拟化有更多的共同点。
slm

Answers:


53

Docker进入虚拟化桶,因为人们认为它以某种方式虚拟化了下面的硬件。这是一个不恰当的说法,主要来自Docker使用的术语,主要是术语容器。

但是,对于虚拟化系统硬件,Docker并没有做任何神奇的事情。而是利用Linux内核围绕关键设施构建“围栏”的能力,这使进程可以与资源(例如网络,文件系统和权限)进行交互,从而给人以您正在交互的错觉具有完整功能的系统。

这是一个示例,说明了启动Docker容器并通过调用进入容器时发生的情况/bin/bash

$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#

现在从这个容器中,如果我们运行ps -eaf

    ss01

切换到另一个终端选项卡,在该选项卡上我们登录到托管Docker容器的主机系统,我们可以看到该容器“实际上”已占用的进程空间:

    ss02

现在,如果我们回到Docker选项卡并在其中启动几个进程并将它们全部作为背景,我们可以看到我们现在有几个子进程在主要Bash进程下运行,该进程最初是作为Docker容器启动的一部分启动的。

注意:该进程是4个sleep 1000正在后台运行的命令。

    ss03

请注意,如何在Docker容器内部为进程分配48-51的进程ID(PID)。ps -eaf在它们的输出中也可以看到它们:

    ss04

但是,在下一张图片中,显示了Docker正在执行的许多“魔术”。

    ss05

看看这四个sleep 1000流程实际上是我们原始Bash流程的子流程吗?还请注意,我们原始的Docker容器/bin/bash实际上也是Docker守护程序的子进程。

现在,如果我们要等1000秒钟以上sleep 1000才能完成原始命令,然后再运行4个新命令,然后像这样启动另一个Docker容器:

$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#

主机的输出ps -eaf如下所示:

    ss06

其他Docker容器都将全部显示为Docker守护程序下的进程。

因此,您会看到,Docker确实不是在虚拟化(传统意义上),它是围绕各种内核资源构建“围墙”,并限制了给定进程+子级对其的可见性。


docker还为每个正在运行的容器创建一个隔离的用户空间。
Bhargav Nanekalva '16

3

容器,您的进程应隔离(隔离)。实际上,除了指定的进程外,您应该看不到任何进程(至少是一个shell)。它不用于“社交性”测试。与chroot的唯一相似之处在于使用了主机内核。如果您需要隔离某些东西或使用与主机上运行的版本不同的平台体系结构软件,则Docker非常有用。(非常旧的Java版本或Python的不同版本)。要特别注意要处理的文件夹和二进制文件可能与主机上的文件夹和二进制文件不同。/ bin文件夹不一样,等等。

编辑:与chroot而不是VM的相似性。


1
编辑后,我正在考虑保留旧的Xen上限。显然,在KVM / Qemu下运行Windows或在VirtualBox下在32位主机上运行64位VM时,情况并非如此。(不要问)。它类似于AWS的pv vs hvm参数。
mckenzm 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.