有没有办法在分离模式下启动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自动运行在分离模式下。

希望这是有帮助的。

更新:关于第二次跑步,正如您指出有两个选项,并从中:

  1. 而不是使用命令docker run --name=mycontainer image运行它,您可能只是启动现有的容器,您只是尝试和上面的答案帮助。
  2. 擦掉现有容器并重新运行docker run --name=mycontainer image
    要擦除现有容器,请使用命令 – docker rm -f mycontainer