定义的Linux发行版中的哪些命令在Docker容器中可用?

我是docker的新手,明白linux内核是在主机操作系统和容器之间共享的。 但是我不太了解docker模拟一个特定的linux发行版。 假设我们有一个简单的docker文件,像这样:

FROM ubuntu:16.10 RUN apt-get install nginx 

它会给我一个在Ubuntu 16.10环境中安装nginx的docker容器。 所以我应该可以使用apt-get作为Ubuntu的默认包pipe理器。 但这有多深? 我可以假设那些像lsb_release这样的发行版的典型命令是像安装了Ubuntu 16.10的完整虚拟机一样被模拟的吗?

我的问题背后的原因是,Linux发行版是不同的。 我需要知道哪些命令是可用的,例如,当我运行一个Ubuntu 16.10的容器,就像在上面安装了不同的发行版的主机(如Red Hat,CentOS等)上运行一个容器一样。

Docker中的Ubuntu镜像约为150 MB。 所以我认为并不是所有的工具都包含在真实的安装中。 但是,我怎么知道我可以在哪个地方丢下他们呢?

Docker的基本操作系统映像是故意删除的,而对于Ubuntu,他们将在每个新版本中删除更多的命令。 该图像是专用应用程序运行的基础,您通常不会连接到容器并在其中运行命令,而较小的图像则更易于移动并具有较小的攻击向量。

我知道每个图像版本中都没有命令列表,只有通过构build图像才能知道。 但是当图像被标记时,你可以假设未来的小规模更新不会破坏下游图像 – 这是在Dockerfile中显式指定标签的一个很好的参数。

例如,这个Dockerfile的构build正确:

 FROM ubuntu:trusty RUN ping -c 1 127.0.0.1 

这一个失败:

 FROM ubuntu:xenial RUN ping -c 1 127.0.0.1 

这是因为从xenial版本的映像中删除了ping 。 如果你刚刚使用FROM ubuntu那么当trusty是latest标签时,相同的Dockerfile将会正确构build,然后在被xenialreplace时失败。

一个容器向您展示与非集装箱分销相同的软件环境。 它可能没有(实际上可能没有)默认安装的所有相同的软件包,但是您可以使用适当的软件包pipe理器来安装任何您需要的软件包。 容器中的软件的可用性与在主机上运行的分发无关(不pipe你在CentOS,Fedora,Ubuntu,Arch等下运行Docker,Ubuntu映像都是一样的)。

如果您需要某些命令可用,请确保它们已安装在您的Dockerfile中。

在容器内工作的less数几件事之一是通常没有服务pipe理进程运行(比如init或者systemd或者其他),所以你不能像在主机上一样启动服务,而不需要一点工作。