Docker:基本图片

时间:2016-07-10 07:05:56

标签: docker

我试图了解Docker的概念,但有一点我无法理解:

据我所知,图像(因此 - 容器)可以从不同的Linux发行版中实例化,例如Ubuntu,CentOS等。

让我们在主机上说我运行标准的Ubuntu 14.04,

  • 如果我使用未从同一分配实例化的容器,会发生什么?
    • 不是14.04?
    • 不是Ubuntu(或任何其他基于Debian的)?
    • 使用不同的图像基本图像有什么缺点? (假设我使用的是使用Ubuntu作为基本图像的图像A,使用Debian作为基本图像的图像B和使用CentOS作为基本图像的图像C)?

额外问题:如果开发人员未在Docker集线器描述中指定图像,如何判断用于图像的基本图像?

提前谢谢!

3 个答案:

答案 0 :(得分:6)

Docker 使用LXC(不是since Docker 0.9)而是使用libcontainer(现在 runc ),这是一个操作命名空间的内置执行驱动程序,控制组,功能,apparmor配置文件,网络接口和防火墙规则 - 所有这些都以一致且可预测的方式进行,并且不依赖于LXC或任何其他用户空间包。

docker镜像表示winch将在访问主机内核时作为自己的内存,磁盘和用户空间中的容器运行的一组文件。
这与VM不同,VM不访问主机内核,但通过其hypervisor包含自己的硬件/软件堆栈。
容器只需在主机中设置限制(磁盘,内存,CPU)。实际的VM必须构建一个全新的主机。

该docker镜像(文件组)可以是任何东西,只要:

这意味着图像可以是任何:另一个Linux发行版,甚至是一个可执行文件。例如,go(https://golang.org/)中的任何可执行编译都可以打包在自己的docker镜像中,而不需要任何Linux发行版:

$( "div img:last-child" )

FROM scratch COPY my_go_exe / ENTRYPOINT /my_go_exe 是“空”图像,go可执行文件是静态链接的,因此它是自包含的,只依赖于对内核的系统调用。

答案 1 :(得分:5)

主机操作系统和docker容器之间共享的主要内容是内核。从不同的发行版/版本运行docker容器的主要风险是它们可能依赖于主机系统上不存在的内核功能,例如,如果容器需要比主机安装的更新的内核。

理论上,Linux内核是向后兼容的。只要主机内核比容器内核更新,它就应该工作。

从操作角度来看,每次开始依赖于不同的基本映像,这是您需要监视更新和安全问题的另一个依赖项。在发现下一个大漏洞时,对一个分发进行标准化可以减少运营团队的工作量。

答案 2 :(得分:1)

Docker使用LXC,这是一种操作系统级虚拟化方法,用于使用单个Linux内核在控制主机上运行多个隔离的Linux系统(容器)。

您可以将其与计算机上的VM进行比较,然后启动另一个Linux发行版,该发行版不必与主机操作系统相同。因此,如果您的主机操作系统与容器的基本映像相同,则无关紧要。

在Docker中,容器是从图层构建的。 Dockerfile中的每个步骤(命令)代表一个层,它们一个接一个地应用。第一步是应用基础OS层,由FROM表示。

因此,要回答您的红利问题,您可以查看您正在使用的容器的Dockerfile(这是DockerHub上的第三个选项卡),并在第一个语句中看到,这是基本图像( OS)。