有没有办法以分离模式启动Docker容器?

时间:2016-11-08 17:47:32

标签: docker

我是Docker的新手,所以我对下面的概念和术语的使用可能存在缺陷。

我想我理解创建容器(通过docker create)的概念,以及启动如此创建的容器(通过docker start)。我也不太清楚,但仍然有点docker run用于同时创建和运行容器。如果我错了,请纠正我。

除非我错过了某些内容,否则如果我想启动一个容器以使其分离,我唯一的选择就是docker run -d

我不明白的是:假设我已经创建了我的容器,它已经停止了,现在我想开始分离它。我怎么做?或者这是错误的思考方式吗?

通过尝试使用以下命令运行容器两次,我遇到了这个概念上的误解(我确定它是什么):
docker -d --name=fred my/image

我第二次得到:

  

docker:来自守护程序的错误响应:冲突。容器[...]

已在使用名称“/ image”

精细;我现在明白,这会尝试创建两个具有相同名称的容器,这显然不可能发生。但这让我想到了这个概念性的问题:如果我有一个容器,比如停止了,我怎么能以分离模式启动呢?

我告诉过你我是个菜鸟。感谢您提供任何信息。

2 个答案:

答案 0 :(得分:8)

除非您在启动容器时特别附加(-a或-i选项),否则根据定义您将被释放。

创建容器只是构建文件系统层。启动它会运行ENTRYPOINT(或CMD)过程。你推测,Run既可以创建也可以开始。所以你不能“附加”到创建的容器......没有要附加的进程。

这里我创建了一个容器(同样,所有这一切都是创建文件系统层):

[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

它还没有做任何事情。现在启动它没有附加,没有任何东西打印到终端STDOUT,因为我没有附加。但STDOUT将转向日志驱动程序(json-file)

[sysadmin@vmr-132-9 ~]$ docker start test test
[sysadmin@vmr-132-9 ~]$ docker logs test
hello world
hello world
hello world
hello world

答案 1 :(得分:1)

以下是它的工作原理。

以分离模式运行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 start containerid自动以分离模式运行。

希望这有用。

更新: 关于第二次跑步,正如你正确指出的那样,有两种选择并且不在其中:

  1. 您可以使用命令docker run --name=mycontainer image运行它,而不是使用命令docker run --name=mycontainer image启动它,而只需启动您刚试过的现有容器,上面的答案会有所帮助。
  2. 擦除现有容器并重新运行docker rm -f mycontainer 要擦除现有容器,请使用命令 - function handle(e) { if (e.keyCode != 38 && e.keyCode != 39 && e.keyCode != 40 && e.keyCode != 37) return false; }