探索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

另一答案

我理解容器内部情况的首选方法是:

  1. 揭露-p 8000 docker run -it -p 8000:8000 image
  2. 在其中启动服务器 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

您可能想要这样做,并找出那里是否有任何bashsh。在json返回中查找entrypoint或cmd。

docker exec documentation

docker-compose exec documentation

docker inspect 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

enter image description <p>以上是关于探索Docker容器的文件系统的主要内容,如果未能解决你的问题,请参考以下文章</p> 
<p > <a style=Docker02:Docker核心技术探索使用cgroup限制资源的使用

Docker02:Docker核心技术探索网络命名空间和网络隔离

将 Docker 容器限制为单个 cpu 核心

docker探索-docker安装运行tomcat

Windows Server 2019 容器化探索-Docker安装

Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段