我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。

理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。


当前回答

现有的答案都没有解决容器退出(并且不能重新启动)和/或没有安装任何shell(例如disroless的)的情况。只要你有对Docker主机的根权限,它就可以工作。

对于真正的手动检查,首先找出层id:

docker inspect my-container | jq '.[0].GraphDriver.Data'

在输出中,您应该看到如下内容

"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"

导航到这个文件夹(作为根目录)以找到容器文件系统的当前可见状态。

其他回答

容器的文件系统在docker的data文件夹中,通常在/var/lib/docker。要启动并检查正在运行的容器文件系统,请执行以下操作:

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

现在,当前的工作目录是容器的根目录。

我已经找到了最简单的,全能的解决方案,查看,编辑,复制文件与GUI应用程序在几乎任何运行的容器。

MC在docker中编辑文件

docker exec -it <container> /bin/bash,然后提示安装MC和ssh包 在同一个execute -bash控制台中,运行MC 按ESC,然后9,然后ENTER打开菜单,选择“Shell link…” 使用“Shell link…”通过IP地址打开基于scp的文件系统访问任何运行ssh服务器的主机(包括一个运行docker) 你在图形用户界面的工作吗

这种方法克服了权限、快照隔离等所有问题,允许直接复制到任何机器,对我来说是最愉快的使用

另一个技巧是使用原子工具来做如下的事情:

mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt

Docker映像将被挂载到/path/to/mnt,以便您检查它。

在运行Docker 1.3.1的Ubuntu 14.04上,我在主机上的以下目录中找到了容器根文件系统:

/var/lib/docker/devicemapper/mnt/<container id>/rootfs/

Docker完整版本信息:

Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): linux/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa

这里有一些不同的方法……

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或任何类型 特殊用途守护进程