我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。

理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。


当前回答

更新:探索!

这个命令应该让你探索一个正在运行的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 ..

它代表互动…和遥控。


这个命令可以让你检查一个正在运行的docker容器或镜像:

Docker检查容器名称或映像

您可能想要这样做,并找出其中是否有bash或sh。在json返回中寻找entrypoint或cmd。

注意:这个答案依赖于常见的工具,但如果没有bash shell或常见的工具,如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创建文档

其他回答

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

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

docker export adoring_kowalevski > contents.tar

或者列出文件:

docker export adoring_kowalevski | tar t

请注意,根据映像的不同,这可能需要一些时间和磁盘空间。

另一个技巧是使用原子工具来做如下的事情:

mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt

Docker映像将被挂载到/path/to/mnt,以便您检查它。

试着用

docker exec -it <container-name> /bin/bash

有可能bash没有实现。你可以用这个

docker exec -it <container-name> sh

得到最多好评的答案是,当容器实际启动时,它为我工作,但当它不可能运行时,例如,你想从容器中复制文件,这之前已经保存了我:

docker cp <container-name>:<path/inside/container> <path/on/host/>

多亏了docker cp (link),你可以直接从容器中复制,就像它是文件系统的任何其他部分一样。 例如,恢复容器内的所有文件:

mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/

注意,您不需要指定要递归复制。

在新版本的Docker上,你可以运行Docker exec [container_name],它在你的容器中运行一个shell

因此,要获得容器中所有文件的列表,只需运行docker exec [container_name] ls