4.2 Supervisor

系列 - 容器与守护进程运维
目录
摘要
本手册学习使用Supervisor管理容器中的多个进程。
实验准备
实验环境准备
在开始实验前,请确保你的环境干净,没有其他容器干扰实验结果。
- 停止并删除所有容器
# 停止所有运行中的容器
docker stop $(docker ps -q)
# 删除所有容器
docker rm $(docker ps -aq)
实验内容
任务一:使用 Supervisord
摘要
Supervisor是一个进程控制系统,可以用来同时管理多个进程。在Docker容器中,通常一个容器只运行一个进程,但有时我们需要在同一个容器中运行多个相关的进程,这时就可以使用Supervisor来管理这些进程。
本任务使用 supervisord 实现在一个容器中同时运行两个进程(天气报告和新闻广播脚本)。
- 创建项目目录
mkdir -p /root/task/supervisor/conf.d
mkdir -p /root/task/scripts/
# 进入项目目录
cd /root/task/supervisor/conf.d
现在我们已经创建以下结构的目录:
/root/task/
├── scripts # 存放脚本文件
└── supervisor
└── conf.d # 存放supervisor配置文件
- 创建 supervisor 配置文件
vim supervisord.conf
文件内容如下:
[supervisord]
# 设置是否在前台启动
nodaemon=true
# 关闭supervisor自身的日志
logfile=/dev/null
loglevel=error
logfile_maxbytes=0
# 定义被管理的进程
[program:weather_report]
command=/bin/bash /scripts/weather_report.sh
stdout_logfile=/dev/stdout # 将标准输出重定向到容器标准输出
stdout_logfile_maxbytes=0
stdout_events_enabled=false
[program:news_broadcast]
command=/bin/bash /scripts/news_broadcast.sh
stdout_logfile=/dev/stdout # 将标准输出重定向到容器标准输出
stdout_logfile_maxbytes=0
stdout_events_enabled=false
配置文件说明
nodaemon=true
:让supervisord在前台运行,这对Docker容器非常重要logfile=/dev/null
:不保存supervisor自身的日志stdout_logfile=/dev/stdout
:将程序的标准输出重定向到容器的标准输出,方便使用docker logs
查看
- 准备两个脚本
cd /root/task/scripts
wget https://static.seahi.me/2025/04/weather_report.sh
wget https://static.seahi.me/2025/04/news_broadcast.sh
- 编写 Dockerfile
cd /root/task
vim Dockerfile
文件内容如下:
Dockerfile内容说明
从图片中可以看到,Dockerfile主要完成以下工作:
- 使用基础镜像(可能是某个Linux发行版)
- 安装supervisor软件包
- 复制supervisor配置文件和脚本到容器中
- 设置脚本的执行权限
- 设置容器启动命令为运行supervisord
- 构建镜像
docker build -t task-supervisord .
查看构建出的镜像
docker images
镜像构建成功
通过上面的命令,我们成功构建了一个包含supervisor和两个脚本的Docker镜像,名称为
task-supervisord
。- 运行容器
docker run -dit --rm --name supervisor task-supervisord
- 验证
docker logs supervisor -f