一般的Docker镜像为了节省空间,通常是没有安装systemd或者sysvint这类初始化系统的进程 。一旦容器的起始进程不稳定将会产生大量的僵尸进程,影响宿主系统的运行 。
缺少init的容器
init系统有以下几个特点:
- 它是系统的第一个进程,负责产生其他所有用户进程 。
- init 以守护进程方式存在,是所有其他进程的祖先 。
- 它主要负责:
2.回收孤儿进程
3.将操作系统信号转发给子进程
以下dockerfile为例:
FROM NginxENTRYPOINT ["nginx", "-c"]CMD ["/etc/nginx/nginx.conf"]
当docker容器启动时,PID 1即容器启动程序将会是nginx, 只要这个程序停止,容器就会跟住停止 。由于nginx 不具备init 上述的功能,PID 1是无法回收异常退出进程,异常退出的进程变成僵尸进程,继续占用系统资源 。当多个容器运行在一个宿主机上的时候,为了避免一个容器消耗完我们整个宿主机进程号资源,docker会配置PID CGROUP来限制每个容器的最大进程数目 。也就是说,进程数目在每个容器中也是有限的,是一种很宝贵的资源 。(例如:linux 机器上的进程总数目是有限制,如果进程数据过多,比如你想ssh登录到机器上就不行 )
如何使用 tini 初始化系統
tini 是一套更简单的 init 系统,专门用来执行一个子程序(spawn a single child),并等待子程序结束,即便子程序已经变成僵尸程序也能捕捉到,同时也能转送 Signal 给子程序 。如果你使用docker来跑容器,可以非常简便的在docker run的时候用--init参数,就会自动注入tini程式 (/sbin/docker-init) 到容器中,并且自动取代ENTRYPOINT设定,让原本的程式直接跑在 tini程序底下 。
dockerfile如下:
FROM nginxRUN export TINI_VERSION=0.9.0 &&export TINI_SHA=fa23d1e20732501c3bb8eeeca423c89ac80ed452 &&curl -fsSL https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-static -o /bin/tini &&echo 'Calculated checksum: '$(sha1sum /bin/tini) &&chmod +x /bin/tini && echo "$TINI_SHA/bin/tini" | sha1sum -cENTRYPOINT ["/bin/tini","--","/opt/nginx/docker-entrypoint.sh"]ENTRYPOINT ["nginx", "-c"] CMD ["/etc/nginx/nginx.conf"]
建议为了提高容器运行的可靠性,可以选择在打包镜像时加入tini的安装,并以tini作为启动入口 。
以上就是关于今天的全部内容,下期将给大家带来《K8S之调度器-精细控制Pod分布》,敬请期待~
【容器如何使用tini作为启动进程】
推荐阅读
- 文档如何自动化部署到线上环境「每个前端都可以拥有自己的博客」
- 在音频通话中,如何将WebRTC音频通话升级为视频通话
- 冬天使用蚕丝被的好处
- 梯形田地如何计算亩数公式?
- 王者荣耀宫本武藏如何穿衣
- 如何选购微型打印机
- Centos7如何安装google-chrome浏览器
- 6款超好用的macOS工具软件,提高Mac使用体验
- 内网穿透工具使用总结
- Mac OS 如何查看cpu支持的指令集?