题 如何在Docker容器中运行完整的操作系统,而无需指定命令?


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

docker run someImageName /bin/somebinary

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

我只想运行一个图像,而不指定任何二进制文件来运行。代替, 我只想运行通常在映像OS中运行的服务(例如,systemd / sysvinit)

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

2014/02/05 14:49:19 Error: create: No command specified

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


24
2018-02-05 14:51




这是这个问题的副本 stackoverflow.com/questions/19332662/... - Fred the Magic Wonder Dog
@FredtheMagicWonderDog不完全,虽然答案是一样的。 - mikemaccana


答案:


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

https://stackoverflow.com/questions/19332662/start-full-container-in-docker

容器可以是完整的操作系统,它们不一定是(也不是虚拟机,配置和管理更复杂)。

我想说Docker的全部意义在于简化应用程序容器,因此您只需要配置应用程序,而不是整个操作系统。


24
2018-02-05 15:15



谢谢。用/ sbin / init启动映像后,我运行了 docker ps -notrunc,然后获取容器ID sudo /usr/sbin/lxc-attach -n containerID 进入正在运行的图像。正如另一张海报所提到的,我真的不需要第二个init,所以接下来我会查看单命令容器...... - mikemaccana
说你不需要在VM中运行一个完整的操作系统,就像说你不需要在物理机器上运行一个完整的操作系统,是的,内核基本上只是一个普通的x86 / C没有stdlib运行的程序,所以做init,但它是 - Lie Ryan


Docker是一个用于管理和部署的系统 应用 容器,不是 操作系统 容器。看起来好像在混淆运行docker容器和启动操作系统。

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

如果您只是在寻找如何指定默认值 CMD 和 ENTRYPOINT 对于你的容器,你可以做到这一点 建立时间 使用Dockerfile。


10
2018-02-05 14:53



我知道Docker是什么。我将指出应用程序容器基于操作系统,例如Fedora或Ubuntu。 Unix上的持久应用程序 - 甚至只有用户空间 - 像Docker容器这样的Unix - 都是从initscripts或systemd单元文件启动的。例如,如果我的应用程序崩溃,我希望它自动重启,具有阈值 - 就像systemd提供的那样。 - mikemaccana
你试图在你的容器中塞满太多东西 - 它们不是一个操作系统。应在每个容器外处理过程监督。 - EEAA
所以,如果一个过程死了......只需重新启动整个容器?我想这不是那么贵,所以可能没关系。它有点奇怪 - 我的容器有一个/ sbin / init,但它永远不会被使用...... - mikemaccana
是的,这就是主意。你的容器有一个 /sbin/init,但事实并非如此 不得不 有它。您可能使用了默认的ubuntu容器或类似的东西。有一个 批量 这些容器中的碎片可以根据需要移除。 - EEAA
@ValkoSipuli你当然可以自由地持有这种观点。我仍然坚持认为在容器内运行多个进程会抵消首先使用容器的大部分原因。是否有在容器内运行操作系统的地方?大概。但这是一个例外,不应该在没有考虑利弊的情况下进行。 - EEAA


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

FROM fedora:25

CMD /sbin/init

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

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

容器内的完整系统服务。美丽。


3
2018-02-16 21:58