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/

做你在主人做的一样,但在容器内。 你会看到nsnakepid (进程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并且如期望的那样,它将在容器进程可以看到的文件系统中查找该二进制文件。