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


25

我正在关注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容器并运行完整的操作系统,而不是指定命令



@FredtheMagicWonderDog尽管答案是相同的,但还不完全是。
mikemaccana 2014年

Answers:


24

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

/programming/19332662/start-full-container-in-docker

容器可以是完全成熟的OS,而不必是这样(VM也不需要,配置和管理起来更复杂)。

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


谢谢。使用/ sbin / init启动映像后,我运行docker ps -notrunc来获取容器ID,然后sudo /usr/sbin/lxc-attach -n containerID进入运行的映像。正如其他海报所提到的,我真的不需要第二次初始化,因此接下来我将检查单命令容器...
mikemaccana 2014年

说您不需要在虚拟机中运行完整的操作系统就像说您不需要在物理机上运行完整的操作系统,是的,的确,内核基本上只是一个普通的x86 / C无需stdlib即可运行的程序,init也是如此,但这是
Lie Ryan

11

Docker是一个用于管理和部署应用程序容器而不是操作系统容器的系统。似乎您正在将运行Docker容器与引导操作系统进行合并。

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

如果您只是在寻找如何指定默认值CMDENTRYPOINT容器的方法,则可以在构建时使用Dockerfile来实现。


5
我知道Docker是什么。我将指出应用程序容器基于操作系统,例如Fedora或Ubuntu。Unix上的持久性应用程序-甚至仅用户空间的Unix之类的Docker容器-都是从初始化脚本或systemd单元文件启动的。例如,如果我的应用程序崩溃了,我希望它以阈值自动重启,就像systemd提供的那样。
mikemaccana 2014年

5
您试图将太多内容塞入容器中-它们不是操作系统。过程监督应在每个容器之外进行。
EEAA 2014年

1
因此,如果某个进程死了……只是重新启动整个容器?我想那还不算贵,所以可能还可以。有点奇怪-我的容器有一个/ sbin / init,但从未使用过……
mikemaccana

1
是的,就是这个主意。您的容器具有/sbin/init,但不一定必须具有。您可能使用了默认的ubuntu容器或类似的东西。如果需要,可以删除这些容器中的很多位。
EEAA 2014年

1
@ValkoSipuli您当然可以发表自己的意见。我仍然坚持认为,在容器中运行多个进程可以消除大多数使用容器的原因。在容器内是否有运行操作系统的地方?大概。不过,这是一个例外,如果不对优点/缺点进行太多的讨论,就不应这样做。
EEAA

5

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

FROM fedora:25

CMD /sbin/init

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

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

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


0
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.