我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
您可以使用dive与TUI交互查看图像内容
https://github.com/wagoodman/dive
其他回答
如果容器停止或没有shell(例如,安装指南中提到的hello-world,或non-alpine traefik),这可能是探索文件系统的唯一可能方法。
你可以将容器的文件系统归档到tar文件中:
docker export adoring_kowalevski > contents.tar
或者列出文件:
docker export adoring_kowalevski | tar t
请注意,根据映像的不同,这可能需要一些时间和磁盘空间。
另一个技巧是使用原子工具来做如下的事情:
mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt
Docker映像将被挂载到/path/to/mnt,以便您检查它。
容器的文件系统在docker的data文件夹中,通常在/var/lib/docker。要启动并检查正在运行的容器文件系统,请执行以下操作:
hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash
现在,当前的工作目录是容器的根目录。
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)在bash中以root身份访问正在运行的容器文件系统,以获得所需的权限:
docker exec -it -u root containerId bash
这对于能够在容器中作为根执行一些处理特别有用。
3)在bash中访问特定工作目录下运行的容器文件系统:
docker exec -it -w /var/lib containerId bash
对我来说,这个工作得很好(感谢最后的注释指出目录/var/lib/docker/):
chroot /var/lib/docker/containers/2465790aa2c4*/root/
这里,2465790aa2c4是运行容器的短ID(由docker ps显示),后面跟着一个星号。