我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
仅适用于LINUX
我使用的最简单的方法是使用proc dir,容器必须运行以检查docker容器文件。
找出容器的进程id (PID)并将其存储到某个变量中 PID=$(docker inspect -f '{{. state。Pid}} ' your-container-name-here) 确保容器进程正在运行,并使用变量名进入容器文件夹 cd /proc/$ PID /根
如果您想在不找到PID编号的情况下访问dir,只需使用这个长命令
cd /proc/$(docker inspect -f '{{.State.Pid}}' your-container-name-here)/root
小贴士:
进入容器后,您所做的一切都会影响容器的实际进程,例如停止服务或更改端口号。
希望能有所帮助
注意:
此方法仅在容器仍在运行时有效,否则,如果容器已停止或删除,则目录将不再存在
其他回答
创建容器之前:
如果你想探索图像的结构,即安装在容器内,你可以这样做
sudo docker image save image_name > image.tar
tar -xvf image.tar
这将使您可以看到图像的所有层及其json文件中的配置。
创建容器后:
对于这个问题,上面已经有很多答案了。我喜欢的方式 这将是
docker exec -t -i container /bin/bash
更新:探索!
这个命令应该让你探索一个正在运行的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创建文档
这将为映像启动一个bash会话:
Docker运行——rm -it——entrypoint=/bin/bash
我已经找到了最简单的,全能的解决方案,查看,编辑,复制文件与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) 你在图形用户界面的工作吗
这种方法克服了权限、快照隔离等所有问题,允许直接复制到任何机器,对我来说是最愉快的使用
如果您使用的是Docker v19.03,请按照以下步骤操作。
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem
docker run -t -i mysnapshot /bin/sh