探索Docker容器的文件系统
我已经注意到Docker需要了解容器内发生了什么,或者存在哪些文件。 一个例子是从码头索引下载图像 - 你不知道图像包含什么,所以不可能启动应用程序。
什么是理想的是能够哄骗他们或等同。 有没有一种工具可以做到这一点,或者是我认为我应该可以做到这一点的码头工人的概念化错误。
方法1:快照
您可以通过这种方式评估容器文件系统:
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash
这样,您就可以在精确的时刻评估正在运行的容器的文件系统。 容器仍在运行,不会包含未来的更改。
您可以稍后使用(正在运行的容器的文件系统不受影响!)删除快照:
docker rmi mysnapshot
方法2:ssh
如果您需要连续访问,则可以将sshd安装到您的容器并运行sshd守护进程:
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
这样,你可以使用ssh运行你的应用程序(连接并执行你想要的)。
更新 - 方法3:nsenter
使用nsenter
,请参阅http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/
简短版本是:使用nsenter,即使该容器不运行SSH或任何种类的专用守护进程,也可以将shell放入现有容器中
更新 - 方法4:码头执行
Docker版本1.3(最新,您可能需要使用docker apt repo来安装截至2014年11月的最新版本)支持与nsenter
类似的新命令exec
。 该命令可以在已经运行的容器中运行新进程(容器必须已经运行PID 1进程)。 您可以运行/bin/bash
来浏览容器状态:
docker exec -t -i mycontainer /bin/bash
请参阅Docker命令行文档
您可以将您的容器的文件系统归档为tar文件:
docker export adoring_kowalevski > contents.tar
即使您的容器已停止,并且没有任何shell程序(如/bin/bash
此方法仍然有效。 我的意思是像来自Docker文档的hello-world这样的图像。
更新:探索!
这个命令应该让你探索一个正在运行的docker容器 :
docker exec -it name-of-container bash
一旦进入:
ls -lsa
或任何其他bash命令,如:
cd ..
这个命令应该让你探索一个docker镜像 :
docker run --rm -it --entrypoint=/bin/bash name-of-image
一旦进入:
ls -lsa
或任何其他bash命令,如:
cd ..
-it
代表交互...和tty