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 !!