复制 docker 容器以进行调试

Duplicating docker container for debugging

我有一个 运行 docker 容器。我在 运行 docker 容器中做了一些有用的工作。我完成的这些工作不是 docker 文件的一部分,我是在容器内完成的。[例如:我在容器内安装了 ping,而不是来自 docker 文件]

现在,我卡在了一个地方。我不确定我是否在同一个容器中调试,我可能会丢失到目前为止我在该容器中所做的事情。

所以我想用 运行 容器中所有可用的东西创建它的副本[就像我不想从图像构建容器并重复在中实现的所有成功步骤运行 容器,然后开始我的调试。我不想在我的第二个容器中重新安装 ping。

总而言之,我如何复制一个容器?如果不是,所有的可能性是什么?

如果要保存修改,可以使用docker commit,查看文档http://docs.docker.com/reference/commandline/cli/#commit and you can also save a container, http://docs.docker.com/reference/commandline/cli/#save

  1. 创建基础图像并运行它

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

    yum install ping
    
  3. 提交新名称

    docker commit <hash tag of running container> new_image
    

现在,如果您通过 运行ning

打开 new_image
docker run -it new_image /bin/bash

可以看到里面安装了ping

打开base_image里面没有安装ping

希望它回答了你的问题。

自 docker 实施 1.0.1(服务器/客户端 API 1.12)起,仅支持 pause/resume 操作。

但是就进程快照(在提交 + 推送中)而言,它们不起作用(不支持,虽然我没有检查文档)

总而言之, 1) 无法保存 运行 个进程的状态! 2)可以保存对文件系统(持久存储)所做的所有更改(并且可以提交+推送到存储库)。

目前又坏了

以下仅适用于 2017 年 12 月 20 日左右的版本。 1 月 18 日之后我还没有调查过这个。

docker commit 可以将文件更改保存到新图像中,但它不会保留内存中的更改、打开的进程等。与流行的观点相反,后者在 docker checkpoint 中是可行的. Documentation and example.

注意:现在,--checkpoint-dir 选项已损坏:issue, pull。这就是为什么这里需要像 checkpoint_dir (见代码)这样​​的解决方法。这个答案应该会在几周内更新。

not possible to checkpoint a TTY. This might change soon. However, you can attach a new TTY after the restoring process using exec.

need to have criu installed。之后,首先,

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 中,键入 ps -e,您将看到在 sleeper 容器中启动并现在在 clone 中继续的进程。

checkpoint 制作容器到硬盘驱动器的完整蓝图,可在机器之间交换。此功能原生使用 criu and is experimental. Criu cannot create a blueprint of X11 个应用程序。

pause 另一方面只会在内部冻结容器。除了取消暂停之外,您无法对暂停的容器执行任何操作。

如果您有一个容器my-cont并且您想要对其进行调试,则无需在其中安装调试工具。您可以做的是使用调试映像中的另一个容器,例如xyz_docker_img 然后让它与 my-cont 容器共享相同的命名空间,并具有调试所需的额外功能。

$ docker run -it \
                --pid=container:my-cont 
                --net:container:my-cont
                --cap-add NET_RAW 
                --cap-add NET_ADMIN 
                --cap-add SYS_PTRACE
                xyz_docker_image bash