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

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

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

docker run someImageName /bin/somebinary

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

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

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

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

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

答案1

正如这里所记录的,您/sbin/init只需像任何其他从单用户模式启动到多用户模式的 unix 一样运行命令即可。

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

容器可以是功能齐全的操作系统,但不一定非要这样(虚拟机也不是,只是配置和管理起来更复杂)。

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

答案2

Docker 是一个用于管理和部署的系统应用容器,而不是操作系统容器。看起来你好像把运行 Docker 容器与启动操作系统混为一谈了。

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

如果你只是想知道如何为你的容器指定默认值CMDENTRYPOINT你可以在构建时使用 Dockerfile。

答案3

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

FROM fedora:25

CMD /sbin/init

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

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

容器内有完整的 systemd 服务。非常棒。

答案4

docker pull ubuntu

只需从同一图像运行多次即可。将创建新容器,然后可以启动和停止每个容器,每个容器都保存自己的配置。为了方便起见,最好使用“--name”为每个容器命名。

Fi:

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

就是这样。

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

此后,您的容器就永久创建了,您可以像虚拟机一样启动和停止它们。

docker start MyContainer1

进入容器并做你想做的事:

docker exec -it MyContainer1 bash

相关内容