我已经注意到,与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取代
其他回答
这里有一些不同的方法……
A)使用docker exec(最简单)
Docker 1.3或更新版本支持exec命令,其行为类似于nsenter。该命令可以在已经运行的容器中运行新进程(容器必须已经运行PID 1进程)。你可以运行/bin/bash来查看容器状态:
docker exec -t -i mycontainer /bin/bash
参见Docker命令行文档
B)使用快照
你可以这样评估容器文件系统:
# 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
C)使用ssh
如果你需要持续访问,你可以在容器中安装sshd并运行sshd守护进程:
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
这样,你就可以使用ssh(连接并执行你想要的)运行你的应用程序。
D)使用nsenter
使用nsenter,参见为什么你不需要在Docker容器中运行SSHd
简短的版本是:使用nsenter,您可以将shell转换为 现有的容器,即使该容器不运行SSH或任何类型 特殊用途守护进程
我喜欢的理解容器内部发生什么的方法是:
暴露-p 8000 Docker运行-it -p 8000:8000镜像 在里面启动服务器 python -m SimpleHTTPServer
如果您使用的是Docker v19.03,请按照以下步骤操作。
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem
docker run -t -i mysnapshot /bin/sh
容器的文件系统在docker的data文件夹中,通常在/var/lib/docker。要启动并检查正在运行的容器文件系统,请执行以下操作:
hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash
现在,当前的工作目录是容器的根目录。
如果你正在使用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取代