协慌网

登录 贡献 社区

探索 Docker 容器的文件系统

我注意到 docker,我需要了解容器内部发生的情况或其中存在的文件。一个示例是从 docker 索引下载图像 - 您不知道该图像包含什么,因此无法启动该应用程序。

理想的情况是能够使用 ssh 或等效的工具。是否有工具可以做到这一点,或者我对 docker 的构想在认为我应该能够做到这一点上是错误的。

答案

这是几种不同的方法...

A)使用 docker exec (最简单)

Docker 1.3 或更高版本支持行为类似于nsenter exec 。此命令可以在已运行的容器中运行新进程(容器必须已运行 PID 1 进程)。您可以运行/bin/bash探索容器状态:

docker exec -t -i mycontainer /bin/bash

请参阅Docker 命令行文档

B)使用快照

您可以通过以下方式评估容器文件系统:

# 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

C)使用 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 运行您的应用程序(连接并执行所需的操作)。

D)使用 nsenter

使用nsenter ,请参阅为什么不需要在 Docker 容器中运行 SSHd

简短的版本是:使用 nsenter,您可以将 shell 放入现有容器中,即使该容器未运行 SSH 或任何特殊用途的守护程序

更新:探索中!

此命令应让您探索正在运行的 docker 容器

docker exec -it name-of-container bash

docker-compose 中的等效项为:

docker-compose exec web bash

(在这种情况下,web 是服务名称,默认情况下它具有 tty。)

进入内部后,请执行以下操作:

ls -lsa

或任何其他 bash 命令,例如:

cd ..

此命令应让您浏览 docker 映像

docker run --rm -it --entrypoint=/bin/bash name-of-image

进入内部后,请执行以下操作:

ls -lsa

或任何其他 bash 命令,例如:

cd ..

-it代表交互式... 和 tty。


该命令应让您检查正在运行的 docker 容器或映像

docker inspect name-of-container-or-image

您可能想要这样做,并找出其中是否有任何bashsh 。在 json 返回中查找入口点或 cmd。

注意:此答案依赖于提供的 commen 工具,但是如果没有bash ls这样的通用工具Dockerfile则可以首先在一个层中添加一个:alpine 的示例:

RUN apk add --no-cache bash

否则,如果您无权访问Dockerfile则只需将文件从新创建的容器中复制出来,然后通过以下方法查看它们:

docker create <image>  # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah

请参阅docker exec 文档

请参阅docker-compose exec 文档

请参阅docker inspect 文档

请参阅docker 创建文档

如果您的容器已停止运行或没有外壳(例如,安装指南中提到的hello-world或 non- alpine traefik ),则这可能是探索文件系统的唯一可能方法。

您可以将容器的文件系统归档到 tar 文件中:

docker export adoring_kowalevski > contents.tar

或列出文件:

docker export adoring_kowalevski | tar t

请注意,根据映像,可能要花费一些时间和磁盘空间。