Docker进程组

引言

前段时间,在使用Docker的时候出现了异常,后经排查发现容器进程变成了孤儿进程,类似于这样:

ps -ef |grep docker
root      9077     1  0 14:51 ?        00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/b9c7dbb97bacd851e861b8edd5bf66226054d336e528ec7ed308558826701ab1 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      9102     1  0 14:51 ?        00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/ac660ea7b14a67421367c6882d63026734e7ea51b35cc259d80214d86a7951fa -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      9132     1  0 14:51 ?        00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/b0ec4f46a4512fea68fd96b130bde1b287911421808922e21309d1655fb8ffc3 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root      9171     1  0 14:51 ?        00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/4a8e0271ad08854bd58f2952cb957a20e07d1d093849f72e6839cf8ee043921d -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
......

docker-containerd-shim父进程变成了系统的1号进程systemd,而不再是dockerd进程

至于什么原因导致的,没有模拟出来,唯一能模拟出来上述情况的做法是kill -9 dockerd进程号,但我们在操作docker时估计也不会这么做。后来在使用中发现当有些容器的应用处于繁忙状态(高度使用cpu、mem等资源)时,如果systemctl stop docker,则繁忙容器对应的docker-containerd-shim进程多半会处于孤儿进程状态。想要对docker这一块的进程作了解,于是花了些时间研究了docker进程组的状况,如下为研究记录。

实践
  1. 实践环境:Centos7.4 +Docker18.03-ce
  2. 安装完docker并通过systemctl start docker启动dockerd服务后,系统中关于docker的进程组状态为:
pstree -a
systemd --system --deserialize 20
  ......
  ├─dockerd --storage-driver=overlay2
  │   ├─docker-containe --config /var/run/docker/containerd/containerd.toml
  │   │   └─8*[{docker-containe}]
  │   └─10*[{dockerd}]
  ......
  
  ps -ef | grep docker | grep -v grep
root     28114     1  0 15:25 ?        00:00:00 /usr/bin/dockerd --storage-driver=overlay2
root     28121 28114  0 15:25 ?        00:00:01 docker-containerd --config /var/run/docker/containerd/containerd.toml
  
  可知:
  1. 首先会有dockerd(docker daemon)进程,父进程为systemd 1号进程
  2. 紧接着是docker-containerd(containerd is the executor for containers)进程,父进程为dockerd进程
  注:pstree的这个显示10*[{dockerd}]表示dockerd进程的子线程,可以man pstree了解
  1. 创建一个nginx容器,查看容器进程信息
创建nginx容器并映射端口80->8888
docker run -itd --name nginx -p 8888:80 nginx:1.14
dd12c48715428d71ab64e1a7aa9242b8d6c9786e417c8595168646c39745b50f

查看nginx容器内运行的进程
docker top nginx 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                28543               28527               0                   16:39               pts/0               00:00:00            nginx: master process nginx -g daemon off;
101                 28580               28543               0                   16:39               pts/0               00:00:00            nginx: worker process

pstree -a
systemd --system --deserialize 20
  ......
  ├─dockerd --storage-driver=overlay2
  │   ├─docker-containe --config /var/run/docker/containerd/containerd.toml
  │   │   ├─docker-containe -namespace moby -workdir ...
  │   │   │   ├─nginx
  │   │   │   │   └─nginx
  │   │   │   └─8*[{docker-containe}]
  │   │   └─10*[{docker-containe}]
  │   ├─docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8888 -container-ip 172.17.0.2 -container-port 80
  │   │   └─5*[{docker-proxy}]
  │   └─11*[{dockerd}]
  ......
 
ps -ef | grep -E "docker|nginx" | grep -v grep
root     28114     1  0 15:25 ?        00:00:12 /usr/bin/dockerd --storage-driver=overlay2
root     28121 28114  0 15:25 ?        00:00:27 docker-containerd --config /var/run/docker/containerd/containerd.toml
root     28521 28114  0 16:39 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8888 -container-ip 172.17.0.2 -container-port 80
root     28527 28121  0 16:39 ?        00:00:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/dd12c48715428d71ab64e1a7aa9242b8d6c9786e417c8595168646c39745b50f -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
root     28543 28527  0 16:39 pts/0    00:00:00 nginx: master process nginx -g daemon off;
101      28580 28543  0 16:39 pts/0    00:00:00 nginx: worker process

可知:
1. docker-proxy进程主要用来做端口映射,可以在dockerd设置--userland-proxy=false将其关闭;docker-proxy与docker-containerd进程一样均是dockerd的子进程
2. docker-containerd-shim是运行容器的进程,每一个容器均会对应一个containerd-shim进程,此进程是docker-containerd的子进程
3. 应用进程nginx是容器进程docker-containerd-shim的子进程,应用进程通常是entrypoint+cmd进程,容器内后续创建的进程均是entrypoint+cmd进程的子进程
  1. 查看多个容器的进程信息:
ps axf | grep docker -A 1
 1223 pts/1    S+     0:00  |       \_ grep --color=auto docker -A 1
28046 ?        Ss     0:00  \_ sshd: root@pts/0
--
29267 ?        Ssl    0:57 /usr/bin/dockerd --storage-driver=overlay
29274 ?        Ssl    0:04  \_ docker-containerd --config /var/run/docker/containerd/containerd.toml
29670 ?        Sl     0:00  |   \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/b4922fcaa64304c0aad46de5aaf487a16c3926ee04ffa74357c73eecd9f460d7 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
29684 pts/0    Ssl+   0:01  |   |   \_ registry serve /etc/docker/registry/config.yml
32673 ?        Sl     0:00  |   \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/74e6fdbbd29e976d1c334a02558d653991fd6740a91b5796245599dd8624627a -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
32689 pts/0    Ssl+   0:04  |   |   \_ /bin/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -web.console.libraries=/usr/share/prometheus/console_libraries -web.console.templates=/usr/share/prometheus/consoles
  357 ?        Sl     0:00  |   \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/38d837585be68b658fdc678c80f5add34556e6b883a4f2125e9ad4fa8f915496 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
  373 pts/0    Ssl+   0:01  |   |   \_ /usr/sbin/grafana-server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini cfg:default.log.mode=console cfg:default.paths.data=/var/lib/grafana cfg:default.paths.logs=/var/log/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins
  724 ?        Sl     0:00  |   \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/a1f7009ce53b17f31e6f84a1920ea770612dd15f030f1c561a31dd1c9a93ea78 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
  749 pts/0    Ssl+   0:01  |   |   \_ /bin/node_exporter -collector.procfs /host/proc -collector.sysfs /host/sys -collector.filesystem.ignored-mount-points ^/(sys|proc|dev|host|etc)($|/)
  858 ?        Sl     0:00  |   \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/5a8ef16cc491583903aadc24ce282261e7821284b461cc6fa9b108f15846fdef -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
  874 pts/0    Ssl+   0:20  |       \_ /usr/bin/cadvisor -logtostderr -port 8090
29661 ?        Sl     0:00  \_ /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.2 -container-port 5000
  1. docker进程组结构为:
/usr/bin/dockerd ......
  \_ docker-containerd ......
       \_ docker-containerd-shim ...... 
            \_ 应用进程(ENTRYPOINT+CMD)
       \_ docker-containerd-shim ......
            \_app
       ......
   \_ /usr/bin/docker-proxy ......
   \_ /usr/bin/docker-proxy ......
   .....
总结

从上述研究内容可知,dockerd的父进程为1号systemd进程,其子进程包含docker-containerd与docker-proxy进程,docker-proxy进程用于容器的路由设置。docker-containerd-shim是docker-containerd的子进程,一个容器对应一个docker-containerd-shim进程。另外发现耗子叔也遇到了类似的问题,文章说到在systemctl stop docker无响应的情况下,Ctrl+C的操作也会导致容器进程变为孤儿进程。

引用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • Docker 和虚拟机 容器内的进程是直接运行于宿主内核的,这点和宿主进程一致,只是容器的 userland 不同...
    Jancd阅读 490评论 0 8
  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,519评论 15 147
  • 概况 掌握 Docker 在Centos的安装: 操作系统:Win 10 家庭中文版 虚拟机软件:Oracle V...
    andy0898阅读 1,101评论 1 9
  • 本人也是游戏策划新手之一,不,甚至算不上新手,只能说刚刚经历了扫盲。最近看到一个朋友发的策划要求,说是玩的游戏...
    情商等于零阅读 1,217评论 3 49
  • 饮酒系列师从陶渊明,共十二首,个人觉得比古风系列要好一些。 其一 昨岁童稚子,今岁新白发, 生亦如朝露,梦影镜中花...
    释迦干屎橛阅读 1,523评论 0 3