如何在不指定命令的情况下在 Docker 容器中运行完整的操作系统?

mik*_*ana 29 docker

我正在关注CoreOS Docker 文档,它提到使用以下命令启动容器:

docker run someImageName /bin/somebinary
Run Code Online (Sandbox Code Playgroud)

哪里someImageName有图。当 /bin/somebinary 退出时,图像将不再运行。

我只想运行一个图像,而不指定任何要运行的二进制文件。相反,我只想运行通常在图像操作系统内部运行的服务(例如,systemd/sysvinit)

这似乎是任何人都想用 Docker 做的最常见的事情,但是尝试在没有命令的情况下运行镜像会返回:

2014/02/05 14:49:19 Error: create: No command specified
Run Code Online (Sandbox Code Playgroud)

如何启动 Docker 容器并运行完整的操作系统,而不是指定命令

Fre*_*Dog 26

如此处所述,您只需/sbin/init像从单用户模式到多用户模式的任何其他 unix 引导一样,作为命令运行即可。

/sf/ask/1353286371/

容器可以是成熟的操作系统,它们只是不必如此(VM 也不是,只是配置和管理更复杂)。

我想说 Docker 的全部意义在于使应用程序容器变得简单,这样您只需配置一个应用程序,而不是整个操作系统。

  • 说你不需要在虚拟机中运行完整的操作系统就像说你不需要在物理机中运行完整的操作系统一样,是的,内核基本上只是一个常规的 x86/C程序在没有 stdlib 的情况下运行,init 也是如此,但它是 (2认同)

EEA*_*EAA 12

Docker 是用于管理和部署应用程序容器的系统,而不是操作系统容器。似乎您将运行 docker 容器与启动操作系统混为一谈。

您的 Docker 容器应该是单一用途、范围非常窄的应用程序,可以使用单个命令启动。如果您正在寻找比这更复杂的东西,那么 Docker 不是您正在寻找的解决方案。在这种情况下,请查看 KVM、ESXi、OpenVZ、LXD等。

如果你只是找你如何指定一个默认CMD,并ENTRYPOINT为您的容器,你可以这样做,在编译时使用Dockerfile。

  • 我知道 Docker 是什么。我将指出应用程序容器基于操作系统,例如 Fedora 或 Ubuntu。Unix 上的持久性应用程序——甚至是像 Docker 容器这样的仅限用户空间的 Unix——都是从 initscripts 或 systemd 单元文件启动的。例如,如果我的应用程序崩溃,我希望它自动重新启动,并有一个阈值 - 就像 systemd 提供的那样。 (6认同)
  • 您试图在容器中塞入过多内容 - 它们不是操作系统。过程监督应在每个容器之外进行。 (5认同)
  • @EEAA 答案应尽量基于事实,而不是意见。因此,如果您同意应用程序和操作系统容器都是合理的选择(取决于用例),那么答案应该侧重于以友好的方式帮助原始发布者,而不是试图将它们转向其他方向。每个容器的 Docker 单个应用程序感觉就像货物崇拜。 (2认同)

Mar*_*ler 6

要在容器中运行完整的操作系统,请创建以下 Dockerfile:

FROM fedora:25

CMD /sbin/init
Run Code Online (Sandbox Code Playgroud)

然后构建并启动容器并在其中输入一个 shell 以探索其中运行的服务:

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash
Run Code Online (Sandbox Code Playgroud)

容器内的完整 systemd 服务。美丽的。