Docker 混乱

Docker confusion

我对 docker 非常感兴趣并且我已经阅读过它,但我对容器有点困惑。例如,当我们从 docker hub 中拉取官方 nginx 时,它只是应用程序还是操作系统自带的 nginx?在我看来,所有容器都带有操作系统,因为使用 docker exec -it app-name bash 我可以输入并进行更新或安装软件包。这部分让我感到困惑,因为我认为它只是应用程序,没有别的。

谢谢, sfm1977

取决于。大多数软件需要操作系统的某些部分 运行(可以是一些库或实用程序);在这些情况下,使用 "base" 操作系统(DebianAlpine 用于官方图像),因此应用程序可以 运行。尽管您可以 docker exec 进入这样的容器并启动 bash/shell 会话,但这应该仅用于调试;一般来说,容器 (nginx) 应该被视为 application nginx,而不是 "virtual machine with nginx installed".

一些软件是静态链接的,不需要安装额外的东西。例如,hello-world or the traefik 图像 没有 使用操作系统作为基础,并且只包含一个二进制文件,没有别的。

这取决于你怎么称呼"OS"。您的意思是 kernel spaceuser space - 答案是否定的。容器仅更改用户 space。

Docker 像 chroot 或 lxc 一样工作,它使用来自主机的单个 Linux 内核和容器中的 binaries/libraries/etc 到 运行,简而言之,容器是独立的名称spaces 在单机上。
因此,"OS" 永远不会改变容器的情况,但 "environmnet" 会改变(libc,shell,所有这些东西)。
另外,查看这篇关于 cgroup 的 wiki 文章。
PS:当然,当您不在 Linux 上时,您需要使用 Linux 安装 VM 才能使用 Docker。但这是另一个问题。