我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
这个答案将帮助那些(像我一样)想要探索docker卷文件系统的人,即使容器没有运行。
列出正在运行的docker容器:
码头工人ps
=>集装箱ID "4c721f1985bd"
查看本地物理机器上的docker卷挂载点(https://docs.docker.com/engine/tutorials/dockervolumes/):)
Docker inspect -f{{。坐骑}}4 c721f1985bd
=> [/tmp/接触-garren /tmp true rprivate]
这告诉我,本地物理机目录/tmp/container-garren被映射到/tmp docker卷目标。
知道本地物理机器目录(/tmp/container-garren)意味着我可以查看文件系统,无论docker容器是否正在运行。这对于帮助我找出即使在容器停止运行后也不应该保留的一些残留数据非常重要。
其他回答
通常情况下,我只需要探索docker文件系统,因为我的构建不会运行,所以docker run -it <container_name> bash是不切实际的。我也不想浪费时间和内存复制文件系统,所以docker cp <container_name>:<path> <target_path>也是不切实际的。
虽然可能不太正统,但我建议在Dockerfile中使用ls作为最后的命令重新构建:
CMD [ "ls", "-R" ]
在新版本的Docker上,你可以运行Docker exec [container_name],它在你的容器中运行一个shell
因此,要获得容器中所有文件的列表,只需运行docker exec [container_name] ls
在运行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
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
这里有一些不同的方法……
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或任何类型 特殊用途守护进程