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

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


当前回答

容器的文件系统在docker的data文件夹中,通常在/var/lib/docker。要启动并检查正在运行的容器文件系统,请执行以下操作:

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

现在,当前的工作目录是容器的根目录。

其他回答

对我来说,这个工作得很好(感谢最后的注释指出目录/var/lib/docker/):

chroot /var/lib/docker/containers/2465790aa2c4*/root/

这里,2465790aa2c4是运行容器的短ID(由docker ps显示),后面跟着一个星号。

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

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

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

更新:探索!

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

对于一个已经运行的容器,你可以这样做:

dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])

cd /var/lib/docker/btrfs/subvolumes/$dockerId

你必须是root用户才能cd到那个目录。如果您不是root用户,请先输入“sudo su”再执行该命令。

编辑:在v1.3之后,请参阅Jiri的回答-它更好。

在运行Docker 1.3.1的Ubuntu 14.04上,我在主机上的以下目录中找到了容器根文件系统:

/var/lib/docker/devicemapper/mnt/<container id>/rootfs/

Docker完整版本信息:

Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): linux/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa