文章目录
- 一、概述
- 二、官方docker部署
- 1. vnStat守护进程和HTTP服务器在同一容器中运行
- 2. 双容器运行,vnstat容器收集数据,vnstati容器提供web服务
- 三、修改后的编排文件
- 四、运行结果
- 五、停止监控不感兴趣的网卡
一、概述
vnStat是一款网络流量监测工具,它利用内核提供的网络接口统计数据作为信息来源。这意味着vnStat并不会实际嗅探任何流量,同时也确保了无论网络流量大小,系统资源的轻量级使用。
默认情况下,流量统计以五分钟级别保存最近48小时的数据,以小时级别保存最近4天,以日级别保存过去两个完整月,以年级别永久保存。数据保留期限完全可由用户配置。同时提供总流量和最活跃日期列表。
运行效果先睹为快:https://http.00fly.online/
二、官方docker部署
1. vnStat守护进程和HTTP服务器在同一容器中运行
这个示例对于大多数用户来说可以直接使用,但会导致HTTP服务器也使用主机网络,这可能不是某些用户所期望的功能。
docker-compose.yml
version: "3.7"
services:
vnstat:
image: vergoh/vnstat:latest
container_name: vnstat
restart: unless-stopped
network_mode: "host"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- vnstatdb:/var/lib/vnstat
environment:
- HTTP_PORT=8685
- HTTP_BIND=*
- HTTP_LOG=/dev/stdout
- LARGE_FONTS=0
- CACHE_TIME=1
- RATE_UNIT=1
- INTERFACE_ORDER=0
- QUERY_MODE=0
- DARK_MODE=0
- PAGE_REFRESH=0
volumes:
vnstatdb:
2. 双容器运行,vnstat容器收集数据,vnstati容器提供web服务
vnStat守护进程在一个容器(vnstat)中运行,使用主机网络来访问所有网络接口,但不提供任何服务或绑定端口。第二个容器(vnstati)不使用主机网络,而是提供HTTP服务器,使用只读共享卷访问统计信息。
docker-compose.yml
version: "3.7"
services:
vnstat:
image: vergoh/vnstat:latest
container_name: vnstat
restart: unless-stopped
network_mode: "host"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- vnstatdb:/var/lib/vnstat
environment:
- HTTP_PORT=0
vnstati:
image: vergoh/vnstat:latest
container_name: vnstati
restart: unless-stopped
ports:
- "8685:8685"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- vnstatdb:/var/lib/vnstat:ro
environment:
- HTTP_PORT=8685
- HTTP_LOG=/dev/stdout
- LARGE_FONTS=0
- CACHE_TIME=1
- RATE_UNIT=1
- INTERFACE_ORDER=0
- QUERY_MODE=0
- DARK_MODE=0
- PAGE_REFRESH=0
- RUN_VNSTATD=0
volumes:
vnstatdb:
三、修改后的编排文件
本人部署使用的编排文件内容如下:
docker-compose.yml
version: "3.7"
services:
vnstat-data:
image: vergoh/vnstat:latest
container_name: vnstat
deploy:
resources:
limits:
cpus: '1.0'
memory: 10M
reservations:
cpus: '0.80'
memory: 6M
restart: unless-stopped
network_mode: "host"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./vnstatdb:/var/lib/vnstat
environment:
- HTTP_PORT=0
- EXCLUDE_PATTERN=^docker|^veth|^br-
logging:
driver: 'json-file'
options:
max-size: '5m'
max-file: '1'
vnstat-web:
image: vergoh/vnstat:latest
container_name: vnstat-web
deploy:
resources:
limits:
cpus: '1.0'
memory: 20M
reservations:
cpus: '0.80'
memory: 10M
restart: unless-stopped
ports:
- 8086:8685
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./vnstatdb:/var/lib/vnstat:ro
environment:
- HTTP_PORT=8685
- HTTP_LOG=/dev/stdout
- LARGE_FONTS=0
- CACHE_TIME=1
- RATE_UNIT=1
- INTERFACE_ORDER=0
- QUERY_MODE=0
- DARK_MODE=0
- PAGE_REFRESH=30
- RUN_VNSTATD=0
logging:
driver: 'json-file'
options:
max-size: '5m'
max-file: '1'
四、运行结果
部署完成后,等待5分钟,访问:http://124.71.129.204:8086/
我们看到如下页面
我们看到的是全部网卡的监控信息。
五、停止监控不感兴趣的网卡
有些情况下,我们不希望监控全部网卡的流量信息,只监控我们感兴趣的网卡流量信息,怎么办呢?
其实vnstat 已经提供了相关命令:
停止监控不必要的接口
shell docker exec vnstat vnstat -i br-20f8582bfc70 --remove --force
这边的br-20f8582bfc70
就是我们希望去除监控的网卡名。
我们知道ifconfig
命令可以列出全部网卡信息,我们借助这个命令
新建 interface-update.sh
内容如下:
#!/bin/bash
echo '-----------'
echo 'ifconfig'
echo '-----------'
cmd="`ifconfig`"
array=($cmd)
IFS=" "
#打印命令,替换:为空字符串
echo '-----remove------'
for i in "${!array[@]}"; do
if [[ ${array[i]} == br-* || ${array[i]} == veth* || ${array[i]} == docker* ]]
then
echo "docker exec vnstat vnstat -i ${array[i]/:/} --remove --force"
fi
done
#打印命令,替换:为空字符串
echo '----- add ------'
for i in "${!array[@]}"; do
if [[ ${array[i]} == br-* || ${array[i]} == veth* || ${array[i]} == docker* ]]
then
echo "docker exec vnstat vnstat -i ${array[i]/:/} --add"
fi
done
我们在服务器上运行此脚本,运行结果如下:
-----------
ifconfig
-----------
-----remove------
docker exec vnstat vnstat -i br-1f52297f917e --remove --force
docker exec vnstat vnstat -i br-67ff2e42d10c --remove --force
docker exec vnstat vnstat -i br-78d4a3c0bf47 --remove --force
docker exec vnstat vnstat -i br-b9a03c41aaa2 --remove --force
docker exec vnstat vnstat -i br-be58b50c950a --remove --force
docker exec vnstat vnstat -i docker0 --remove --force
docker exec vnstat vnstat -i veth19d0a30 --remove --force
docker exec vnstat vnstat -i veth2e43779 --remove --force
docker exec vnstat vnstat -i veth5e0cc71 --remove --force
docker exec vnstat vnstat -i veth6049f23 --remove --force
docker exec vnstat vnstat -i veth79b6a3e --remove --force
docker exec vnstat vnstat -i veth83276c4 --remove --force
docker exec vnstat vnstat -i veth980b40a --remove --force
docker exec vnstat vnstat -i vethb2df867 --remove --force
docker exec vnstat vnstat -i vethf775220 --remove --force
docker exec vnstat vnstat -i vethf1f6950 --remove --force
----- add ------
docker exec vnstat vnstat -i br-1f52297f917e --add
docker exec vnstat vnstat -i br-67ff2e42d10c --add
docker exec vnstat vnstat -i br-78d4a3c0bf47 --add
docker exec vnstat vnstat -i br-b9a03c41aaa2 --add
docker exec vnstat vnstat -i br-be58b50c950a --add
docker exec vnstat vnstat -i docker0 --add
docker exec vnstat vnstat -i veth19d0a30 --add
docker exec vnstat vnstat -i veth2e43779 --add
docker exec vnstat vnstat -i veth5e0cc71 --add
docker exec vnstat vnstat -i veth6049f23 --add
docker exec vnstat vnstat -i veth79b6a3e --add
docker exec vnstat vnstat -i veth83276c4 --add
docker exec vnstat vnstat -i veth980b40a --add
docker exec vnstat vnstat -i vethb2df867 --add
docker exec vnstat vnstat -i vethf775220 --add
docker exec vnstat vnstat -i vethf1f6950 --add
–remove --force 结束的命令是移除监控,–add 结束的命令是添加监控。
下面我们可以拷贝运行需要的命令了。
我们运行全部的移除监控命令
最终执行效果如下:
有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!
-over-