在Docker容器内运行的程序的二进制文件在哪里?

时间:2017-07-03 17:32:55

标签: docker

我已经部署了一个基于ubuntu的容器:16.04

docker run -ti ubuntu:latest /bin/bash

我从apt nsnake下载,在容器中的/ 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

所以,重要的问题是: 有没有找到nsnake二进制文件位置的方法?

其他有趣的问题是:

  • 为什么符号链接被“破坏”?
  • 如果相关/ proc / PID / exe中没有对原始bin的引用,系统如何知道它必须运行什么代码?

1 个答案:

答案 0 :(得分:2)

  

Q值。为什么符号链接会被打破" ?

您正在将主pid命名空间与容器的pid命名空间混合。它在您的主机中被破坏,但从容器的角度来看并没有被打破。

  

PID命名空间提供进程分离。 PID命名空间删除系统进程的视图,并允许重用进程ID,包括pid 1.

https://docs.docker.com/engine/reference/run/

执行与在主机中执行的操作相同的操作,但在容器内执行操作。您会看到pid的{​​{1}}(进程ID)是不同的数字。在容器内部,符号链接不会被破坏:

nsnake

(您需要在容器# docker exec -it <container-id> file /proc/231/exe /proc/231/exe: symbolic link to /usr/games/nsnake 内安装文件实用程序,或者只执行apt-get install file

文档:

https://en.wikipedia.org/wiki/Linux_namespaces#Process_ID_.28pid.29

  

Q值。如果在相关的/ proc / PID / exe中没有对原始bin的引用,系统如何知道它必须运行什么代码?

正在运行容器化的进程(在您的示例中为ls -l /proc/PID/exe)会看到自己的文件系统由docker为您安装:

/bin/bash

在这种情况下,存储驱动程序为"overlay2"。 Linux内核从# 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) ... 进程接收系统调用,要求执行/bin/bash的fork执行,并且正如它所期望的那样,它将在容器进程可以看到的文件系统中查找该二进制文件