我试图揭示调用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 上其他容器中某个容器中的进程。
有任何想法吗?
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 或容器名称。
归档时间: |
|
查看次数: |
779 次 |
最近记录: |