将进程从一个 Docker 容器附加到另一个

Pav*_*epa 3 linux docker

我试图揭示调用Multi-Image的 CircleCI 功能实现的技术细节。

它们允许以这种方式指定多个图像:

  test-job:
    docker:
    - image: nginx
    - image: circleci/mariadb:10.2
Run Code Online (Sandbox Code Playgroud)

然后,他们基于第一个映像(nginx在本例中)在 Docker 容器中运行构建。如果您连接到nginx容器,您mysqld也可能会看到那里的进程:

  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
...
    7     0 999      S    2518m   2%  31   0% mysqld
...
Run Code Online (Sandbox Code Playgroud)

看起来他们将一个进程从mariadb容器附加到nginx容器。

怎么可能呢?我在docker中没有看到这样的能力。

我认为它的工作原理就像同一个 Kubernetes pod 中的多个容器一样,但事实并非如此。您看不到同一 Pod 上其他容器中某个容器中的进程。

有任何想法吗?

BMi*_*tch 6

kubernetes pod 的概念最初构建在 docker 之上,利用选项重用另一个容器的名称空间。默认情况下,docker 中的每个容器都会以自己的文件系统、pid、网络接口、主机名和用户命名空间开始。但是,对于其中许多,您可以更改命名空间。通常,这样做是为了从隔离的容器名称空间切换到使用主机名称空间,例如--net host查看所有主机 NIC 并访问主机上本地主机上运行的内容。但是,有一个较少使用的选项可以附加到另一个容器的名称空间:

$ docker run -d -p 8888:80 --name web nginx
dcea1ada5d033a1fa7c14a3c2c9ee26d94924b883004dedc3e897389fd4e46cb

$ docker run -it --rm --net container:web --pid container:web nicolaka/netshoot sh

/ # ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 nginx: master process nginx -g daemon off;
    6 101       0:00 nginx: worker process
    7 root      0:00 sh
   12 root      0:00 ps -ef

/ # ss -lntp
State     Recv-Q   Send-Q   Local Address:Port   Peer Address:Port
LISTEN    0        128              0.0.0.0:80           0.0.0.0:*     users:(("nginx",pid=1,fd=6))

/ # curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

/ # 
Run Code Online (Sandbox Code Playgroud)

您可以在该示例中看到,我们可以看到 nginx Web 服务器进程并在本地主机上打开端口,就像主机命名空间中的多个进程可以在主机上互相看到对方一样。更改命名空间使用的container:$container语法$container是容器 ID 或容器名称。