wanmin444 发表于 2019-2-21 11:18:51

Supervisor实现Docker容器内多进程管理(一)

      Docker在设计时并不推崇在一个容器中运行多个进程,但在一些实际的场景中很多都可能需要在一个容器中,同时运行多个程序。在非容器的环境下系统初始化的时候,都会启动一个init进程,其余的进程都由它来管理,但容器环境下这种后台启动进程的方式都不可用。目前主要有两个工具,一个是Supervisor,另一个是Monit。本篇先来介绍Supervisor,Monit会在之后的文章中再做详解。
传统环境下同时运行多个进程非常简单,系统初始化启动一个init或者systemctl进程,其余的进程都由它来管理。在容器环境下没有init进程,启动一个Docker容器,只能让它运行一个前台程序。
那么有办法解决这个问题吗?
目前主要有两个工具,一个是Supervisor,另一个是Monit。本篇先来介绍Supervisor,Monit会在之后的文章中再做详解。
  一、Supervisor介绍及原理
Supervisor是一个C/S架构进程管理工具,通过它可以监控和控制其他的进程,同时它自身提供了一个WebUI,可以在WebUI进行start,stop,restart操作。由Supervisor管理的进程,都是它的子进程。
在Linux系统启动之后,第一个启动的用户态进程是/sbin/init ,它的PID是1,其余用户态的进程都是init进程的子进程。Supervisor在Docker容器里面充当的就类似init进程的角色,其它的应用进程都是Supervisor进程的子进程。通过这种方法就可以实现在一个容器中启动运行多个应用。
以下是在容量里面看到的由Supervisor管理mysql-server和apache的进程情况
# systemctl start docker
# docker run -d --name centos1 sshd:centos    #加-d后台运行
44f11003369d123eccc10b0a9efc006042152d54eb883435eb19d7f5a13e9d66
# docker ps
CONTAINER ID    IMAGE      COMMAND   CREATED      STATUS      PORTS   NAMES
44f11003369d    sshd:centos"/run.sh"   6 seconds agoUp 5 seconds22/tcp    centos1
# docker exec -it 44f11003369d /bin/bash
# ps -ef
UID         PID   PPIDC STIME TTY          TIME CMD
root          1      00 02:14 ?      00:00:00 /bin/bash /run.sh
root          5      10 02:14 ?      00:00:00 /usr/sbin/sshd -D
root          6      01 02:15 ?      00:00:00 /bin/bash
root         17      60 02:15 ?      00:00:00 ps -ef
# exit  二、Supervisor配置与实例



页: [1]
查看完整版本: Supervisor实现Docker容器内多进程管理(一)