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

时间:2016-10-25 12:02:31

标签: linux ubuntu docker dockerfile

我是docker的新手,并且了解linux内核是在host-os和容器之间共享的。但我真的不明白docker如何模拟特定的linux发行版。假设我们有一个简单的docker文件:

FROM ubuntu:16.10
RUN apt-get install nginx

它将为我提供一个在Ubuntu 16.10环境中安装了nginx的docker容器。所以我应该能够使用apt-get作为Ubuntu的默认包管理器。但这有多深?我是否可以假设像lsb_release这样的分发的典型命令是在安装了Ubuntu 16.10的完整虚拟机中模拟的?

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

Docker中的Ubuntu映像大约为150 MB。所以我认为并不是所有工具都包含在真正的安装中。但是我怎么知道他们在哪里可以抛弃他们在那里。

2 个答案:

答案 0 :(得分:1)

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

我所知道的每个图像版本中都没有命令列表,您只能通过构建图像来了解这些命令。但是,当图像被标记时,您可以假设未来的次要更新不会破坏下游图像 - 这是在Dockerfile中显式指定标记的一个很好的参数。

例如,这个Dockerfile正确构建:

FROM ubuntu:trusty
RUN ping -c 1 127.0.0.1 

这个失败了:

FROM ubuntu:xenial
RUN ping -c 1 127.0.0.1

这是因为ping已从xenial版本的图片中移除。如果您刚刚使用FROM ubuntu,那么当trustylatest标记时,相同的Dockerfile就会正确构建,然后在被xenial替换时失败。

答案 1 :(得分:0)

容器为您提供与非容器化分发相同的软件环境。它可能没有(实际上可能没有)默认安装的所有相同的软件包,但您可以使用适当的软件包管理器安装所需的任何软件包。容器中软件的可用性与主机上运行的分发无关(无论你是在CentOS,Fedora,Ubuntu,Arch等下运行Docker,Ubuntu映像都是一样的。)

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

容器内部不同的少数事情之一是通常没有运行服务管理流程(如initsystemd或其他),所以你无法在没有一点工作的情况下以与主机相同的方式启动服务。