热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Docker入门私人笔记(八)使用Supervisor管理容器多进程

Docker入门私人笔记(八)使用Supervisor管理容器多进程-Supervisor是一个CS模式的进程管理工具。它使用Python开发。支持LinuxUnix系统,不支持W

Supervisor 是一个 C/S 模式的进程管理工具。它使用 Python 开发。支持 Linux/Unix 系统,不支持 Windows 系统。它的功能包含监听、启动、停止、重启一个或多个进程。用 Supervisor 管理进程,当一个进程挂掉并且被 supervisort 监听到之后,可以自动将它重新拉起,即做到进程自动恢复的功能,不再需要写 shell 脚本来控制。

实战:制作 supervisor 镜像

1. 新建 Dockerfile

cd /data/dockerfile/system/
mkdir centos-ssh-supervisor
cd centos-ssh-supervisor/

vim Dockerfile,Dockerfile 配置如下,对比前文中的制作的 docker 镜像 system/centos:v2,本次仅在 Dockerfile 中增加了 supervisor 的安装和启动步骤:

#Base Image 指定基础镜像
FROM centos

#Maintainer 镜像维护者的信息
MAINTAINER lu 13510182959@126.com

#Run
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y wget sudo git tree net-tools openssh-clients openssh-server openssh-devel supervisor && yum clean all
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key

#Set root password
RUN echo "root:lusibo@123" | chpasswd

#For supervisor
#已经提前准备好了现成的相关配置文件 supervisor.conf 和 sshd.ini 放到宿主机内,制作镜像时从宿主机复制到镜像内即可
ADD supervisord.conf /etc/supervisord.conf
ADD sshd.ini /etc/supervisord.d/sshd.ini

#Outside port
EXPOSE 22

#让容器启动后运行 supervisor
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]

2. 准备配置文件 supervisord.conf

由于 supervisor 的配置文件 supervisord.conf 的内容非常多,为了制作镜像方便以及编写 Dockerfile 更省事,事先找一个测试机安装一遍 supervisor(添加 elep 源后 yum 安装即可),并获取配置文件 supervisord.conf 放到宿主机内。也可以在网上搜索 supervisor.conf 的配置拿过来修改。在制作镜像的过程中通过 Dockerfile 的 ADD 命令将配置文件复制到镜像内即可。

3. 修改 supervisor.conf 和 编辑 sshd.ini

vim /etc/supervisord.conf
找到 nodaemon=false,改为 nodaemon=true ,使 supervisor 进程在前台启动运行。

supervisor 最佳实践:
vim /etc/supervisord.conf
找到如下配置内容:

[include]
files = supervisord.d/*.ini

这段代码,可以方便的实现任何需要运行的进程的配置。如果希望 supervisor 管理哪个进程,就把该进程的配置写成一个单独的 ini 文件放到 /etc/supervisord.d/ 目录下就行了。例如:对 sshd 的进程管理,可以在文件 /etc/supervisord.d/sshd.ini 中配置。类似 nginx 实例。

在 /etc/supervisord.conf 中找到如下代码,这是 *.ini 的配置示例:

;[program:theprogramname]
;command=/bin/cat              ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=999                  ; the relative start priority (default 999)
;autostart=true                ; start at supervisord start (default: true)
;autorestart=true              ; retstart at unexpected quit (default: true)
;startsecs=10                  ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;envirOnment=A=1,B=2           ; process environment additions (def no adds)
;serverurl=AUTO                ; override serverurl computation (childutils)

在 Dockerfile 的同级目录内创建 sshd.ini 文件并配置:
vim /etc/supervisord.d/sshd.ini

[program:sshd]
command=/usr/bin/sshd -D
process_name=%(program_name)s
autostart=true

注意:
此时在目录 /data/dockerfile/system/centos-ssh-supervisor 下应该有3个文件:
Dockerfile,sshd.ini,supervisord.conf

运行这个 Dockerfile 创建新的镜像,此次将镜像命名为 system/centos:v3:

docker build -t system/centos:v3 .

镜像制作成功后,用它启动一个容器:

docker run -d --name centos-ssh-supervisor -p 2222:22 system/centos:v3

通过 ssh 方式登录这个容器:

ssh -p 2222 root@192.168.100.151

查看容器中运行的进程发现 PID 1 是 supervisord,这说明目的已经达到了。同时还能看到正在运行的 sshd 进程。

[root@2476182f0bce ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.3 115676 14804 ?        Ss   07:54   0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root         8  0.0  0.1 112864  4288 ?        S    07:54   0:00 /usr/sbin/sshd -D
root         9  0.0  0.1 153152  5984 ?        Ss   07:54   0:00 sshd: root@pts/0
root        11  0.0  0.0  15252  1992 pts/0    Ss   07:54   0:00 -bash
root        24  0.0  0.0  55172  1864 pts/0    R+   07:57   0:00 ps aux

运行命令 supervisorctl status 可以看到 supervisor 目前管理了一个进程就是 sshd:

[root@2476182f0bce ~]# supervisorctl status
sshd                             RUNNING   pid 8, uptime 0:09:54

附:来自网络的案例,supervisor 配置可供参考如下:
为将要在docker内运行的的程序创建一个.conf文件,放在目录"/etc/supervisor/conf.d/"下

[program:FileDown] ;程序名称,终端控制时需要的标识
command=/usr/bin/filedown start ; 运行程序的命令
directory=/usr/bin/ ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/filedown.err.log ; 错误日志文件
stdout_logfile=/var/log/filedown.out.log ; 输出日志文件
envirOnment=ASPNETCORE_ENVIROnMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT

推荐阅读
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 如何在任意浏览器中轻松安装并使用VSCode——Codeserver简易指南
    code-server 是一款强大的工具,允许用户在任何服务器上部署 VSCode,并通过浏览器进行访问和使用。这一解决方案不仅简化了开发环境的搭建过程,还提供了高度灵活的工作方式。用户只需访问 GitHub 上的官方仓库(GitHub-coder/code-server),即可获取详细的安装和配置指南,快速启动并运行 code-server。无论是个人开发者还是团队协作,code-server 都能提供高效、便捷的代码编辑体验。 ... [详细]
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 1. 设置用户密码:使用 `slappasswd` 工具生成加密密码,确保账户安全。具体步骤如下:输入命令 `slappasswd -s NewPassword`,系统将提示重新输入新密码,并生成加密后的哈希值 {SSHA}xxxxxxxxxxxxxxxxx。2. 编写配置文件:编辑 `vildapus` 配置文件,添加必要的用户账户信息,以确保新用户能够顺利登录系统。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • Linux Shell变量初探:初始值解析与使用指南
    本文探讨了Linux Shell中变量的基本概念及其在BASH中的应用。变量是用于存储可变数据的标识符,能够代表不同的值。文章详细介绍了BASH shell的主要优势,包括强大的命令编辑能力、自动补全功能、命令别名设置、作业控制以及前后台任务管理。此外,还涵盖了编程脚本编写和通配符的使用方法,为初学者提供了全面的指导。 ... [详细]
  • 在 openSUSE Tumbleweed 系统上搭建 51 单片机开发环境并进行编程实践。首先,通过 `sudo zypper in emacs` 命令安装文本编辑器 Emacs。接着,使用 `sudo zypper in sdcc` 安装 SDCC 编译器。最后,利用 `wget` 下载 sdcflash Python 脚本,以便于单片机的烧录和调试。此外,还介绍了如何配置开发环境,确保各组件协同工作,提高开发效率。 ... [详细]
author-avatar
wugege
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有