复制 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
创建基础图像并运行它
docker run -it <base_image> /bin/bash
进行必要的更改
yum install ping
提交新名称
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
我有一个 运行 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
创建基础图像并运行它
docker run -it <base_image> /bin/bash
进行必要的更改
yum install ping
提交新名称
docker commit <hash tag of running container> new_image
现在,如果您通过 运行ning
打开 new_imagedocker 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