使用openrc 管理容器中的服务

对于后台任务一般是不建议在容器中运行的,但是如果我们为了简化应用的部署,可能会使用后台任务进行服务的管理,类似的
工具很多,supervisor,systemd , init.d 同时对于docker 的alpine 容器镜像我们可以使用openrc,以下是一个简单的demo,也是
借鉴子haproxy 的ingress 组件

目的

通过使用openrc 管理容器中haproxy 服务的启动(可以在修改配置之后,重启服务,而不用重新启动容器)

环境准备

包含了haproxy 的监控,以及dataplaneapi 还有dashboard

  • docker-compose 文件
version: "3"
services:
    grafana:
     image: grafana/grafana
     ports:
     - "3000:3000"
    prometheus:
     image: prom/prometheus
     volumes:
     - "./prometheus.yml:/etc/prometheus/prometheus.yml"
     ports:
     - "9090:9090"
    haproxy:
     image: dalongrong/dumb-init-haproxy-dataplan:2.0.5
     build: ./
     volumes:
     - "./haproxy.cfg:/etc/haproxy/haproxy.cfg"
     ports:
     - "80:80"
     - "6379:6379"
     - "5555:5555"
     - "8404:8404"
     - "8080:8080"
     - "9000:9000"
     - "9001:9001"
     - "9002:9002"
     - "1000-1005:1000-1005"
     - "10080:10080"
    nginx1:
     image: nginx
     ports:
     - "8090:80"
    nginx2:
     image: nginx
     ports:
     - "8091:80"      
  • haproxy dockerfile
FROM haproxy:2.0.5-alpine
# 添加依赖的服务openrc
RUN apk update && apk add --no-cache openrc htop
## 使用dumb-init 接管进程1
RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64
RUN chmod +x /usr/local/bin/dumb-init
COPY start.sh /start.sh
RUN chmod +x /start.sh
COPY haproxy /etc/init.d/haproxy
COPY dataplaneapi /usr/local/sbin/dataplaneapi
RUN chmod +x /usr/local/sbin/dataplaneapi
RUN chmod +x /etc/init.d/haproxy
ENTRYPOINT [ "/usr/local/bin/dumb-init","--","/start.sh" ]
  • start.sh
    很简单的一个脚本,规避容器停止的
#!/bin/sh
set -e
while true 
do
    sleep 10
    echo "demo"
done
  • prometheus 监控配置
scrape_configs:
  - job_name: haproxy
    metrics_path: /metrics
    scrape_interval: 10s
    scrape_timeout: 10s
    static_configs:
      - targets: [‘haproxy:8404‘]
  • openrc haproxy 启动脚本
#!/bin/sh
?
case "$1" in 
start)
   if [ -e /var/run/haproxy.pid ]; then
      echo haproxy is running, pid=`cat /var/run/haproxy.pid`
      exit 1
   else
      haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
   fi   
   ;;
stop)
   kill -USR1 `cat /var/run/haproxy.pid`
   rm /var/run/haproxy.pid
   ;;
restart)
   $0 apply
   ;;
reload)
   $0 apply
   ;;
status)
   if [ -e /var/run/haproxy.pid ]; then
      echo haproxy is running, pid=`cat /var/run/haproxy.pid`
   else
      echo haproxy is NOT running
      exit 1
   fi
   ;;
apply)   
   if [ -e /var/run/haproxy.pid ]; then
      haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
   else
      $0 start
   fi
   ;;
push_apply)   
   $0 apply
   ;;
validate)   
   haproxy -c -f /etc/haproxy/haproxy.cfg
   ;;
*)
   echo "Usage: $0 {start|stop|status|reload}"
esac
?
exit 0

启动&&效果

  • 启动
docker-compose build
docker-compose up -d
  • 进入容器启动haproxy
docker-compose exec haproxy sh
service haproxy start
  • 效果

容器服务

grafana(导入了haproxy2.0 的配置)

haproxy 代理服务

promethesu 服务

haproxy stats

说明

以上是一个简单的操作,实际上类似的需求在实际中还是有的(尽管推荐大家容器只跑一个服务),比如kubernetes 的ingress 组件好多就用了
这种方式解决运行的问题,比如以下nginx-ingress 的

参考资料

https://wiki.gentoo.org/wiki/OpenRC
https://github.com/OpenRC/openrc
https://wiki.alpinelinux.org/wiki/Writing_Init_Scripts
https://github.com/rongfengliang/alpine-docker-openrc-haproxy

原文地址:https://www.cnblogs.com/rongfengliang/p/11453481.html

时间: 2024-11-04 15:49:43

使用openrc 管理容器中的服务的相关文章

zabbix自发现实时监控docker容器及容器中各个服务的状态线上业务展示

本文从开始到监控docker容器状态分为三部分1.查看自己的环境变量以及自己的服务路径(1)jdk环境: jdk1.8(2)zabbix版本:zabbix3.4.5(3)zabbix脚本存放路径:/data/zabbix/scripts/( 4 ) .conf文件存放路径:/data/zabbix/etc/zabbix_agentd.conf.d/ 2.配置脚本.key.模板首选,zabbix_agentd 配置 vim/data/zabbix/etc/zabbix_agentd.conf.d/

[docker] 管理docker容器中的数据

之前我们介绍了Docker的基本概念(前面的没翻译...),了解了如何使用Docker镜像进行工作,并且学习了网 络和容器之间的链接.这一节我们将讨论如何管理容器中及容器之间的数据. 我们将查看下面两种管理Docker中数据的主要方法. 数据卷 数据卷容器 数据卷 一个数据卷就是经过特殊设计的,在一个或多个容器中通过UFS文件系统提供的一些特性 实现数据持久化或共享. 数据卷可以在容器之间共享和重复利用 可以对数据卷里的内容直接进行修改 对镜像的更新不会改变数据卷的内容 卷会一直持续到没有容器使

windowsf进程管理器中进程解释

(1)[system Idle Process] 进程文件: [system process] or [system process] 进程名称: Windows内存处理系统进程 描 述: Windows页面内存管理进程,拥有0级优先. 介 绍:该进程作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间.它的cpu占用率越大表示可供分配的CPU资源越多,数字越小则表示CPU资源紧张. (2)[alg.exe] 进程文件: alg or alg.exe 进程名称: 应用层网关

在win10 docker启动的centos容器中安装nginx

我是在win10机器上搭建了一个docker,在docker启动了centos容器,在centos中安装nginx. 安装配置docker 直接在官网下载docker for windows:https://store.docker.com/editions/community/docker-ce-desktop-windows 下载完成,点击按照默认一步步安装就行了. 如果希望加快pull镜像的速度,可以选择配置一个阿里云镜像加速器. 安装centos 用管理员身份运行docker,根据实践来

无需安装 vsftpd , 直接使用 FTP 来管理 docker 容器中的文件

无图无真相,先放个效果图: 背景 使用 docker 来跑一些服务很方便,但是有的时候想管理容器里面的文件却很麻烦 -- 一般常规做法有3种: 通过数据卷或数据卷容器的方式 启动容器的时候时候启动 vsftpd 或者 sshd 等服务,并开启端口映射,然后通过 ftp/sftp 连上去管理 进入容器的终端,通过命令行管理 但是这些做法都有一定的缺陷和不便: 1和2都是需要在启动容器的时候做一些配置,如果容器已经启动了就歇菜了.而且2需要额外的端口映射,占用主机的端口.3的做法比较 geek ,而

通用电气GE微服务实践:在容器中部署有状态应用

通用电气GE 通用电气GE,创立于1892年,是世界上最大的技术和服务跨国公司.自托马斯·爱迪生创建通用电气公司以来,业务遍及世界上100多个国家,拥有员工315,000人. GE在航空,电力,运输,能源等行业具备丰富的产品线和运营经验.同时GE也通过数字化的方式帮助客户进行产品的运维,数据分析和改进.GE为此建立了自己的物联网数字化平台. GE采用微服务架构,并通过容器来运行有状态应用.为此,需要建立CSI(Container Storage Interface),GE尝试了一些办法,但是从使

9.Laravel5学习笔记:在laravel中注册自己的服务到容器中

问题描述 也许标题写的不够清楚,实际情况是,在我使用laravel的过程中,需要将自己的一个类,通过服务提供者注册到IOC容器中,但是在实际操作过程中,出现了以下错误: Unresolvable dependency resolving [Parameter #0 [ <required> $name ]] 意思就是说,我的注册东西,不能够进行类型转换.我的代码中没有进行代码说明需要的类型. 代码情况 代码主要实现的一个功能是,对传入的字符串进行AES加密.本来Laravel自身是提供了的,但

9.Laravel5学习笔记:在laravel中注冊自己的服务到容器中

问题描写叙述 或许标题写的不够清楚.实际情况是,在我使用laravel的过程中.须要将自己的一个类,通过服务提供者注冊到IOC容器中,可是在实际操作过程中.出现了下面错误: Unresolvable dependency resolving [Parameter #0 [ <required> $name ]] 意思就是说.我的注冊东西,不能够进行类型转换. 我的代码中没有进行代码说明须要的类型. 代码情况 代码主要实现的一个功能是,对传入的字符串进行AES加密. 本来Laravel自身是提供

PHP中的服务容器与依赖注入的思想

依赖注入 当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合.这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部. 就拿我们业务中常用的通知模块来说. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php /**  * 定义了一个消息类  * Class Messag