我注意到 docker,我需要了解容器内部发生的情况或其中存在的文件。一个示例是从 docker 索引下载图像 - 您不知道该图像包含什么,因此无法启动该应用程序。
理想的情况是能够使用 ssh 或等效的工具。是否有工具可以做到这一点,或者我对 docker 的构想在认为我应该能够做到这一点上是错误的。
这是几种不同的方法...
Docker 1.3 或更高版本支持行为类似于nsenter
exec
。此命令可以在已运行的容器中运行新进程(容器必须已运行 PID 1 进程)。您可以运行/bin/bash
探索容器状态:
docker exec -t -i mycontainer /bin/bash
请参阅Docker 命令行文档
您可以通过以下方式评估容器文件系统:
# 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
如果需要连续访问,可以将 sshd 安装到您的容器中并运行 sshd 守护程序:
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
这样,您可以使用 ssh 运行您的应用程序(连接并执行所需的操作)。
使用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
您可能想要这样做,并找出其中是否有任何bash
或sh
。在 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 创建文档
如果您的容器已停止运行或没有外壳(例如,安装指南中提到的hello-world
或 non- alpine
traefik
),则这可能是探索文件系统的唯一可能方法。
您可以将容器的文件系统归档到 tar 文件中:
docker export adoring_kowalevski > contents.tar
或列出文件:
docker export adoring_kowalevski | tar t
请注意,根据映像,可能要花费一些时间和磁盘空间。