4.2 Supervisor

系列 - 容器与守护进程运维
摘要
本手册学习使用Supervisor管理容器中的多个进程。
实验环境准备
在开始实验前,请确保你的环境干净,没有其他容器干扰实验结果。
  1. 停止并删除所有容器

bash

# 停止所有运行中的容器
docker stop $(docker ps -q)
# 删除所有容器
docker rm $(docker ps -aq)
摘要
Supervisor是一个进程控制系统,可以用来同时管理多个进程。在Docker容器中,通常一个容器只运行一个进程,但有时我们需要在同一个容器中运行多个相关的进程,这时就可以使用Supervisor来管理这些进程。

本任务使用 supervisord 实现在一个容器中同时运行两个进程(天气报告和新闻广播脚本)。

  1. 创建项目目录

bash

mkdir -p /root/task/supervisor/conf.d
mkdir -p /root/task/scripts/
# 进入项目目录
cd  /root/task/supervisor/conf.d

现在我们已经创建以下结构的目录:

text

/root/task/
├── scripts        # 存放脚本文件
└── supervisor
    └── conf.d     # 存放supervisor配置文件
  1. 创建 supervisor 配置文件

bash

vim supervisord.conf

文件内容如下:

ini

[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查看
  1. 准备两个脚本

bash

cd /root/task/scripts
wget https://static.seahi.me/2025/04/weather_report.sh
wget https://static.seahi.me/2025/04/news_broadcast.sh
  1. 编写 Dockerfile

bash

cd /root/task
vim Dockerfile

文件内容如下:

TkgdGq

Dockerfile内容说明

从图片中可以看到,Dockerfile主要完成以下工作:

  1. 使用基础镜像(可能是某个Linux发行版)
  2. 安装supervisor软件包
  3. 复制supervisor配置文件和脚本到容器中
  4. 设置脚本的执行权限
  5. 设置容器启动命令为运行supervisord
  1. 构建镜像

bash

docker build -t task-supervisord .

I2nXm2

查看构建出的镜像

bash

docker images

gjoeTB

镜像构建成功
通过上面的命令,我们成功构建了一个包含supervisor和两个脚本的Docker镜像,名称为task-supervisord
  1. 运行容器

bash

docker run -dit --rm --name supervisor task-supervisord
  1. 验证

bash

docker logs supervisor -f

wA7WuD

相关内容