探索Docker容器的文件系统
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探索Docker容器的文件系统相关的知识,希望对你有一定的参考价值。
我注意到docker我需要了解容器内发生的事情或者那里存在的文件。一个例子是从docker索引下载图像 - 你不知道图像包含什么,因此无法启动应用程序。
什么是理想的是能够ssh到他们或等同。有没有一个工具可以做到这一点,或者我认为码头工作者的错误认为我应该能够做到这一点。
方法1:快照
您可以通过以下方式评估容器文件系统:
# 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
方法2: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运行您的应用程序(连接并执行您想要的)。
更新 - 方法3:nsenter
使用nsenter
,请参阅http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/
简短版本是:使用nsenter,即使该容器不运行SSH或任何类型的专用守护进程,您也可以将shell放入现有容器中
更新 - 方法4:docker exec
Docker 1.3版(最新版本,您可能需要使用docker apt repo来安装最新版本,截至2014年11月)支持新命令exec
,其行为类似于nsenter
。此命令可以在已经运行的容器中运行新进程(容器必须已经运行PID 1进程)。您可以运行/bin/bash
来探索容器状态:
docker exec -t -i mycontainer /bin/bash
见Docker command line documentation
尝试使用
docker exec -it <container-name> /bin/bash
可能有可能没有实现bash。为此你可以使用
docker exec -it <container-name> sh
对我来说,这个很好用(感谢最后的注释指出目录/ var / lib / docker /):
chroot /var/lib/docker/containers/2465790aa2c4*/root/
这里,2465790aa2c4是正在运行的容器的短ID(由docker ps显示),后跟一个星号。
对于驱动程序上的docker:
该脚本将找到容器根目录(在docker 1.7.1和1.10.3上测试)
if [ -z "$1" ] ; then
echo 'docker-find-root $container_id_or_name '
exit 1
fi
CID=$(docker inspect --format {{.Id}} $1)
if [ -n "$CID" ] ; then
if [ -f /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id ] ; then
F1=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id)
d1=/var/lib/docker/aufs/mnt/$F1
fi
if [ ! -d "$d1" ] ; then
d1=/var/lib/docker/aufs/diff/$CID
fi
echo $d1
fi
在我的情况下,除了sh
之外,容器中没有支持shell。所以,这就像一个魅力
docker exec -it <container-name> sh
在较新版本的Docker上,您可以运行docker exec [container_name]
,它在容器内运行shell
因此,要获取容器中所有文件的列表,只需运行docker exec [container_name] ls
我理解容器内部情况的首选方法是:
- 揭露-p 8000
docker run -it -p 8000:8000 image
- 在其中启动服务器
python -m SimpleHTTPServer
对于已经运行的容器,您可以执行以下操作:
dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])
cd /var/lib/docker/btrfs/subvolumes/$dockerId
你需要root才能进入那个dir。如果你不是root用户,请在运行命令之前尝试'sudo su'。
编辑:在v1.3之后,看到Jiri的答案 - 它更好。
这个答案将帮助那些想要探索docker卷文件系统的人(比如我自己),即使容器没有运行。
列出正在运行的docker容器:
docker ps
=>容器ID“4c721f1985bd”
查看本地物理机器上的docker卷装入点(https://docs.docker.com/engine/tutorials/dockervolumes/):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{/ tmp / container-garren / tmp true rprivate}]
这告诉我本地物理机器目录/ tmp / container-garren映射到/ tmp docker卷目标。
知道本地物理机器目录(/ tmp / container-garren)意味着我可以探索文件系统,无论docker容器是否正在运行。这对于帮助我弄清楚即使在容器未运行之后仍然存在一些残留数据至关重要。
另一个技巧是使用atomic工具做类似的事情:
mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt
Docker镜像将挂载到/ path / to / mnt以供您检查。
您可以使用以下命令在容器内运行bash:
$ docker run -it ubuntu /bin/bash
更新:探索!
此命令可让您探索正在运行的docker容器:
docker exec -it name-of-container bash
在docker-compose中的等价物将是:
docker-compose exec web bash
(在这种情况下,web是服务名称,默认情况下它具有tty。)
一旦你在里面做:
ls -lsa
或任何其他bash命令,如:
cd ..
此命令可让您浏览泊坞窗图像:
docker run --rm -it --entrypoint=/bin/bash name-of-image
一旦进去:
ls -lsa
或任何其他bash命令,如:
cd ..
-it
代表互动...而tty。
此命令可让您检查正在运行的docker容器或映像:
docker inspect name-of-container-or-image
您可能想要这样做,并找出那里是否有任何bash
或sh
。在json返回中查找entrypoint或cmd。
见docker-compose exec documentation
在运行容器中运行命令的docker exec
命令可以在多种情况下提供帮助。
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Run a command in a running container Options: -d, --detach Detached mode: run command in the background --detach-keys string Override the key sequence for detaching a container -e, --env list Set environment variables -i, --interactive Keep STDIN open even if not attached --privileged Give extended privileges to the command -t, --tty Allocate a pseudo-TTY -u, --user string Username or UID (format: [:]) -w, --workdir string Working directory inside the container
例如 :
1)在bash中访问正在运行的容器文件系统:
docker exec -it containerId bash
2)以root身份访问bash到正在运行的容器文件系统,以便能够拥有所需的权限:
docker exec -it -u root containerId bash
这对于能够在容器中以root身份进行某些处理特别有用。
3)使用特定的工作目录访问bash到正在运行的容器文件系统:
docker exec -it -w /var/lib containerId bash
如果您使用的是AUFS存储驱动程序,则可以使用我的docker-layer脚本查找任何容器的文件系统根目录(mnt)和readwrite图层:
# 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取代
您可以使用潜水以TUI交互式查看图像内容
https://github.com/wagoodman/dive
Docker02:Docker核心技术探索使用cgroup限制资源的使用
Docker02:Docker核心技术探索网络命名空间和网络隔离
Windows Server 2019 容器化探索-Docker安装
Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段