根据代码看到,pause容器运行着一个很是简单的进程,它不执行任何功能,一启动就永远把本身阻塞住了,nginx
它的做用就是扮演PID1的角色,并在子进程称为"孤儿进程"的时候,经过调用wait()收割这个子进程,这样就不用担忧咱们的Pod的PID namespace里会堆满僵尸进程了,这也是为何kubernetes不随便找个容器,例如Nginx做为父容器,让其余容器加入的缘由docker
共享namespace的意思就是父进程先建立一个namespace,而后其余进程加入到该namespace就共享namespace了vim
使用pause容器和共享namespace建立Pod后端
使用docker启动pause进程,以即可以将其余容器添加到Pod中bash
docker run -d --name pause gcr.io/google_containers/pause-amd64:3.0
而后,在Pod中运行其余容器,分别是Nginx代理和ghost博客应用google
Nginx代理的后端配置成http://127.0.0.1:2368,也就是ghost进程监听的地址spa
##建立nginx配置文件 vim nginx.conf error_log stderr; events { worker_connections 1024; } http { access_log /dev/stdout combined; server { listen 80 default_server; server_name www.example.com; location / { proxy_pass http://127.0.0.1:2368 } } } ##启动nginx容器 docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf -p 8080:80 --net=container:pause --ipc=container:pause --pid=container:pause nginx
为ghost博客应用程序建立另外一个容器代理
docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost
在这个例子中,咱们将nginx容器和ghost容器 加入到pause容器的namespace,若是要访问http://localhost:8080,就能看到ghost经过nginx代理运行,由于pause、nginx、ghost容器之间共享network namespacecode
注意:共享network namespace,一个pod中的nginx容器才能经过127.0.0.1:2368找到ghost,由于在一个network namespace内,才能经过localhost通讯,至关于在一台机器里server
在UNIX系统中,PID为1 的进程是init进程,即全部进程的父进程.init进程比较特殊,它维护一张进程表而且不断的检查其余进程的状态.init进程其中一个做用就是当某个子进程因为父进程的错误退出而变成了"孤儿进程",就会被init进程"收养"并在该进程退出时回收系统资源
在容器中PID namespace对PID进行隔离,所以每一个容器中均可以有独立的init进程.当在主机发送SIGKILL或者SIGSTOP(也就是docker kill或者docker stop命令)强制终止容器的运行时,其实就是在终止容器内的init进程.一旦init进程被销毁,同一PID namespace下的进程也随之被销毁
容器中,必需要有一个进程充当每一个PID namespace的init进程,使用docker的话,ENTRYPOINT进程就是init进程,若是多个容器之间共享PID namespace,那么拥有PID namespace的那个进程要承担init进程的角色,其余容器做为init进程的子进程添加到PID namespace中
举例说明用户容器和PID容器的关系
先启动一个pause容器
docker run -idt --name pause gcr.io/google_containers/pause_amd64:3.0
在运行一个busybox容器,加入pause容器的namespace(Network PID IPC)
docker run -idt --name busybox --net=container:pause --pid=container:pause --ipc=container:pause busybox
上面这种加入的方式也是kubernetes启动pod的原理
进入busybox容器查看里面的进程,发现PID=1的进程是/pause
docker exec -it busybox /bin/bash / # ps aux PID USER TIME COMMAND 1 root 0:00 /pause 5 root 0:00 sh 9 root 0:00 /bin/bash 13 root 0:00 ps aux
为何不用别的容器作init进程,好比Nginx容器,若是因为子进程的父进程意外退出,那么子进程就成了"孤儿进程",Nginx容器没办法回收子进程退出后的资源