我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
试着用
docker exec -it <container-name> /bin/bash
有可能bash没有实现。你可以用这个
docker exec -it <container-name> sh
其他回答
另一个技巧是使用原子工具来做如下的事情:
mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt
Docker映像将被挂载到/path/to/mnt,以便您检查它。
现有的答案都没有解决容器退出(并且不能重新启动)和/或没有安装任何shell(例如disroless的)的情况。只要你有对Docker主机的根权限,它就可以工作。
对于真正的手动检查,首先找出层id:
docker inspect my-container | jq '.[0].GraphDriver.Data'
在输出中,您应该看到如下内容
"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"
导航到这个文件夹(作为根目录)以找到容器文件系统的当前可见状态。
更新:探索!
这个命令应该让你探索一个正在运行的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创建文档
对我来说,这个工作得很好(感谢最后的注释指出目录/var/lib/docker/):
chroot /var/lib/docker/containers/2465790aa2c4*/root/
这里,2465790aa2c4是运行容器的短ID(由docker ps显示),后面跟着一个星号。
我使用了另一个肮脏的技巧,即aufs/devicemapper不可知论。
我查看容器正在运行的命令,例如docker ps 如果它是apache或Java,我只做以下事情:
sudo -s
cd /proc/$(pgrep java)/root/
voilá你在容器内。
基本上你可以作为根cd到/proc/<PID>/root/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。