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

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


当前回答

创建容器之前:

如果你想探索图像的结构,即安装在容器内,你可以这样做

sudo docker image save image_name > image.tar
tar -xvf image.tar

这将使您可以看到图像的所有层及其json文件中的配置。

创建容器后:

对于这个问题,上面已经有很多答案了。我喜欢的方式 这将是

docker exec -t -i container /bin/bash

其他回答

通常情况下,我只需要探索docker文件系统,因为我的构建不会运行,所以docker run -it <container_name> bash是不切实际的。我也不想浪费时间和内存复制文件系统,所以docker cp <container_name>:<path> <target_path>也是不切实际的。

虽然可能不太正统,但我建议在Dockerfile中使用ls作为最后的命令重新构建:

CMD [ "ls", "-R" ]

我有一个未知的容器,它正在执行一些生产工作负载,不想运行任何命令。

所以,我使用docker diff。

这将列出容器已更改的所有文件,因此非常适合探索容器文件系统。

如果只获取一个文件夹,你可以使用grep:

docker diff <container> | grep /var/log

它不会显示来自docker映像的文件。根据您的用例,这可能有用,也可能没用。

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

实际上我使用的所有容器都有Python,所以我附加到容器,

pip install jupyterlab
cd /
jupyter lab --allow-root

我^点击Jupyter Lab服务器提供的链接,在主机的浏览器中,我有完美的文件系统GUI,可以打开各种文件(ipnb, py, md(预览),…)

干杯 G。