Online zetten: beheren met Portainer
Hier bouw je op verder: Inloggen met ssh en Een tunnel met ssh -L
Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.
- Linux Inloggen met ssh
- Linux Een tunnel met ssh -L
Een extra stap. Portainer is een website die in je browser laat zien wat docker compose ps en logs je nu laten zien: welke containers draaien, hun logboeken, de volumes en de images.
Portainer praat met Docker via docker.sock, net als Traefik, en mag dus alles wat Docker mag. Wie in Portainer binnenkomt, kan een container starten die de hele server overneemt. Portainer komt daarom nooit op internet. Hij luistert alleen op 127.0.0.1 van de server, en jij komt erbij via een tunnel van ssh.
Portainer starten
Op de server, in een eigen map:
mkdir ~/portainer
cd ~/portainer
nano compose.yaml
services:
portainer:
image: portainer/portainer-ce:lts
ports:
- "127.0.0.1:9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- data:/data
restart: unless-stopped
volumes:
data:
lts is de versie die het langst bijgehouden wordt. Portainer heeft een eigen website met HTTPS op poort 9443, alleen op 127.0.0.1. Zonder 127.0.0.1: stond hij op internet, langs de firewall heen (les 32). Er zijn geen labels voor Traefik: Portainer hoort niet achter de voordeur.
docker compose up -d
Je hebt nu vijf minuten om een beheerder te maken. Daarna sluit Portainer zichzelf af, zodat niemand anders dat voor jou doet.
Een tunnel
Open een terminal in WSL, en log in met een tunnel:
ssh -L 9443:127.0.0.1:9443 sam@gastenboek.voorbeeld.nl
-L 9443:127.0.0.1:9443 brengt poort 9443 van de server naar je laptop, zoals in Een tunnel met ssh. Zolang deze terminal openstaat, is de tunnel er. Open op Windows https://localhost:9443.
De browser waarschuwt dat de verbinding niet privé is. Portainer maakte zijn certificaat zelf, en geen bekende partij heeft het ondertekend. Hier mag je doorgaan, via Geavanceerd: het verkeer gaat door je eigen ssh-tunnel.
De eerste keer
Portainer vraagt een setup token: een code die alleen in zijn logboek staat, zodat alleen wie op de server kan, de beheerder maakt. Typ in de terminal met de tunnel:
cd ~/portainer
docker compose logs | grep setup_token
portainer-1 | setup_token=c2413f1a2e3617788d18a0b3dd04a5531c4a1265a3afeafc6542257f3722244c
Plak de code na setup_token= in de browser. Kies daarna een gebruikersnaam en een wachtwoord van minstens twaalf tekens. Klik op Get Started: Portainer toont de omgeving local, de Docker van deze server.
Kijken, niet veranderen
Bij een container vind je de knop Logs, met hetzelfde als docker compose logs, en onder Volumes je volume met de databases.
Portainer kan ook containers stoppen, starten en veranderen. Doe dat zo weinig mogelijk. Je compose.yaml in git is de beschrijving van je server; een verandering die je in Portainer klikt, staat daar niet in, en is weg bij de volgende docker compose up. Gebruik Portainer om te kijken, en verander wat er draait met je bestanden en docker compose.
De map ~/portainer staat net als ~/traefik alleen op de server. Neem hem mee in je back-up uit les 37, met cp -r ~/portainer ~/backup/ naast de regel voor ~/traefik.
Er gaat iets mis
timed out for security purposes
De browser toont een melding dat Portainer is afgesloten, en in het logboek staat:
the Portainer instance timed out for security purposes, to re-enable your Portainer instance, you will need to restart Portainer
Oorzaak: je maakte de beheerder niet binnen vijf minuten na het starten.
Oplossing: start Portainer opnieuw met docker compose restart in ~/portainer, en maak de beheerder meteen. Er staat dan een nieuwe setup token in het logboek.
Password does not meet the requirements
Oorzaak: je wachtwoord is korter dan twaalf tekens.
Oplossing: kies een langer wachtwoord. Wie in Portainer komt, kan de hele server overnemen; dit wachtwoord verdient de lengte.
cannot listen to port bij ssh -L
channel_setup_fwd_listener_tcpip: cannot listen to port: 9443
Could not request local forwarding.
Oorzaak: poort 9443 op je laptop is al bezet, vaak door een andere terminal met dezelfde tunnel.
Oplossing: sluit die andere terminal, of kies een andere poort voor je laptop: ssh -L 9444:127.0.0.1:9443 …, en open dan https://localhost:9444.
Opdrachten
Opdracht 1: Run - Portainer via een tunnel
Start Portainer op je server, open hem via een tunnel, en maak een beheerder. Zoek in Portainer het logboek van je gastenboek, en het volume met je databases.
Antwoord
cd ~/portainer
docker compose up -d
Daarna in WSL ssh -L 9443:127.0.0.1:9443 sam@gastenboek.voorbeeld.nl, en in de browser https://localhost:9443, met de setup token uit docker compose logs. Het logboek staat bij de container gastenboek-gastenboek-1 onder Logs. Het volume gastenboek_data vind je onder Volumes.
Opdracht 2: Investigate - Is de deur echt dicht?
Probeer in WSL, zonder tunnel, Portainer op het adres van je server te openen:
curl -k -m 5 https://gastenboek.voorbeeld.nl:9443
Wat gebeurt er? Welke twee dingen houden het tegen?
Antwoord
curl geeft het na vijf seconden op (-m 5), zonder antwoord. Twee dingen houden het tegen: Docker publiceerde poort 9443 alleen op 127.0.0.1 van de server, en ufw laat 9443 niet door. Het eerste is het slot dat telt, want langs ufw gaat Docker zelf. Het tweede is een extra slot, voor het geval je een keer 127.0.0.1: vergeet bij een programma zonder Docker.
Door naar les 41: een back-upscript.