Docker:基本映像

我想了解Docker的概念,但有一点我不能理解:

据我了解,图像(因此 – 一个容器)可以从不同的Linux分布,例如Ubuntu,CentOS等实例化。

比方说在主机上运行标准的Ubuntu 14.04,

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

奖金问题:如果开发人员没有在Docker集线器描述中指定它,怎样才能知道用于映像的基础映像?

先谢谢你!

Docker不使用LXC(不是自Docker 0.9以来 ),而是使用libcontainer(现在的runc ),这是一个内置的执行驱动程序,它以一致和可预测的方式操作命名空间,控制组,function,apparmorconfiguration文件,networking接口和防火墙规则,而不依赖于LXC或任何其他用户级包。

Docker镜像代表一组文件,在访问主机内核时,winch将作为一个容器运行在自己的内存,磁盘和用户空间中。
这与虚拟机不同,虚拟机不访问主机内核,但通过虚拟机pipe理程序包含自己的硬件/软件堆栈。
容器只需在主机中设置限制(磁盘,内存,CPU)。 实际的虚拟机必须build立一个完整的新主机。

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

  • 它不依赖主机库(因为它被隔离在自己的磁盘空间中,所以不能访问主机文件, 除非卷被挂载 )
  • 它只执行系统调用:请参阅“ Docker中的共享内核是什么意思? ”

这意味着一个图像可以是任何东西 :另一个Linux发行版,甚至一个可执行文件。 例如,go中的任何可执行文件( https://golang.org/ )都可以在没有任何Linux发行版的情况下打包在自己的Docker镜像中:

 FROM scratch COPY my_go_exe / ENTRYPOINT /my_go_exe 

scratch是“空白”的图像,一个可执行文件是静态链接的,所以它是独立的,只依赖于系统对内核的调用。

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

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

从操作的angular度来看,每次启动都依赖于不同的基础映像,这是另一个依赖关系,您需要监视更新和安全问题。 在发现下一个大漏洞时,标准化一个发行版可以减less您的操作团队的工作量。

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

您可以将它与机器上的虚拟机进行比较,您可以在其中启动另一个Linux发行版,而不必与主机操作系统相同。 因此,如果您的主机操作系统与您的容器的基本映像相同,则无关紧要。

在Docker中,容器是从图层构build的。 Dockerfile中的每个步骤(命令)代表一个层次,它们被一个接一个地应用。 第一步是应用FROM表示的基本操作系统层。

所以要回答你的奖金问题,你可以看看你正在使用的容器(这是DockerHub上的第三个选项卡)的Dockerfile,并在第一个语句中看到,这是基础图像(os)。