如何重新启动已停止的Docker容器

151

我使用以下命令从一个镜像启动Docker容器:

$ docker run -d myimage /bin/bash -c "mycommand"

"mycommand"完成时,容器会停止(我假设它已经停止),但它不会被删除,因为我可以使用这个命令看到它:

"mycommand"完成时,容器会停止(我猜测已经停止),但不会被删除,因为我可以用此命令看到它:

$ docker ps -a

有没有办法使用相同的参数重新启动这个容器,并保留由mycommand生成的数据?


“卷”或“挂载主机目录”是否满足您的需求?就像文档中所提到的:https://docs.docker.com/engine/tutorials/dockervolumes/ - Haoming Zhang
6个回答

202

是的,当初始命令执行完成后容器将停止。

您可以使用以下命令启动已停止的容器:

docker start container_name

如果要查看命令的输出,则应添加-ai选项:

docker start -ai container_name

注意,有一个docker restart container_name命令,但该命令用于重新启动正在运行的容器——我认为这不是您的情况。


1
我的容器每次启动后立即停止。不确定其目的所在。使用 -ai 命令会返回以下响应:无法打开要求文件:[Errno 2] 没有这样的文件或目录:"requirements.txt"。 - geoidesic
@geoidesic,您能否提供更多细节?您所说的'requirements.txt'文件是什么类型的? - lmtx
1
为了解决这个问题,我将入口点更改为简单地运行sleep 900命令,这使我能够连接到容器并使用docker exec -it container_name bash在其中运行命令。当我从容器内部运行该命令时,我可以看到为什么我的脚本的初始实现失败了,并进行了修复。 - PatS
@PatS,您能否分享一下如何将“start”和“sleep”组合起来?我无法达到可以运行“exec”的点。 - 3pitt

26

首先,$ docker ps -a 显示所有容器(正在运行的和停止的),这就是你没有看到已停止的容器列出的原因。

其次,你可以轻松地启动一个停止的容器:

$ docker start container_name

容器启动后,您可以通过以下方式运行命令:

$ docker exec -it container_name bash -c "mycommand"

只要容器存在,您在容器中创建的内容将保留在容器内。如果您想即使删除容器也保留数据,则可以使用


6

它应该是

$ docker restart container_id # OR
$ docker restart container_name

被接受的答案指出,restart 是用于已经运行的容器。 - 3pitt

3

enter image description here

从上面的图片中,我们可以看到一个容器正在运行,而另一个状态是Exited。
当一个容器退出时,我们仍然可以重新启动它,因为容器停止并不意味着它像死了一样,或者不能再次使用。我们可以很容易地在将来的某个时间停止和启动容器。要启动容器备份,我们可以获取其ID,然后执行docker start命令并粘贴ID即可。
在上面的图片中,退出容器的命令如下:
sudo docker start -a bba606a95392
输出:

enter image description here

顺便说一下:在重新启动容器时,我们无法替换默认命令,因为一旦使用默认命令启动容器,该命令就会设置为容器的默认命令。例如,如果我们启动容器并覆盖默认命令,让我们看看会发生什么:

enter image description here

Docker认为我们正在尝试同时启动和附加多个容器。 因此,当我们启动一个容器并让它退出时,我们可以重新启动它,这将重新发出容器第一次创建时使用的默认命令。这是Docker容器生命周期的一部分。

0

很遗憾,如果您重新启动虚拟机/系统并且它显示

mysql-tls:5.7       "docker-entrypoint.s…"   18 hours ago   Exited (255) 44 seconds ago

答案:

启动容器

docker start mysql

或者

docker start 你的容器名称


0

暂停/重新启动Docker中已暂停的容器

版本23

1. 获取容器ID

docker container ls

从输出中复制容器 ID

CONTAINER ID   IMAGE                        COMMAND             CREATED             STATUS         PORTS                    NAMES
aeb64b607336   dbeaver/cloudbeaver:latest   "./run-server.sh"   About an hour ago   Up 2 minutes   0.0.0.0:8080->8978/tcp   cloudbeaver

2. 暂停容器

docker container pause container_id

3. 重新启动已暂停的容器

docker container unpause container_id

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