RPI-Monitor -- Docker-Überwachung für den Host
Wie sind die Vital-Werte des Host? Laufen Container wild? Wie sind Netzwerk-Auslastung? Oder die Speicherplatzbelegung?
Viele Fragen ergeben sich beim Einsatz von Docker-Container, gerade beim Einsatz von vielen Container auf kleiner Hardware.
Um hier den Überblick zurückzugewinnen, empfiehlt sich der Einsatz eines Monitoring-Tools, examplarisch wird nun rpi-monitor vorgestellt.
# mkdir /docker/rpi-mon
# mkdir /docker/rpi-mon/usr-lib
# cd /docker/rpi-mon
In diesem Verzeichnis werden drei Dateien angelegt: Dockerfile, docker-compose.yaml und run.sh. Diese habe ich angepasst, um z.B. das persistente Speichern der Statistik-Daten RRD auch nach Neu-Build zu gewährleisten.
Dockerfile
# https://github.com/michaelmiklis/docker-rpi-monitor/blob/master/Dockerfile
FROM resin/rpi-raspbian:latest
LABEL maintainer="Michael Miklis / <info@michaelmiklis.de>"
RUN [ "cross-build-start" ]
ENV DEBIAN_FRONTEND noninteractive
# Install RPI-Monitor form Xavier Berger's repository
RUN apt-get -y update && \
apt-get install -y --no-install-recommends dirmngr apt-transport-https ca-certificates && \
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 2C0D3C0F && \
echo deb http://giteduberger.fr rpimonitor/ > /etc/apt/sources.list.d/rpimonitor.list && \
apt-get -y update && \
apt-get install -y rpimonitor && \
apt-get clean && \
apt-get autoclean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
sed -i 's/\/sys\//\/dockerhost\/sys\//g' /etc/rpimonitor/template/* && \
sed -i 's/\/etc\/os-release/\/dockerhost\/usr\/lib\/os-release/g' /etc/rpimonitor/template/version.conf && \
sed -i 's/\/proc\//\/dockerhost\/proc\//g' /etc/rpimonitor/template/* && \
echo include=/etc/rpimonitor/template/wlan.conf >> /etc/rpimonitor/data.conf && \
sed -i '/^web.status.1.content.8.line/ d' /etc/rpimonitor/template/network.conf && \
sed -i '/^#web.status.1.content.8.line/s/^#//g' /etc/rpimonitor/template/network.conf && \
sed -i 's/\#dynamic/dynamic/g' /etc/rpimonitor/template/network.conf && \
sed -i 's/\#web.statistics/web.statistics/g' /etc/rpimonitor/template/network.conf
# Allow access to port 8888
EXPOSE 8888
# persistente Daten in den Container-Build kopieren
COPY ./usr-lib/ /var/lib/rpimonitor/stat/
# Start rpimonitord using run.sh wrapper script
ADD run.sh /run.sh
RUN chmod +x /run.sh
CMD bash -C '/run.sh';'bash'
RUN [ "cross-build-end" ]
docker-compose.yaml
rpi-monitor:
# https://rpi-experiences.blogspot.de/2018/02/rpi-monitor-docker-container.html
# https://github.com/michaelmiklis/docker-rpi-monitor/issues/1
container_name: rpimon
image: michaelmiklis/rpi-monitor
restart: unless-stopped
ports:
- "8888:8888"
devices:
- "/dev/vchiq"
- "/dev/vcs"
volumes:
- /opt/vc:/opt/vc/
- /boot/:/boot/
- /sys/:/dockerhost/sys/:ro
- /etc/:/dockerhost/etc/:ro
- /proc/:/dockerhost/proc/:ro
- /usr/lib/:/dockerhost/usr/lib/:ro
- ./usr-lib:/var/lib/rpimonitor/stat/
run.sh
#!/bin/bash
# Load shared libraries from /opt/vc/lib
echo /opt/vc/lib > /etc/ld.so.conf.d/00-vmcs.conf
ldconfig
# Link /opt/vc/bin binaries to /usr/bin
ln -s /opt/vc/bin/raspividyuv /usr/bin/raspividyuv
ln -s /opt/vc/bin/dtmerge /usr/bin/dtmerge
ln -s /opt/vc/bin/raspistill /usr/bin/raspistill
ln -s /opt/vc/bin/vcgencmd /usr/bin/vcgencmd
ln -s /opt/vc/bin/vcdbg /usr/bin/vcdbg
ln -s /opt/vc/bin/dtoverlay-pre /usr/bin/dtoverlay-pre
ln -s /opt/vc/bin/raspiyuv /usr/bin/raspiyuv
ln -s /opt/vc/bin/vchiq_test /usr/bin/vchiq_test
ln -s /opt/vc/bin/tvservice /usr/bin/tvservice
ln -s /opt/vc/bin/edidparser /usr/bin/edidparser
ln -s /opt/vc/bin/raspivid /usr/bin/raspivid
ln -s /opt/vc/bin/dtoverlay-post /usr/bin/dtoverlay-post
ln -s /opt/vc/bin/dtoverlay /usr/bin/dtoverlay
ln -s /opt/vc/bin/dtparam /usr/bin/dtparam
# Insert Docker Host hostname into raspbian.conf
DOCKERHOST=$(cat /dockerhost/etc/hostname)
sed -i "s/'+data.hostname+'/$DOCKERHOST/g" /etc/rpimonitor/template/raspbian.conf
# Update RPI Monitor Package Status
/etc/init.d/rpimonitor install_auto_package_status_update
/usr/share/rpimonitor/scripts/updatePackagesStatus.pl
# Start RPI Monitor
/usr/bin/rpimonitord -v
HINT:
Bei Testen wollte ich zunächst alle entstandenen Statistikdaten aus dem Container in den Host kopieren. In der Shell werden mit * alle Dateien eines Ordners angesprochen. Dies gilt NICHT für den docker cp-Befehl! Der "."-Punkt ist richtig.
# cd /docker/rpi-mon/usr-lib
# docker cp rpimon:/var/lib/rpimonitor/stat/. . # KORREKT !!
# docker cp rpimon:/var/lib/rpimonitor/stat/* . # FALSCH !!