在Docker中,进程管理的基础是Linux内核的PID命名空间技术。在不同的PID命名空间下,可以有相同的PID。

Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时创建的root namespace(根命名空间), 父节点可以看到子节点中的进程,并可以通过信号等方式对子节点中的进程产生影响。反过来,子节点不能看到父节点名空间中的任何内容,也不可能通过kill或ptrace影响父节点或其他名空间中的进程。

在docker中有一个很特殊的进程——PID为1的进程,这也是docker的主进程,通过Dockerfile中的 ENTRYPOINT 和/或 CMD指令指定。当主进程退出的时候,容器所拥有的PIG命名空间就会被销毁,容器的生命周期也会结束docker最佳实践建议的是一个container一个service,并不强制要你一个container一个线程。有的服务,会催生更多的子进程,比如Apache和uwsgi,这是完全OK的。

PID1进程需要对自己创建的子进程负责,当主进程没有设计好,不能优雅地让子进程退出,就会照成很多问题,比如数据库container,如果处理数据的进程没有优雅地退出,可能会照成数据丢失。如果很不幸,你的主进程就是这种管理不了子进程的那种,docker提供了一个小工具,帮助你来完成这部分内容。你只需要在run创建container的时候提供一个—init flag就行,docker就会手动为你处理好这些问题。

来看一个实例

在docker中,对于CMD和 ENTRYPOINT,支持两种进程执行方式:exec和shell。

shell的格式是:

CMD "executable param1 param2"

最终PID1进程将是: /bin/sh -c ”executable param1 param2”

Exec的格式是:

CMD ["executable","param1","param2"]

最终的PID1进程是: executable param1 param2

现在有两个镜像,Dockerfile分别如下:

  • 镜像redis:shell
FROM ubuntu:14.04
RUN apt-get update && apt-get -y install redis-server && rm -rf /var/lib/apt/lists/*
EXPOSE 6379
CMD "/usr/bin/redis-server"

  • 镜像redis:exec
FROM ubuntu:14.04
RUN apt-get update && apt-get -y install redis-server && rm -rf /var/lib/apt/lists/*
EXPOSE 6379
CMD ["/usr/bin/redis-server"]docker run -d --name myredis1 redis:shell
docker run -d --name myredis2 redis:exec

那个docker镜像更好一点呢?

我们前面讲过,PID1进程(主进程)需要对自己的子进程负责,对于redis:shell,它产生的PID1进程是

/bin/sh -c "/usr/bin/redis-server"

也就是说,是/bin/sh这个进程,不是/usr/bin/redis-server!/usr/bin/redis-server只是它创建的一个子进程!

执行命令

docker exec myredis1 ps -ef

可以验证这种猜测

通过exec方式运行的container的主进程则是我们所期望的。

你可能会觉得,这有什么大不了的呢,问题出现当我们停止container的时候。

停止redis:shell

docker stop myredis1
docker logs myredis1

Stop的时候,docker明显停顿了一段时间,而且查看日志可以看出,redis没有做任何保存数据库的操作,直接被强制退出了。这期间发生了什么?首先,运行stop命令会向容器发送 SIGTERM信号,告诉主进程:你该退出了,感觉收拾收拾。但是,这里的主进程是/bin/sh啊,它怎么可能会有处理redis进程退出的机制?所以redis进程不会马上退出。 Docker Daemon等待一段时间之后(默认是10s),发现容器还没有完全退出,这时候就会发送 SIGKILL,将容器强行杀死。在这过程中,redis进程完全不知道自己该退出了,所以他没有做任何收尾的工作。

停止redis:exec

docker stop myredis2
docker logs myredis2

这一次stop的时候是立即生效了,没有卡顿延迟现象,从输出来看,redis进行了shutdown的操作,把该持久化的数据都保存到磁盘了。因为这时候的PID1进程是

/usr/bin/redis-server

它是能够正确处理SIGTERM信号的。这才是我们所期望的。

总结一下

Docker的主进程(PID1进程)是一个很特殊的存在,它的生命周期就是docker container的生命周期,它得对产生的子进程负责,在写Dockerfile的时候,务必明确PID1进程是什么。

关注我的微信公众号

docker 主进程 日志_[docker]从一个实例,一窥docker进程管理相关推荐

  1. docker desktop ubuntu镜像_资深专家都知道的顶级 Docker 命令!

    开发人员一直在努力提高 Docker 的使用率和性能,命令也在不停变化.Docker 命令经常被弃用,或被替换为更新且更有效的命令,本文总结了近年来资深专家最常用的命令列表并给出部分使用方法. 目前, ...

  2. docker run 挂载卷_使用Windows主机时如何挂载Docker卷?

    在Windows主机下安装Docker卷对我来说是一个巨大的痛苦,而且我无法使其正常工作. 目前,我得到了以下简单的Dockerfile: FROM php:5-apache RUN apt-get ...

  3. docker php composer 使用_「PHP编程」如何使用Docker制作自己的LNMP/LAMP镜像

    LNMP和LAMP是PHP常用的两种运行环境,L代表Linux,N代表Nginx,A代表Apache,M代表Mysql,P代表PHP.在文章<「PHP编程」安装开发环境太烦?告诉你几个简单方法, ...

  4. vbs结束进程代码_物联网学习教程—Linux系统编程之进程控制

    Linux系统编程之进程控制 一.结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳 ...

  5. linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...

    综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...

  6. docker 主进程 日志_运维笔记--docker高效查看后台日志

    场景描述: 应用程序运行在 Docker环境中, 经常使用的查看后台日志的命令是:docker attach 容器名 该命令优点:实时输出: 不足之处:日志大量输出的时候,屏幕一闪而过,不便于调试, ...

  7. java 分析jstack日志_望闻问切使用jstack和jmap剖析java进程各种疑难杂症

    最近碰到多起java程序导致服务器cpu使用率100%的情况,下面把排查解决方法记录下来. 其实遇到这种情况,首先要保持冷静的头脑,遇事不乱.然后望闻问切,找到病根,直达病灶.所谓望闻问切就是,首先使 ...

  8. jboss默认进程名称_快速指南:剖析JBoss BPM跨进程通信

    jboss默认进程名称 (文章来宾与北美红帽公司高级解决方案架构师杰伊·保拉杰合着) 几周的提示与技巧文章将深入探讨JBoss BPM Suite,特别是有关如何在两个流程之间进行通信的问题. 在深入 ...

  9. 进程外COM组件的一个实例

    之前写过一篇使用COM组件的3种方法的文章:启动COM组件的三种机制,其中后来补充了一个用免注册的方式使用进程外COM组件的方法,因为只是文字补充,没有实例,可能对于怎么实现大家不是很清楚,陆续收到一 ...

最新文章

  1. ASP.NET应用程序与页面生命周期
  2. java 两个stream合并_Java Stream 流如何进行合并操作
  3. 初中数学分几个模块_初中数学 8大模块,59个必考易错知识点大集合,期末考试一定要注意...
  4. hyperf自定义注解类_swoole学习六hyperf注解的使用
  5. 8 线性表-循环队列-顺序存储
  6. mysql教程为什么很多都用dos_在dos操作mysql基础教程详解
  7. Elementui input不能再循环数据中每次自动聚焦的问题
  8. SqlServer中 Partition By 的使用
  9. xcode 左边导航栏中,类文件后面的标记“A”,M,?……等符号的含义???(转)...
  10. linux ubuntu版本选择,如何选择一个合适的Ubuntu版本
  11. M1 和 Docker 谈了个恋爱
  12. 一个菜鸟的Geant4入门之路:alpha粒子轰击金箔的例子
  13. IIS Ceb文件允许下载
  14. 浏览器渲染机制、重排、重绘
  15. 程序员数学(9)--不等式与不等式组
  16. SharePoint中在线编辑文档
  17. pdf文件怎么修改文字
  18. 推荐 5 个 火火火火 的 帮你提高 CSS 技巧项目
  19. 上海交通大学计算机考研信息汇总
  20. Win软件 - (Net-Framework)已处理证书链,但是在不受信任提供程序信任的根证书中终止

热门文章

  1. 最有效阻止SSH暴力破解的方法
  2. Bitcoin.com支持BCH第N弹——派息神器SLP Dividend Calculator
  3. 6月27日比特币现金消息总结
  4. nvidia-smi 实时刷新 实时显示显存使用情况
  5. 红盟过客提到的 CCIE 必读书籍
  6. Java正則表達式入门
  7. 迷途指针,从百度百科上摘抄的,语言很幽默
  8. 【收藏】C# 2.03.0新特性总结
  9. 雷林鹏分享:解决CI框架的Disallowed Key Characters错误提示
  10. nuxt 过滤 query 参数