我能暂停并且重新启动一个 Docker 容器吗?

47
我想暂停一个Docker容器,并在稍后恢复。如何做到这一点?通过暂停,我指的是它应该保存正在进行的进程(例如视频编码)的状态,然后可以随时恢复。
5个回答

60

版本0.12.0开始,Docker支持使用cgroup freezer的PAUSEUNPAUSE命令来暂停和恢复容器。


3
当你冻结一个容器时,它是否意味着它不能再接受任何请求?当你向其发送请求时会发生什么?请求会排队吗?被丢弃了吗? - CMCDragonkai
2
@David Gageot:有没有可能克隆已暂停的 Docker 容器? - noisy
1
@noisy 据我所知没有。最接近的解决方案是使用 CRIU http://criu.org/Docker - David Gageot
似乎这个功能只适用于 Hyper-V 容器,而不是 Windows 容器。守护进程的错误响应:无法暂停容器 f8c3.........: Windows:容器无法被暂停 - user189198

7
据我所知,目前纯docker无法实现此操作,但lxc支持。我已经尝试过docker,并确认可以使用以下命令来实现: lxc-freeze -n <containtr.id> 要恢复操作,使用以下命令: lxc-unfreeze -n <container.id> 但在v0.2.0版本中,即使使用-notrunc参数,docker ps仅提供简短的容器ID,而且我的系统上lxc-ls输出为空(奇怪,需要进一步了解,因为docker使用普通的lxc-start和参数,所以lxc-ps应该会显示)。我使用lxc-ps找到了完整的容器ID。添加docker freeze命令会很不错。也许是时候学习一些go语言了 :)

1
你可以使用 docker inspect $container 命令获取容器的长ID。 - ZeissS
1
当使用 -notrunc 时,我添加了完整的容器 ID,该更改已经在 Docker Git 主分支中。但还是谢谢你的提示。 - odk
我发现从0.9版本开始,LXC不再是Docker的默认驱动程序(https://blog.docker.com/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/)。但是仍然有可能使用LXC。为此,您需要杀死Docker守护进程,并使用开关“docker -d -e lxc”重新运行它。 - noisy

6
命令如下:
$ docker pause <containerName>
$ docker unpause <containerName>

这是它们的演示: enter image description here

3
这是一个关于最近实验性整合Checkpoint/Restore In Userspace (CRIU) + Docker的卡组

1
Docker 刚刚发布了一个(尚未)未记录的卷和数据存储功能集。如果您使用 -v 命令行选项,您可以指定一个路径来映射到容器外部的特殊 Docker 路径(/var/lib/docker/volumes/{FULL_ID}),FULL_ID 可以通过 docker inspect container_id 找到。例如,docker run -d -v /data danielvf/myapp:1.0 runapp 会将 /data 目录外部化为 Docker 卷。

https://github.com/dotcloud/docker/issues/111

这个功能的路线图如下(尚未记录其存在):https://github.com/dotcloud/docker/wiki/Volumes-&-persistent-data-storage

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