如何继续已经退出的Docker容器

400

考虑:

docker run -it centos /bin/bash

我按下了Ctrl+D来退出它。

我想继续运行这个容器,但是发现无法继续。

唯一的方法是

docker commit `docker ps -q -l` my_image
docker run -it my_image /bin/bash

我是对的吗?有更好的方法吗?(我正在使用docker 0.8.0版本。)


2
你尝试过给容器分配一个名称,并使用该名称来控制它吗?顺便问一下,你所说的“退出它”,是指从中分离出来,对吗? - Eric Platon
17
Docker是一个编程工具,至少我是这样使用它的。如果大多数人持不同意见,那么应该有人告诉Docker不要指向StackOverflow作为提问的地方。我相信这并不是第一个可能属于“DevOps”类问题的例子,可以在这里或SuperUser上进行提问。 - Ted M. Young
6
Docker是一种开发者工具,这里已经有一个“docker”标签。因此,我认为在stackoverflow上询问是合适的。我使用它来构建需要在干净环境中构建的映像。 - Daniel YC Lin
6
我希望将此标记为“不相关”的人能够解释原因! - jpetazzo
2
为了支持这个问题不被视为离题:http://meta.stackoverflow.com/q/276579/210336 和 http://meta.stackoverflow.com/q/271279/210336。 - Matthijs Wessels
16个回答

428
您可以在现有容器退出后重新启动它,您所做的更改仍然存在。
docker start  `docker ps -q -l` # restart it in the background
docker attach `docker ps -q -l` # reattach the terminal & stdin

4
运行最近启动的 Docker 容器并附加到它的终端。命令为:docker start `docker ps -q -l` && docker attach `docker ps -q -l` - Daniel YC Lin
11
一句话简述:docker start -i $(docker ps -q -l)。;-) 命名可以帮助更好地控制选择哪个容器。-l 获取最近的一个,好的... - Eric Platon
138
对于那些对Linux新手而言,\docker ps -q -l`是一个扩展。它将被替换为最后创建的(-l) Docker容器的ID。-q仅抑制通常由`docker ps`输出的其他信息(除了ID)。 注:反引号不是引号符号,它有着非常特殊的意义。你在反引号之间输入的所有内容都将在执行主命令之前由shell解析(执行)。 - bnieland
2
我发现容器进入了一个叫做“Created...”状态,无法使用“docker start ...”启动。但是可以使用“docker restart ...”重新启动。 - Voltaire
2
注意:-l 只获取“最新”的 Docker。如果像我一样,docker ps -a 显示需要启动的多个容器,则可以通过将上面的命令更改为 docker start \docker ps -q -a` 来重新启动它们中的“所有”(-a)。-q` 仅使其“安静”(不输出日志)。 - Rock Lee
它是如何知道你想要启动哪个容器的呢? - majorgear

202
docker start -a -i `docker ps -q -l`

说明:

docker start 命令用于启动某个容器(需要指定名称或ID)
-a 参数用于附加到正在运行的容器中
-i 参数用于进入交互式模式
docker ps 命令用于列出所有容器
-q 参数用于仅列出容器ID
-l 参数用于仅列出最近创建的容器


docker ps -q -l,它会给出最后创建的容器ID,即使它处于启动状态。 - Dharmang
所谓的“attach”到容器是什么?这个“attach”? - skytree
@skytree attach 用于将 STDIO(标准输入和输出)附加到您正在启动的容器上。基本上是为了发送按键。 - darth vader
unknown shorthand flag: 'q' in -q - Ooker

71

使用:

docker start $(docker ps -a -q --filter "status=exited")

这将启动所有处于退出状态的容器。

docker exec -it <container-id> /bin/bash

这将连接到特定的容器。


2
我发现这是唯一对我有效的方法,由于那个至关重要的第二行:docker exec -it <container id> /bin/bash(或者只输入bash)。 - barlop
1
这对我有用,但是因为我有两个容器,所以我不得不运行它两次。因此,如果第一个容器启动并且第二个容器出现错误,请再次输入相同的命令,它应该启动下一个容器。 - Andrija Jostergård

56

如果你想用多个容易记忆的命令来完成:

  1. 列出已停止的容器:

docker ps -a

  1. 复制你想要附加到的容器的名称或容器ID,并使用以下命令启动容器:

docker start -i <name/id>

标志 -i 告诉 docker 附加到容器的标准输入。

如果容器没有使用交互式 shell 启动,需要执行以下操作以运行 shell:

docker start <name/id>
docker exec -it <name/id> /bin/sh

/bin/sh 是通常与基于alpine的镜像一起提供的shell。

如果你在上面启动容器时遇到立即退出的问题,可以使用以下命令重新运行并进入交互式shell。这里需要输入镜像名称,而不是容器名称。因为重启没有起作用,唯一的调试方式是删除并再次运行它。你将进入一个shell,在那里你可以尝试运行Dockerfile中的CMD命令以查看其输出或调试为什么容器会立即退出。

docker rm <name/id>
docker run -it --entrypoint /bin/sh <image-name> -s

1
被低估的答案,这个帮助我找到了容器,比这个问题上的“答案”更容易。 - LizardKing
6
守护进程返回错误响应:容器<ID>未运行。 - Cerin
@Cerin,我为您的问题添加了最后一部分(只晚了3年!),在您启动容器后容器立即退出。 - kristianp
这个答案比其他答案更好,因为它详细解释了命令的含义。 - Ooker

20

如果您想要启动一个已知名称的Docker容器,请执行以下操作:

docker start  `docker ps -a -q --filter "name=elas"`

1
感谢@Nelson,这对我开始使用特定的Docker非常有帮助。 - SACHIN CHAVAN
在这种情况下,您只需运行 docker start <name>,其中<name>是您的容器名称。至少使用docker v19.03.8。 - Don Foumare

17

按照以下步骤操作:

  1. 运行以下命令,查看所有正在运行和已停止的容器服务。使用选项-a可查看容器的停止情况。

    docker ps -a
    
    然后通过container_id或容器标签名称启动Docker容器。
    docker start <CONTAINER_ID> or <NAMES>
    

    enter image description here

    从上面的图片中可以看到,容器 ID 为 4b161b302337。因此要运行的命令是:

    docker start 4b161b302337
    
  2. 可以使用以下命令验证容器是否正在运行:

    docker ps
    

13

如果您有一个命名的容器,那么可以通过运行以下命令来启动它

docker container start container_name

其中container_name是在创建容器时必须提供的容器名称。如果未命名容器,则可以将container_name替换为容器ID。可以通过运行以下命令来查找容器ID:

docker ps -a

9

这些命令适用于任何容器(不仅限于最近退出的容器)。

即使您的系统重启后,这种方法也可以使用。

为此,这些命令将使用“容器ID”。

步骤:

  1. 通过使用以下命令列出所有容器,并记下要重新启动的容器的容器ID: docker ps -a

  2. 使用容器ID启动容器: docker start <container_id>

  3. 附加并运行容器: docker attach <container_id>

注意:仅适用于Linux


3

如果您只想启动状态为“Exited”的容器,只需键入:

sudo docker start container_name

不需要sudo。 查看更多

docker start container_name

如果容器名称无法使用,请将名称替换为容器ID。

3
按名称排序
sudo docker start bob_the_container

或通过Id

sudo docker start aa3f365f0f4e

此命令可重启已停止的容器,使用“-i”选项来附加容器的标准输入(STDIN), 或者您可以附加到容器会话(如果运行时使用了“-it”而不是“-i”选项)。

sudo docker attach bob_the_container

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接