Docker内部使用Supervisor

问题描述

使用docker run启动一个beego服务,命令为:

1
docker run --name bservice -d -p 8080:8080 voidking/bservice:v1 "/bin/bash" "-c" "cd /opt/bservice && nohup ./bservice"

启动后,beego服务是容器内PID为1的前台进程。假设该服务不是那么健壮,出了bug会停止服务,那么容器也会随之停止。
如果想要服务停止后自动启动,那么就需要supervisor出马了。

解决方案

参考《CentOS安装配置Supervisor》,在容器中安装supervisor。

1、在/etc/supervisor中新建bservice.conf文件

1
2
3
4
5
6
7
8
[program:bservice]
directory=/opt/bservice
command=/opt/bservice/bservice
user=root
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log

2、测试启动

1
2
3
systemctl retart supervisord
supervisorctl status
ps aux | grep bservice

3、编辑/etc/supervisord.conf,设置supervisor为前台进程

1
nodaemon=true

4、把容器保存为镜像

1
docker commit container_id voidking/bservice:v2

5、修改启动命令为

1
docker run --name bservice -d -p 8080:8080 voidking/bservice:v2 "/bin/bash" "-c" "supervisord -c /etc/supervisord.conf"

使用这种启动方式,哪怕服务因为意外停止,也会马上被supervisor拉起,提高了服务的可用性。

扩展应用

再来看另外一个场景:
npm run start原本可以正常启动node服务进入后台运行,容器化后通过docker run启动,命令为:

1
docker run --name fservice -d -p 80:80 voidking/fservice:v1 "/bin/bash" "-c" "cd /opt/fservice && npm run start"

尴尬的是,容器启动后就会自动退出,这是因为容器运行必须要一个前台进程。因此一个简单的解决办法是修改启动命令,添加tail -f:

1
docker run --name fservice -d -p 80:80 voidking/fservice:v1 "/bin/bash" "-c" "cd /opt/fservice && npm run start > ./start.log && tail -f ./start.log"

但是,更好的办法还是使用supervisor进行node服务的管理。同样需要在容器中安装supervisor,然后进行配置。

1、在/etc/supervisor中新建fservice.conf文件

1
2
3
4
5
6
7
8
[program:fservice]
directory=/opt/fservice
command=npm run start
user=root
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log

2、测试启动

1
2
3
systemctl retart supervisord
supervisorctl status
ps aux | grep fservice

3、编辑/etc/supervisord.conf,设置supervisor为前台进程

1
nodaemon=true

4、把容器保存为镜像

1
docker commit container_id voidking/fservice:v2

5、修改启动命令为

1
docker run --name bservice -d -p 8080:8080 voidking/fservice:v2 "/bin/bash" "-c" "supervisord -c /etc/supervisord.conf"

0%