【小白包会的】使用supervisor 管理docker内多进程

news2024/12/18 1:43:34

使用supervisor 管理docker内多进程

一般情况下,一个docker是仅仅运行一个服务的

但是有的情况中,希望一个docker中运行多个进程,运行多个服务,也就是一个docker容器执行多个服务。

调研了一下,发现可以通过**supervisor ** 实现,综合对比下来,上手难度和配置相对来说还算简单

总的来说需要在单体服务的基础上做以下操作

  1. 编写supervisord.conf 配置文件
  2. 修改dockerfile文件,包括:下载supervisor, 修改docker入口
举例使用

下面来举例说明supervisor的简单使用:

比如下面的一个目录文件夹:

在这里插入图片描述

包含两个py文件,模拟两个不同的服务,一个服务process1 执行一个循环的进程(这里只是示例,可以是别的什么服务)

# process1.py

from multiprocessing import current_process
import time
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()

def process1():
    while True:
        logger.info(f"i am process 1, in process {current_process().pid}")
        time.sleep(1)

if __name__ == "__main__":
    process1()

process2 来运行一个fasapi服务,服务监听8096端口

import logging
import uvicorn

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

if __name__ == "__main__":
    uvicorn.run(app='run:app', port=8096, host="0.0.0.0")

现在我们有两个进程process1和process2需要在一个docker中运行,我们来看dockerfile实现:

FROM python:3.9-slim AS builder

WORKDIR /app
# 这里将apt源修改为国内源,可选,如果有自己的配置,用自己的
COPY ./sources.list /etc/apt/
    
RUN apt-get update \
    && apt-get upgrade -y\
    && apt-get install -y --no-install-recommends build-essential

# 下载python包
COPY ./requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt

# 实际运行阶段
FROM python:3.9-slim

WORKDIR /app

COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY --from=builder /usr/local/bin/uvicorn /usr/local/bin/uvicorn

COPY . .

COPY ./sources.list /etc/apt/sources.list
# RUN cat /etc/apt/sources.list
# 安装 supervisor 和其他系统工具
RUN apt-get update && apt-get install -y --no-install-recommends supervisor \
    # 创建 supervisor 配置文件夹
    && mkdir -p /etc/supervisor/conf.d

EXPOSE 8096

# 将 supervisor 配置文件复制到容器中
COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# 启动命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

可见相对于单体进程,实际上只是添加和修改了下面这部分

# 安装 supervisor 和其他系统工具
RUN apt-get update && apt-get install -y --no-install-recommends supervisor \
    # && rm -rf /var/lib/apt/lists/* \
    && mkdir -p /etc/supervisor/conf.d

# # 创建 supervisor 配置文件夹
# RUN mkdir -p /etc/supervisor/conf.d

EXPOSE 8096

# 将 supervisor 配置文件复制到容器中
COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# 启动命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

最后# 启动命令 CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

需要根据我们创建的supervisord.conf 启动进程

来看supervisord.conf 的编写:

# supervisord 的配置
[supervisord]
nodaemon=true # 是否为守护进程
pidfile=/var/run/supervisord.pid
logfile=/var/log/supervisor/supervisord.log # supervisord.log的日志,可以看各个进程启动运行情况

# 第一个进程 [program:{进程名}]
[program:process1]
command=python /app/process1.py # 启动命令 注意这里应该使用绝对路劲
autostart=true # 是否自动启动,设为true
autorestart=true # 是否自动重启
stderr_logfile=/var/log/supervisor/process1.err.log # log日志
stdout_logfile=/var/log/supervisor/process1.out.log

[program:fastapi-process]
command=/usr/local/bin/uvicorn --host 0.0.0.0 --port 8096 process2:app # 启动命令uvicorn
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/fastapi-process.err.log
stdout_logfile=/var/log/supervisor/fastapi-process.out.log

而后我们构建该镜像

docker build -t test_supervisor . 构建镜像

启动容器:

docker run -d -p 8096:8096 --name test_supervisor test_supervisor

但是这里查看两个进程的日志需要进到容器里面才行:

可见在容器中的/var/log/supervisor 中创建了几个日志文件正好是我们在supervisord.conf 中配置的文件

在这里插入图片描述

# 先进入容器 docker exec -it test_supervisor bash

# 查看supervisor各进程启动情况
tail -f /var/log/supervisor/supervisord.log

# 查看process1 的log输出日志
tail -f /var/log/supervisor/process1.err.log
#以此类推

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day11 性能测试(3)——Jmeter 断言+关联

【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、复习 2、查看结果树 多个http请求原因分析 3、作业 4、Jmeter断言 4.1 响应断言 4.1.1 案例 4.1.2 小结 4.2 json断言 4.2.1 案例 4.2.2 小结 4.3 断言持续时间 4.3.1 案例 4.3.2 小结 4.…

热更新解决方案3 —— xLua

概述 xLua框架导入和AB包相关准备 xLua导入 其它的导入 C#调用Lua 1.Lua解析器 using System.Collections; using System.Collections.Generic; using UnityEngine; //引用命名空间 using XLua;public class Lesson1_LuaEnv : MonoBehaviour {// Start is called before the fi…

Rk3588 FFmpeg 拉流 RTSP, 硬解码转RGB

RK3588 ,基于FFmpeg, 拉取RTSP,使用 h264_rkmpp 实现硬解码. ⚡️ RK3588 编译ffmpeg参考: Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mpp Code RTSPvoid hardwave_init(AVCo

谷粒商城—分布式高级①.md

1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…

OpenCV圆形标定板检测算法findGrid原理详解

OpenCV的findGrid函数检测圆形标定板的流程如下: class CirclesGridClusterFinder {CirclesGridClusterFinder(const CirclesGridClusterFinder&); public:CirclesGridClusterFinder

30. Three.js案例-绘制并渲染圆弧

30. Three.js案例-绘制并渲染圆弧 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它利用 WebGL 技术在浏览器中渲染 3D 图形。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&#xff…

STM32F407ZGT6-UCOSIII笔记4:时间片轮转调度

本文学习与程序编写基于 正点原子的 STM32F1 UCOS开发手册 编写熟悉一下 UCOSIII系统的 时间片轮转调度 文章提供测试代码讲解、完整工程下载、测试效果图 目录 解决上文的卡系统问题: 使能时间片轮转调度: 任务初始化定义更改: 文件结构…

谭浩强C++课后练习(更新中)

基于过程的程序设计 第1章 C的初步知识 1. 请根据你的了解,叙述C的特点。C对C有哪些发展? 2. 一个 C程序是由哪几部分构成的?其中的每一部分起什么作用? 3. 从接到一个任务到得到最终结果,一般要经过几个步骤? 4. 请说明编辑、编译、连接的作用…

单元测试知识总结

我们希望每段代码都是自测试的,每次改动之后,都能自动发现对现有功能的影响。 1 测试要求 在对软件单元进行动态测试之前,应对软件单元的源代码进行静态测试; 应建立测试软件单元的环境,如数据准备、桩模块、模拟器…

前后端跨域问题(CROS)

前端 在src中创建util文件,写request.js文件: request.js代码如下: import axios from axios import { ElMessage } from element-plus;const request axios.create({// baseURL: /api, // 注意!! 这里是全局统一加…

【数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现顺序查找的算法。 相关知识 为了完成本关任务,你需要掌握:1.根据输入数据建立顺序表,2.顺序表的输出,…

Android 车载虚拟化底层技术-Kernel 5.15 -Android13(multi-cards)技术实现

系列文章请扫点击如下链接! Android Display Graphics系列文章-汇总 本文主要包括部分: 一、Android13的Kernel 5.15版本 1.1 Kernel 5.15 情况说明 1.2 前置条件 二、QCM61*5 plane配置 2.1 multi-card配置 2.2 移植msm-lease 2.3 配置信息确认…

【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )

文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…

C# DLT645 97/07数据采集工具

电表模拟器 97协议测试 07协议测试 private void btnSend_Click(object sender, EventArgs e) {string addr txtAddr.Text.Trim();string data txtDataFlg.Text.Trim();byte control 0x01;switch (cmbControl.SelectedIndex){case 0: control (byte)0x01; break;// 97协议c…

颜色代码表: 一站式配色方案设计工具集网站

大家好,我是一名设计师,同时也是一名开发者。平时的工作中,相信很多设计师和我一样经常遇到一个问题:设计配色方案时,工具太分散了。寻找颜色搭配灵感需要去一个网站,颜色代码转换要开另一个,检…

Android显示系统(13)- 向SurfaceFlinger提交Buffer

Android显示系统(01)- 架构分析 Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角…

WebSocket 与 Server-Sent Events (SSE) 的对比与应用

目录 ✨WebSocket:全双工通信的利器📌什么是 WebSocket?📌WebSocket 的特点📌WebSocket 的优点📌WebSocket 的缺点📌WebSocket 的适用场景 ✨Server-Sent Events (SSE):单向推送的轻…

Mysql 深度分页查询优化

Mysql 分页优化 1. 问题根源 问题: mysql在数据量大的时候,深度分页数据偏移量会增大,导致查询效率越来越低。 问题根源: 当使用 LIMIT 和 OFFSET 进行分页时,MySQL 必须扫描 OFFSET LIMIT 行,然后丢弃前…

SpringBoot - 动态端口切换黑魔法

文章目录 关键技术点核心原理Code 关键技术点 利用 Spring Boot 内嵌 Servlet 容器 和 动态端口切换 的方式实现平滑更新的方案,关键技术点如下: Servlet 容器重新绑定端口:Spring Boot 使用 ServletWebServerFactory 动态设置新端口。零停…

linux(CentOS8)安装PostgreSQL16详解

文章目录 1 下载安装包2 安装3 修改远程连接4 开放端口 1 下载安装包 官网下载地址:https://www.postgresql.org/download/ 选择对应版本 2 安装 #yum源 yum -y install wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redha…