Dockerbeheer op afstand met Portainer

In mijn bericht van vorige week over het installeren van Learning Locker op mijn Synology Diskstation, maakte ik al melding van het gebruik van Portainer. Dit in plaats van de in de Synology ingebouwde opties. Portainer draait zelf op Docker, dus je hebt geen Synology Diskstation nodig om het te gebruiken.

Daarnaast kun je Portainer niet alleen gebruiken voor het beheren van Docker op de machine waar Portainer op draait, maar ook op andere systemen, zoals een Raspberry Pi.

De Pi Zero waar SBFSpot op draaide was gecrasht en ik wilde dit moment van opnieuw opbouwen van het apparaat (nee, natuurlijk had ik niet gewoon even een backup-kopie van de image opgeslagen, dat zou veel te logisch en handig zijn geweest) gebruiken om er Docker op te installeren.

Docker op een Raspberry Pi installeren is niet heel ingewikkeld. Ik volgde deze stappen:

  • Downloaden van de meest recente image van Raspbian (lite) en op het micro-SD kaartje zetten
  • ssh en wpa_supplicant.conf toevoegen
  • Opstarten en via ssh verbinding maken

Daarna de stappen zoals hier genoemd:

curl -sSL https://get.docker.com | sh

sudo usermod -aG docker pi

Reboot en test:

docker run hello-world

Installatie van de verschillende afhankelijkheden:

sudo apt-get install libffi-dev libssl-dev
sudo apt-get install -y python python-pip
sudo apt-get remove python-configparser

Installatie van Docker Compose (duurt een tijd!)

sudo pip install docker-compose

Het maken van de verbinding zodat Portainer contact kon maken was op zich ook niet heel veel werk, alleen veel stappen (ik volgde deze handleiding waarbij ik ga voor 10 jaar houdbaarheid van de certificaten, voor een interne Rpi maakt me dat niet uit!):

  • export HOST=<your-domain-name>
  • openssl genrsa -aes256 -out ca-key.pem 4096
  • openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem
  • openssl genrsa -out server-key.pem 4096
  • openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
  • echo extendedKeyUsage = serverAuth >> extfile.cnf
  • openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
  • openssl genrsa -out key.pem 4096
  • openssl req -subj '/CN=client' -new -key key.pem -out client.csr
  • echo extendedKeyUsage = clientAuth > extfile-client.cnf
  • openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
  • mkdir ~/.certs
  • cp *.pem ~/.certs
  • mkdir -p /etc/systemd/system/docker.service.d/
  • sudo nano /etc/systemd/system/docker.service.d/startup_options.conf

Inhoud van dat bestand:

# /etc/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/home/pi/.certs/ca.pem --tlscert=/home/pi/.certs/cert.pem --tlskey=/home/pi/.certs/key.pem -H fd:// -H tcp://0.0.0.0:2376

Daarna nog:

  • sudo systemctl daemon-reload
  • sudo systemctl restart docker.service

Daarna moest ik cert.pem en key.pem van de Raspberry Pi downloaden naar mijn laptop, zodat ik in Portainer ze kon uploaden voor het tot stand brengen van de verbinding.

Conclusie
Het werkt En het werkte meteen. Dat is positief gezien het enorme aantal opdrachten dat ik moet uitvoeren. Dat is nou precies wat ik met Docker wil voorkomen. Dus het is toch wel handig om een backup-kopie te maken van de image die ik nu gemaakt heb. Want dan hoef ik die later alleen maar terug naar een (nieuwe) micro-SD kaart te zetten in plaats van al deze handelingen Maar het beheren op afstand is natuurlijk wel mooi.

Oh, voor het daadwerkelijke gebruik van de RpI, ben ik daarna verder gegaan met deze Docker image. Maar uiteindelijk vond ik daar 3 docker containers voor zo’n simpele taak niet logisch en ben verder gegaan met een nieuwe lege image zónder Docker.