复制docker容器进行debugging

我有一个正在运行的docker集装箱。 我在运行的docker容器中做了一些有用的工作。 我已经完成了这些作品不是docker文件的一部分,我已经在容器内完成了它。[例如:我已经在容器中安装了ping,而不是从docker文件]

现在,我被困在一个地方。 我不确定我是否在同一个容器中进行debugging,我可能会放弃在容器内部迄今为止所做的事情。

所以我想创build一个与运行容器中可用的所有东西的复制副本[就像我不想从图像构build一个容器,并重复运行的容器中实现的所有suucessful步骤,然后开始我的debugging。 我不想在我的第二个容器重新安装ping]。

完全,我怎样才能复制一个容器? 如果不是什么都有可能性?

  1. 创build一个基本的图像,并运行它

    docker run -it <base_image> /bin/bash 
  2. 进行必要的更改

     yum install ping 
  3. 提交一个新的名字

     docker commit <hash tag of running container> new_image 

现在,如果你通过运行打开new_image

 docker run -it new_image /bin/bash 

你可以看到ping被安装在里面。

打开base_image并且没有安装ping

希望它回答你的问题。

如果你想保存你的修改,你可以使用docker commit ,请参阅文档http://docs.docker.com/reference/commandline/cli/#commit ,你也可以保存一个容器, http://docs.docker的.com /参考/命令行/ CLI /#节省

从docker执行1.0.1(服务器/客户端API 1.12),只支持暂停/恢复操作。

但就进程的快照(在提交+推)而言,这些不起作用(不支持,虽然我没有检查文档)

总之,1)保持运行过程的状态是不可能的! 2)对文件系统(永久存储)所做的所有更改都可以保存(并可以提交并推送到存储库)。

docker commit对于将文件更改保存到一个新的映像中是很好的,但是它不会保存内存的变化,打开进程等。与stream行的观点相反,后者对于docker checkpoint是可行的。 文档和示例 。

注意:现在,– --checkpoint-dir选项被破坏: issue , pull 。 这就是为什么像checkpoint_dir (见代码)这样​​的解决方法是必要的。 这个答案应该可能在几个星期内更新。

检查点是不可能的 。 这可能会很快改变 。 但是,可以使用exec在恢复过程之后附加新的TTY。

你需要安装criu 。 之后,首先,

 echo "{\"experimental\": true}" >> /etc/docker/daemon.json systemctl restart docker 

, 然后

 #!/bin/bash # tty (-t) not supported docker run -i -d --name sleeper\ busybox sh -c 'sleep 10000' # Makes a snapshot and stops the container (except if --leave-running is active). --checkpoint-dir is broken. docker checkpoint create sleeper cp # sleeper container exited # Create the clone docker create -i --rm --name clone\ busybox # Start the clone checkpoint_dir="/var/lib/docker/containers/$(docker ps -aq --no-trunc -f name=sleeper)/checkpoints" docker start --checkpoint-dir=$checkpoint_dir --checkpoint=cp clone # Attach new TTY docker exec -it clone sh 

现在在tty中inputps -e ,你会看到在sleeper容器中启动的进程,现在继续进行clone

checkpoint把硬盘的容器制作成一个完整的蓝图,可以在机器之间进行交换。 此function使用criu并且是实验性的。 Criu本身不能创buildX11应用程序的蓝图 。

另一方面pause只在内部冻结容器。 暂停的容器除了暂停以外,没有任何可以做的事情。