【问题标题】:Which commands of the defined Linux Distribution are available in a Docker container?Docker 容器中提供了定义的 Linux 发行版的哪些命令?
【发布时间】:2017-03-07 11:20:28
【问题描述】:

我是 docker 新手,知道 linux 内核在主机操作系统和容器之间共享。但我真的不明白 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 的完整 VM 中一样被模拟吗?

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

Docker 中的 Ubuntu 映像大约为 150 MB。所以我认为没有像实际安装中那样包含所有工具。但是我怎么知道我可以放弃他们在那里。

【问题讨论】:

  • 尝试用docker run --name myubuntu sleep infinity 启动一个,然后docker exec -it myubuntu lsb_release,如果你得到一个Ubuntu版本,这意味着它可以工作

标签: linux ubuntu docker dockerfile


【解决方案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 替换时会失败。

【讨论】:

    【解决方案2】:

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

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

    在容器内不同工作的少数事情之一是通常没有运行服务管理进程(如initsystemd 或其他),因此您无法启动服务同样的方式你可以在主机上不做一点工作。

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 2020-06-24
      • 2013-10-10
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多