Docker容器内运行的程序的二进制文件在哪里?
我部署了一个基于Ubuntu 16.04的容器
docker run -ti ubuntu:latest /bin/bash
我从apt下载了apt,在容器里的/ bin / Bash里面有一个游戏:
apt install nsnake
我的主机上没有这样的游戏。
现在我想知道nsnake的二进制文件在主机上的位置 ; 在主机上:
ps -e | grep nsnake
然后,采取PID:
file /proc/PID/exe
但不是返回从/ proc / PID / exe文件指出的文件 ,这最后一个命令给我:
/proc/PID/exe: broken symbolic link to /usr/games/nsnake
所以,重要的问题是:有没有一种方法来findnsnake的二进制文件的位置?
其他有趣的问题是:
- 为什么符号链接是“破”?
- 如果在相关的/ proc / PID / exe文件中没有引用原始文件夹,那么系统如何知道它需要运行哪些代码?
问:为什么符号链接是“破”?
您将主要的pid命名空间和容器的pid命名空间混合在一起。 它在你的主机中被破坏了,但是从容器的angular度来看它并没有被破坏。
PID名称空间提供进程的分离。 PID命名空间删除系统进程的视图,并允许重复使用进程ID,包括PID 1。
https://docs.docker.com/engine/reference/run/
做你在主人做的一样,但在容器内。 你会看到nsnake
的pid
(进程ID)是一个不同的数字。 在你的容器里,符号链接不会被打破:
# docker exec -it <container-id> file /proc/231/exe /proc/231/exe: symbolic link to /usr/games/nsnake
(你将需要在容器中安装文件实用程序, apt-get install file
,或者只需要执行ls -l /proc/PID/exe
)
文档:
https://en.wikipedia.org/wiki/Linux_namespaces#Process_ID_.28pid.29
Q.如果在相关的/ proc / PID / exe文件中没有提到原始文件夹,系统如何知道它需要运行哪些代码?
运行容器化的过程(在您的示例/bin/bash
)会看到由docker为您安装的自己的文件系统:
# Inside the container root@d0fb6fdea3b5:/# mount overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/4FPUTTI4XND27BPHH7FS4JKJ4V:/var/lib/docker/overlay2/l/U65SX2N4JGA5X6TXGRJQERQWNX:/var/lib/docker/overlay2/l/OEX7NG4TZRGXBBFSSQ7Q3FXC5R:/var/lib/docker/overlay2/l/FXRLO27CABA4ZFNOFTOL2HFHP4:/var/lib/docker/overlay2/l/KBEK646A7PRLHLWM6CVJRMXSEH:/var/lib/docker/overlay2/l/PSRBIMSE36LW2MZEOSMM3XDG2Y,upperdir=/var/lib/docker/overlay2/5b867408de3a3915bc5f257aecaf73193083b3c8cc84c5d642810a3eaaeef550/diff,workdir=/var/lib/docker/overlay2/5b867408de3a3915bc5f257aecaf73193083b3c8cc84c5d642810a3eaaeef550/work) ...
在这种情况下,存储驱动程序是“overlay2” 。 从/bin/bash
收到的Linux内核处理系统调用,要求fork执行/usr/games/nsnake
并且如期望的那样,它将在容器进程可以看到的文件系统中查找该二进制文件。