1. Dockerfile
注意:
镜像可以用其他镜像,需要调整RUN命令自行修改
也可以用没有py环境的镜像(需要打包Python为可执行文件)
安装容器驱动:
需要安装容器驱动,可以在容器中执行docker命令
docker run命令:
-v /var/run/docker.sock:/var/run/docker.sock
将宿主机的dockre.sock挂载进容器,这样可以在容器中获取宿主机docker信息
# 使用官方的 Python 3 镜像作为基础镜像
FROM kochul2000/ubuntu20.04-apt-pip
# 安装系统依赖项
RUN apt-get -y update
RUN apt-get install -y gcc docker.io # 安装容器驱动
# 设置工作目录
WORKDIR /app
# 将 Python 依赖项文件复制到工作目录
COPY requirements.txt .
# 安装 Python 依赖项,如果Python为可执行文件,可以删掉这一步
RUN pip3 install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
# 将当前目录下的所有文件复制到工作目录
COPY . .
# 暴露容器的 8000 端口
EXPOSE 8000
# 在容器启动时运行 Python 脚本
CMD ["python3", "test.py"]
docker run -d -v /var/run/docker.sock:/var/run/docker.sock --name export_node -p 8000:8000 export
2. requirements.txt
此文件为Python脚本中需要import的模块
注意:如果将Python脚本打包成可执行文件,则不需要这个文件
cat requirements.txt
prometheus_client==0.11.0
psutil==5.8.0
3. export_node程序
示例:
如果需要增加监控项:
添加Gauge 类型指标
docker_num = Gauge(‘docker_num’, ‘docker_num’)
并在脚本中获取到相应数据后
docker_num.set(docker_num_value) 将监控数据丢给docker_num
from prometheus_client import start_http_server, Gauge
import psutil
import time
import os
import subprocess
# 创建 CPU 使用率和内存等 Gauge 类型指标
cpu_usage = Gauge('cpu_usage_percent', 'CPU usage percentage')
mem_usage = Gauge('memory_usage_bytes', 'Memory usage in bytes')
docker_num = Gauge('docker_num', 'docker_num')
def collect_metrics():
while True:
# 获取 CPU 使用率和内存使用情况
cpu_percent = psutil.cpu_percent(interval=1)
mem_bytes = psutil.virtual_memory().used
# 获取宿主机docker数量
docker_num_proce = subprocess.Popen("docker ps | grep -v 'CONTAINER ID' | wc -l", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8', universal_newlines=True)
docker_num_output = docker_num_proce.communicate()[0]
docker_num_value = int(docker_num_output.strip())
# 设置指标的值
cpu_usage.set(cpu_percent)
mem_usage.set(mem_bytes)
docker_num.set(docker_num_value)
print(f'CPU usage: {cpu_percent}%, Memory usage: {mem_bytes} bytes')
print(f"docker_num: {docker_num_value}")
# 等待一段时间再次收集数据
time.sleep(5)
if __name__ == '__main__':
# 启动 HTTP 服务器,监听 8000 端口
start_http_server(8000)
# 开始收集数据
collect_metrics()
验证
如下图,输入ip:port可以查看程序发送数据