制作Docker镜像时一般会使用ENTRYPOINT来配置容器启动时执行的命令,一般用于启动一些服务。但是命令运行结束后,容器也会结束,会发现刚起的容器Exit(0)。一般可以用
ENTRYPOINT ["/sbin/init" ]
来实现容器起来后不退出,而是继续运行,但是想配置有些服务也跟着容器启动而启动则有些困难。也有一个老土的办法,进入运行的容器去启动我们想要的服务。但是,现在可以使用Supervisor来实现我们想要的功能。
Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
Centos7安装Supervisor
yum install -y epel-release
yum install -y supervisor
安装后默认配置文件:
/etc/supervisord.conf
,进程管理配置文件目录:
/etc/supervisord.d/
。
默认supervisord的启动方式是daemon,即后台方式启动,因此要配置为前台启动,修改配置文件
/etc/supervisord.conf
中supervisord项的nodaemon属性值为true:
sed -i 's/nodaemon=false/nodaemon=true/g' /etc/supervisord.conf
关于进程管理的配置,格式如下:
[program:nginx]
command = /www/lanmps/bin/nginx start ; 程序启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就表示进程正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = www ; 用哪个用户启动,默认是root
priority=1 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
stdout_logfile = /www/center.log ; stdout 日志文件,需要当目录不存在时无法正常启动
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
进程管理配置可以在supervisord.conf文件中配置,但是不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在supervisord.conf文件中指定的include目录:
[include]
files = supervisord.d/*.ini
也就是说自定义配置文件放在/etc/supervisord.d目录,并以.ini为后缀。
Dockerfile中ENTRYPOINT相关配置如下:
ENTRYPOINT ["/usr/bin/supervisord" , "-c" , "/etc/supervisord.conf"]
这样当容器通过
docker run –d imageid
启动后就不会退出,同时也会启动自定义的进程。
参考:
https://blog.csdn.net/wawa8899/article/details/52743861
https://www.linuxidc.com/Linux/2017-02/140417.htm
安装的目录是/usr/local/Cellar/
supervisor
cd到/usr/local/etc
这个目录下有个
supervisor
d.ini 的原配置文件,把这个配置文件复制一份 ,修改名字是
supervisor
d.conf
根据上面的截图的最后一行
在/usr/local/etc/的目录下创建
supervisor
.d目录
并这个目录中写入自己 定义的配置文件 例如:atlas.conf
执行指令:
supervisor
ctl restart group-xxx: 一直没返回;
查看所重启服务组的进程:
supervisor
ctl status group-xxx: 发现有一个处于 STOPPING状态,其他都是STOPED;
查询进程状态:ps -ef|grep xxx, 发现进程还活着;
cat /proc/'进程pid' status, 发现进程状态是D
先在Linux中安装
docker
,然后在
docker
中安装appnode,并进行
docker
网络端口映射。接着登录appnode面板安装
supervisor
。
supervisor
用于守护进程,在进程意外终止后将其重启。
supervisor
没有监听内部
程序
和自动重启的功能。
在上一篇文章 <<为什么需要自定义一个基础镜像?>> 介绍如何
实现
一个php基础镜像,我们在PHP官方镜像之上,添加一些项目必用的php扩展模块,并且安装了 nginx、
supervisor
软件,接下来本篇文章中介绍 如何使用
supervisor
在
容器
中运行与管理 nginx 与 php-fpm 进程(多进程)。
默认情况下
docker
容器
只运行单个进...
注:本文基于CentOS 6.6
Docker
容器
的设计并不推荐
容器
内运行多个进程,它希望的是一个进程一个
容器
,走微服务方向。然而实际生产过程中并没有这么理想,总是会有需要多个进程运行在同一
容器
的需要。因此,我们今天来介绍一下
容器
内的多进程管理——
supervisor
,还有另一个工具——monit,同样可以用于
容器
内多进程管理,不过我们后面再介绍它。
1、使用yum方式
yum ins...
可通过easy install
supervisor
或pip install
supervisor
,当然还可以通过下载源码通过python setup.py install 来安装(注意:要在python2.x下进行安装)
还可以通过linxu下的包管理来安装,如yum install
supervisor
问题描述:在编写
Docker
file创建
supervisor
容器
时,最后一条
启动
supervisor
的命令不起作用 -> CMD ["
supervisor
d","-c","/etc/
supervisor
d.conf"],但是进到
容器
内部执行
supervisor
d -c/etc/
supervisor
d.conf可以成功运行。
先贴出来
Docker
file文件代码
FROM python...
systemd是Linux下的一种init软件,由Lennart
Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此
实现
系统初始化时服务的并行
启动
,同时达到降低Shell的系统开销的效果,最终代替现在常用的System
V与BSD风格init
程序
。
传统的System
V是串行
启动
,即在