【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的卷积核,分别用于计…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
uniapp获取当前位置和经纬度信息
1.1. 获取当前位置和经纬度信息(需要配置高的SDK) 调用uni-app官方API中的uni.chooseLocation(),即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...