【Docker】Supervisor 实现单容器运行多服务进程
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)
【K8s】专题十五(6):Kubernetes 网络之 Pod 网络调试
目录
一、背景介绍
二、Supervisor 介绍
1、基本概念
2、主要作用
3、工作原理
三、Supervisor 使用
1、生成 Dockerfile 文件
2、生成 supervisord.conf 文件
3、构建镜像
三、Supervisorctl 常用命令
一、背景介绍
近期笔者在工作中遇到一个特殊的需求场景,即在单个容器中同时运行 php-fpm 和 nginx 服务,并通过 cron 服务管理计划任务。
由于使用 systemctl 工具管理进程相对复杂,笔者最终选用 Supervisor 工具来实现上述需求。本文将对 Supervisor 的相关知识、使用方法等进行详细介绍。
二、Supervisor 介绍
1、基本概念
Supervisor 是一个基于 Python 开发的进程管理工具,主要用于监控、控制 Linux 操作系统上的多个进程,通过将命令行进程转变为后台守护进程,并提供监控和自动重启功能,以确保服务的高可用性。
Supervisor 采用 C/S(客户端/服务端)架构来实现进程管理:
- 服务端:即主进程 supervisord
- supervisord 启动时会生成配置文件中定义的子进程,并监控子进程的状态,当子进程崩溃时对其进行自动重启
- 客户端:即命令行工具 supervisorctl
- supervisorctl 通过 Unix 域套接字或 TCP 套接字与服务端进行通信,允许用户与 supervisord 主进程进行交互,对子进程执行启动、停止、重启、查看状态等操作
2、主要作用
- 管理进程:Supervisor 可以启动、停止、重启和监控多个进程,确保进程异常退出后能够自动重启
- 记录日志:Supervisor 可以记录子进程的标准输出和错误输出,方便用户进行监控、调试、排查问题等
- 灵活配置:Supervisor 可以指定配置文件内容,方便用户灵活地配置需要管理的进程及其属性。默认配置文件为 /etc/supervisor/supervisord.conf
- 集中管理:Supervisor 可以对多个进程、进程组进行集中管理,方便用户操作
3、工作原理
- Supervisord 作为主进程启动,并置于守护进程模式
- Supervisord 根据配置文件中的设置,逐一启动子进程
- Supervisord 通过操作系统信号机制,实时监控子进程的运行状态
- Supervisord 在子进程状态异常时接收到控制信号,按照配置文件中的设置对子进程进行重启等操作
三、Supervisor 使用
以背景介绍中的需求场景为例,使用已安装 fpm 的 php 官方镜像作为基础进行 Docker 镜像构建,安装 supervisor、nginx、cron 服务,并自定义 Supervisor 配置文件 supervisord.conf。
1、生成 Dockerfile 文件
cat > Dockerfile << EOF
FROM php:7.4.33-fpmRUN sed -i 's#deb.debian.org#mirrors.aliyun.com#g' /etc/apt/sources.list
RUN apt-get update && \apt-get install -y supervisor nginx cron \&& rm -rf /var/lib/apt/lists/* \&& mkdir -p /etc/supervisor/conf.d/
COPY supervisord.conf /etc/supervisor/conf.d/
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]EOF
2、生成 supervisord.conf 文件
cat > supervisord.conf <<EOF
[supervisord] # 定义主进程
nodaemon=true # Supervisor 默认处于守护进程模式,而在容器中则需要处于前台运行以保持容器活跃[program:php-fpm] # 定义子进程
command=bash -c "sleep 1 && php-fpm"
process_name=%(program_name)s
user=root
autostart=true
autorestart=true
startretries=5
exitcodes=0,2,70
stopsignal=QUIT
stopwaitsecs=2
stdout_logfile=/var/log/supervisor/php-fpm.log[program:nginx]
command=bash -c "sleep 1 && /usr/sbin/nginx -g 'daemon off;'"
process_name=%(program_name)s
user=root
autostart=true
autorestart=true
startretries=5
exitcodes=0,2,70
stopsignal=INT
stopwaitsecs=2
stdout_logfile=/var/log/supervisor/nginx.log[program:cron]
command=bash -c "sleep 1 && /usr/sbin/cron -f" # cron 需要添加 -f 参数确保处于前台运行
process_name=%(program_name)s
user=root
autostart=true
autorestart=true
startretries=5
exitcodes=0,2,70
stopsignal=QUIT
stopwaitsecs=2
stdout_logfile=/var/log/supervisor/cron.logEOF
部分可配置参数说明如下:
## 全局配置
[unix_http_server]
# file:指定 UNIX 域套接字的位置,供 supervisorctl 和 supervisord 进行通信,例如:
file=/opt/super/supervisor.sock
---------------------------------------------------------------------------------
[inet_http_server]
# port:指定 Web 界面 TCP 监听的 IP 和端口,例如:
port=127.0.0.1:9001
---------------------------------------------------------------------------------
[supervisord]
# logfile:supervisord 日志文件路径,默认值为 $CWD/supervisord.log
# logfile_maxbytes:supervisord 日志文件的最大字节数,超过后会创建新文件,设置为 0 表示不限制
# logfile_backups:保留的日志文件备份数量
# loglevel:日志记录等级,默认为 INFO
# pidfile:supervisord PID 文件路径,默认值为 $CWD/supervisord.pid
# nodaemon:默认为 false,以守护进程模式运行;如果设置为 true,则以前台模式运行
-----------------------------------------------------------------------------------------------------
## 进程管理
[program:test-server]
# command:进程启动命令
# process_name:进程名称
# user:进程启动用户
# directory:启动命令执行前切换到的目录
# autostart:是否随 supervisord 启动而自动启动该进程,默认为 true
# autorestart:是否在进程退出时自动重启,默认为 true
# startretries:启动失败时重试次数上限
# stopsignal:停止进程时发送的信号,例如 INT、QUIT
# stdout_logfile:指定标准输出的日志文件路径,可以是 /dev/stdout
# stderr_logfile:指定标准错误的日志文件路径,可以是 /dev/stderr
-----------------------------------------------------------------------------------------------------
## 配置包含
[include]
files=/etc/supervisor/conf.d/*.ini
3、构建镜像
docker build -t php:7.4.33-fpm-nginx -f Dockerfile . --no-cache
三、Supervisorctl 常用命令
# 查看进程状态(所有)
supervisorctl status all# 查看进程状态(指定)
supervisorctl status <process_name># 启动进程(所有)
supervisorctl start all# 启动进程(指定)
supervisorctl start <process_name># 停止进程(所有)
supervisorctl stop all# 停止进程(指定)
supervisorctl stop <process_name># 重启进程(所有)
supervisorctl restart all# 重启进程(指定)
supervisorctl restart <process_name># 更新配置(所有)
supervisorctl update all# 更新配置(指定)
supervisorctl update <process_name># 清空进程日志(所有)
supervisorctl clear all# 清空进程日志(指定)
supervisorctl clear <process_name># 查看帮助
supervisorctl -h
相关文章:
【Docker】Supervisor 实现单容器运行多服务进程
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全…...
【网络协议】【http】【https】ECDHE-TLS1.2
【网络协议】【http】【https】ECDHE-TLS1.2 ECDHE算法 1.客户端和服务器端事先确定好使用哪种椭圆曲线,和曲线上的基点G,这两个参数都是公开的, 双方各自随机生成一个随机数作为私钥d,并与基点 G相乘得到公钥Q(QdG),…...
(十五)WebGL中gl.texImage2D函数使用详解
在 WebGL 中,gl.texImage2D 是一个非常关键的函数,用于将图像数据上传到 WebGL 上下文中并作为纹理对象的一部分。它允许你将图像、视频、画布等作为纹理源。理解如何使用 gl.texImage2D 是在 WebGL 中处理纹理的核心之一。 文章目录 gl.texImage2D 的基…...
CSS 颜色
所有浏览器都支持的颜色名 所有现代浏览器均支持以下 140 种颜色名称(单击颜色名称或十六进制值,可查看将以该颜色为背景颜色以及不同的文本颜色): 颜色名十六进制颜色值颜色AliceBlue#F0F8FFAntiqueWhite#FAEBD7Aqua#00FFFFAqu…...

C#,入门教程(03)——Visual Studio 2022编写彩色Hello World与动画效果
C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123350910 C#,入门教程(02)—— Visual Studio 2022开发环境搭建图文教程https://blog.csdn.net/beijinghorn/article/detail…...

杀死安装 CentOS-7-x86_64-DVD-1908
使用 VMware 安装 CentOS-7-x86_64-DVD-1908 CentOS是 reahat 的 免费版本,有了ubutun ,为什么还要使用 CentOS呢? 在linux 服务器实际开发中,大家都用的CentOS,因为两个原因,一个是免费,第二是…...

55.【5】BUUCTF WEB NCTF2019 sqli
进入靶场 输入admin 123 过滤的这么严格??? 过滤很严格,此时要么爆破,要么扫描 直接扫描,得到robots.txt 访问后又得到hint.txt 继续访问 图片内容如下 $black_list "/limit|by|substr|mid|,|admi…...

LeetCode 题目 2545. 根据第 K 场考试的分数排序
在本篇文章中,我们将探讨如何根据第 K 场考试的分数对学生进行排序。这个问题是 LeetCode 上的一个中等难度问题,涉及到排序算法和自定义比较函数的使用。 问题描述 解题思路 理解问题 首先,我们需要理解问题的核心:根据第 K 场…...
算法随笔_12:最短无序子数组
上一篇: 算法随笔_11: 字符串的排列-CSDN博客 题目描述如下: 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的最短子数组,并输出它的长度。…...

计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

Linux-C/C++--初探linux应用编程概念
对于大多数首次接触 Linux 应用编程的读者来说,可能对应用编程(也可称为系统编程)这个概念并不 太了解,所以在正式学习 Linux 应用编程之前,笔者有必要向大家介绍这些简单基本的概念,从整体上认识 到应用编…...
用sklearn运行分类模型,选择AUC最高的模型保存模型权重并绘制AUCROC曲线(以逻辑回归、随机森林、梯度提升、MLP为例)
诸神缄默不语-个人CSDN博文目录 文章目录 1. 导入包2. 初始化分类模型3. 训练、测试模型,绘图,保存指标 1. 导入包 from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier, GradientBoostingClass…...

动手学大数据-3社区开源实践
目录 数据库概览: MaxComput: HAWQ: Hologres: TiDB: Spark: ClickHouse: Apache Calcite 概览 Calcite RBO HepPlanner 优化规则(Rule) 内置有100优化规则 …...

使用Pydantic驾驭大模型
本文介绍Pydantic 库,首先介绍其概念及优势,然后通过基本示例展示如何进行数据验证。后面通过多个示例解释如何在LangChain中通过Pydantic进行数据验证,保证与大模型进行交互过程中数据准确性,并显示清晰的数验证错误信息。 Pydan…...

【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局
目录 1 -> 自适应布局 1.1 -> 线性布局 1.1.1 -> 线性布局的排列 1.1.2 -> 自适应拉伸 1.1.3 -> 自适应缩放 1.1.4 -> 定位能力 1.1.5 -> 自适应延伸 1.2 -> 层叠布局 1.2.1 -> 对齐方式 1.2.2 -> Z序控制 1.3 -> 弹性布局 1.3.1…...

【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界
目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础:揭开神秘面纱 (一)工作原理:步步为营的数据狩猎 (二)分类:各显神通的爬虫家族 三、Python 网络爬虫核心库深度剖析 &…...
队列的基本用法
以下是关于 C 语言中队列的详细知识,包括队列的生成、相关函数使用以及其他重要概念: 一、队列的概念 队列是一种线性数据结构,它遵循先进先出(First In First Out,FIFO)的原则,就像日常生活中…...

网络安全VS数据安全
关于网络安全和数据安全,我们常听到如下两种不同声音: 观点一:网络安全是数据安全的基础,把当年做网络安全的那一套用数据安全再做一遍。 观点二:数据安全如今普遍以为是网络安全的延伸,实际情况是忽略数据…...

Linux(NFS服务)
赛题拓扑: 题目: NFS: 共享/webdata/目录。用于存储AppSrv主机的WEB数据。仅允许AppSrv主机访问该共享。 [rootstoragesrv ~]# yum install nfs-utils -y [rootstoragesrv ~]# mkdir /webdata [rootstoragesrv ~]# chmod -R ow /webdata …...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测
OpenCV中边缘检测四种常用算子: (1)Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度,并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核,分别用于计…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...