我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
在运行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
其他回答
如果你正在使用AUFS存储驱动程序,你可以使用我的docker层脚本找到任何容器的文件系统根(mnt)和读写层:
# 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取代
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
这个答案将帮助那些(像我一样)想要探索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容器是否正在运行。这对于帮助我找出即使在容器停止运行后也不应该保留的一些残留数据非常重要。
对我来说,这个工作得很好(感谢最后的注释指出目录/var/lib/docker/):
chroot /var/lib/docker/containers/2465790aa2c4*/root/
这里,2465790aa2c4是运行容器的短ID(由docker ps显示),后面跟着一个星号。
更新:探索!
这个命令应该让你探索一个正在运行的docker容器:
docker exec -it name-of-container bash
在docker-compose中等价的是:
docker-compose exec web bash
(web是本例中的服务名称,默认情况下为tty。)
一旦你进去了:
ls -lsa
或任何其他bash命令,如:
cd ..
这个命令可以让你浏览docker映像:
docker run --rm -it --entrypoint=/bin/bash name-of-image
进入后:
ls -lsa
或任何其他bash命令,如:
cd ..
它代表互动…和遥控。
这个命令可以让你检查一个正在运行的docker容器或镜像:
Docker检查容器名称或映像
您可能想要这样做,并找出其中是否有bash或sh。在json返回中寻找entrypoint或cmd。
注意:这个答案依赖于常见的工具,但如果没有bash shell或常见的工具,如ls,你可以先在一个层中添加一个,如果你可以访问Dockerfile: 例如alpine:
RUN apk add --no-cache bash
否则,如果你无法访问Dockerfile,那么只需从新创建的容器中复制文件,并通过以下方式查看它们:
docker create <image> # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah
参见docker exec文档
参见docker-compose exec文档
参见docker inspect文档
参见docker创建文档