我是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。所以我认为并不是所有工具都包含在真正的安装中。但是我怎么知道他们在哪里可以抛弃他们在那里。
答案 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
,那么当trusty
为latest
标记时,相同的Dockerfile就会正确构建,然后在被xenial
替换时失败。
答案 1 :(得分:0)
容器为您提供与非容器化分发相同的软件环境。它可能没有(实际上可能没有)默认安装的所有相同的软件包,但您可以使用适当的软件包管理器安装所需的任何软件包。容器中软件的可用性与主机上运行的分发无关(无论你是在CentOS,Fedora,Ubuntu,Arch等下运行Docker,Ubuntu映像都是一样的。)
如果您需要某些命令可用,请确保它们已安装在Dockerfile中。
容器内部不同的少数事情之一是通常没有运行服务管理流程(如init
或systemd
或其他),所以你无法在没有一点工作的情况下以与主机相同的方式启动服务。