有没有办法在分离模式下启动Docker容器?
我是Docker新手,所以我对下面的概念和术语的使用可能是有缺陷的。
我想我理解创build一个容器的概念(通过docker create
),并启动一个如此创build的容器(通过docker start
)。 我也不太清楚,但仍然有点用docker run
来同时创build和运行一个容器。 如果我错了,请纠正我。
除非我错过了一些东西,如果我想启动一个容器以便将它分离,我唯一的select是docker run -d
。
我不明白的是:假设我已经创build了我的容器,并且已经停止了,现在我想开始分离它。 我怎么做? 或者那是错误的想法呢?
我遇到了这个概念误解(我敢肯定这就是它是什么)试图运行容器两次使用下面的命令:
docker -d --name=fred my/image
我第二次得到:
docker:来自守护进程的错误响应:Conflict。 名称“/ image”已被容器使用[…]
精细; 我现在明白,这个试图创build两个相同名称的容器,这显然是不可能发生的。 但是这导致了我这个概念上的问题:如果我有一个容器停止了,我怎样才能在分离模式下启动它?
我告诉过你我是菜鸟 感谢您的任何信息。
除非您在启动容器时特别附加(-a或-i选项),根据定义,您将被分解。
创build容器只需构build文件系统层。 启动它将运行入口点(或CMD)进程。 如你所猜测的那样,跑步既是创造又是开始。 所以你不能“附加”到一个创build的容器上……没有附加的过程。
在这里我创build一个容器(同样,所有这些都是创build文件系统层):
[sysadmin@vmr-132-9 ~]$ docker create --name=test centos:latest /bin/sh -c "while true; do echo hello world; sleep 1; done"
看见?
sysadmin@vmr-132-9 ~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9d5bf75a8077 centos:latest "/bin/sh -c 'while tr" 15 seconds ago Created test
它还没有做任何事情。 现在开始它没有附加,没有什么打印到terminalSTDOUT,因为我没有附加。 但是STDOUT是去日志驱动程序(json文件)
[sysadmin@vmr-132-9 ~]$ docker start test test [sysadmin@vmr-132-9 ~]$ docker logs test hello world hello world hello world hello world
下面是它的工作原理。
运行Docker容器busybox
,分离模式和容器名称的小型Linux映像是testso
bash $ docker run -itd --name testso busybox b60d0847bb81065d5f5d4b3a3acff3102d03e7a8a084c0770da4487427787479
你可以看到容器运行
bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b60d0847bb81 busybox "sh" 7 seconds ago Up 2 seconds testso
现在停止上述容器testso
并检查没有容器正在运行。
bash $ docker stop testso testso bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
现在, 你先前提出的问题停止了容器的testso
并看到容器在后台运行。
bash $ docker start testso testso bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b60d0847bb81 busybox "sh" 46 seconds ago Up 2 seconds testso
所以,当容器是docker run
时候先用-d
选项docker run
,container就可以用docker start containerid
自动运行在分离模式下。
希望这是有帮助的。
更新:关于第二次跑步,正如您指出有两个选项,并从中:
- 而不是使用命令
docker run --name=mycontainer image
运行它,您可能只是启动现有的容器,您只是尝试和上面的答案帮助。 - 擦掉现有容器并重新运行
docker run --name=mycontainer image
。
要擦除现有容器,请使用命令 –docker rm -f mycontainer