如果Docker没有封装操作系统,Docker Ubuntu Image里面是什么?

我正在使用Docker启动一个新的Django项目。 我对许多教程中提到的Ubuntu Docker镜像的存在感到困惑,也是Docker Repo中最受欢迎的镜像之一。

我以为Docker是一个build立在操作系统顶端的容器化系统,那为什么还会有一个Ubuntu Docker Image呢? 也许关于何时/谁使用这个常见的使用情况将有所帮助。

使用Linux发行版通常会得到:

  • 加载内核的引导程序
  • pipe理系统并加载init系统的内核
  • 一个init系统,设置和运行其他的一切
  • 其他一切

Docker本身取代了大部分的init系统。
Docker镜像取代了“其他”,它仍然是普通发行版的一大部分。

Ubuntu镜像包含最less的Ubuntu二进制文件集和共享库,使用Ubuntu构build工具编译来运行一个shell,执行一些正常的linuxy操作并使用apt软件包pipe理器。

Centos映像与Centos二进制文件,共享库和yum包pipe理器完全相同。 等等

Docker镜像不需要是完整的分布。 你可以在一个容器中运行一个静态编译的二进制文件 ,你只需要在图像中的二进制文件,没有别的。

busybox图像是从单个静态二进制文件构build基本正常的Linux环境的一个很好的例子。

内核

所有容器共享一个主机内核。 使用内核cgroups和命名空间将容器与系统的其余部分分离。 对于在容器中运行的任何东西,这似乎是它自己的系统。

所有types的Linux都不使用完全相同的内核,但是内核接口在很大程度上是兼容的 ,这就允许Docker镜像的可移植性。 Docker本身需要3.10+内核才能运行,这就缩小了内核可能性的范围。

有可能有一些深奥的软件需要一些深奥的内核function编译,不会运行不同的Docker主机。 这是非常罕见的,很容易识别,因为你必须编译一个内核才能使上述软件正常工作。

相反,Docker实际上只是一个类固醇的过程。

那么问题是:“哪个”过程。 让每个不同的Ubuntu版本都有Docker容器,例如,可以使用每个版本附带的不同Django版本进行testing。

使用Ubuntu图像的插图我在这里和bash --version

 $ docker run --rm -ti ubuntu:trusty bash --version | head -1 GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) $ docker run --rm -ti ubuntu:vivid bash --version | head -1 GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu) $ docker run --rm -ti ubuntu:wily bash --version | head -1 GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu) $ docker run --rm -ti ubuntu:xenial bash --version | head -1 GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu) $ 

您可以从头创build自己的图像。 从字面上你的Dockerfile将会像这样开始

 FROM: scratch ... 

但是运行程序所需的所有东西都需要添加到图像中。 这就是为什么从一个轻量级的基本Linux映像开始,比如Alpine (非常小的只有5MB)或Debian / Ubuntu (126MB),已经有你的应用程序所需的基本工具/服务。 你想尽量保持你最后的形象小。