我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
如果你正在使用AUFS存储驱动程序,你可以使用我的docker层脚本找到任何容器的文件系统根(mnt)和读写层:
# docker-layer musing_wiles
rw layer : /var/lib/docker/aufs/diff/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f
mnt : /var/lib/docker/aufs/mnt/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f
编辑2018-03-28: Docker-layer已被docker-backup取代
其他回答
通常情况下,我只需要探索docker文件系统,因为我的构建不会运行,所以docker run -it <container_name> bash是不切实际的。我也不想浪费时间和内存复制文件系统,所以docker cp <container_name>:<path> <target_path>也是不切实际的。
虽然可能不太正统,但我建议在Dockerfile中使用ls作为最后的命令重新构建:
CMD [ "ls", "-R" ]
容器的文件系统在docker的data文件夹中,通常在/var/lib/docker。要启动并检查正在运行的容器文件系统,请执行以下操作:
hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash
现在,当前的工作目录是容器的根目录。
得到最多好评的答案是,当容器实际启动时,它为我工作,但当它不可能运行时,例如,你想从容器中复制文件,这之前已经保存了我:
docker cp <container-name>:<path/inside/container> <path/on/host/>
多亏了docker cp (link),你可以直接从容器中复制,就像它是文件系统的任何其他部分一样。 例如,恢复容器内的所有文件:
mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/
注意,您不需要指定要递归复制。
我使用了另一个肮脏的技巧,即aufs/devicemapper不可知论。
我查看容器正在运行的命令,例如docker ps 如果它是apache或Java,我只做以下事情:
sudo -s
cd /proc/$(pgrep java)/root/
voilá你在容器内。
基本上你可以作为根cd到/proc/<PID>/root/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。
这个答案将帮助那些(像我一样)想要探索docker卷文件系统的人,即使容器没有运行。
列出正在运行的docker容器:
码头工人ps
=>集装箱ID "4c721f1985bd"
查看本地物理机器上的docker卷挂载点(https://docs.docker.com/engine/tutorials/dockervolumes/):)
Docker inspect -f{{。坐骑}}4 c721f1985bd
=> [/tmp/接触-garren /tmp true rprivate]
这告诉我,本地物理机目录/tmp/container-garren被映射到/tmp docker卷目标。
知道本地物理机器目录(/tmp/container-garren)意味着我可以查看文件系统,无论docker容器是否正在运行。这对于帮助我找出即使在容器停止运行后也不应该保留的一些残留数据非常重要。