Veel toepassingen kun je snel en eenvoudig installeren via Docker en Docker Compose. In deze workshop leggen we uit hoe je deze tools kunt installeren en geven wat tips voor het gebruik. Als besturingssysteem kiezen we voor Ubuntu 22.04, de laatste LTS-versie. Je kunt verschillende systemen gebruiken, zoals een gewone server (‘bare metal’) maar ook een Linux-container of virtuele machine.
Stappen vooraf
We gaan Docker en Docker Compose installeren op een server met Ubuntu 22.04 LTS. Je kunt hiervoor zoals aangeven diverse systemen gebruiken. Voordat we beginnen met de installatie nemen we enkele belangrijke stappen door.
Een niet-root gebruiker maken
Hoewel je Docker als root-gebruiker kunt gebruiken, is het beter om een niet-root account te gebruiken met sudo-rechten. Met onderstaande stappen maak je in regel 1 een nieuw account genaamd administrator. Hierbij stel je een wachtwoord in. Deze gebruiker wordt daarna in regel 2 toegevoegd aan de groep sudo. Met de laatste opdracht kun je controleren dat dit daadwerkelijk is gebeurd. Log hierna uit en log dan opnieuw in met de nieuwe gebruiker.
sudo adduser administrator sudo adduser administrator sudo id administrator
Updates en extra’s installeren
Zorg dat het besturingssysteem is bijgewerkt met de laatste versie via onderstaande opdrachten.
sudo apt update sudo apt upgrade
Er zijn wat extra tools nodig die je via de volgende opdracht installeert.
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Tijdzone instellen
Een Docker-container gebruikt doorgaans standaard UTC als tijdzone. Bij het configureren van een container zul je daarom vaak handmatig de correcte tijdzone instellen, bijvoorbeeld Europe/Amsterdam. Het is handig als de tijdzone ook op de host (het systeem waarop je Docker gaat installeren) correct is ingesteld. De tijdzone kun je controleren met cat /etc/timezone en eventueel wijzigen met de onderstaande opdracht, waarbij je land en dan stad of regio kunt kiezen.
sudo dpkg-reconfigure tzdata

Installatie Docker
We gaan Docker installeren via de officiële Docker-repository. Daarvoor voegen we eerst de repository toe en gaan vervolgens Docker vanuit die repository installeren.
Repository toevoegen
Om de repository voor Docker toe te voegen is een GPG-sleutel nodig. Voeg deze daarom eerste toe aan je systeem.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Vervolgens kun je de repository toevoegen.
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Werk alles bij zodat de repository actief wordt:
sudo apt update
Controleer of Docker vanuit de zojuist toegevoegde repository zal worden geïnstalleerd. Je ziet met deze opdracht een lijst met alle versies en de locatie die begint met https://download.docker.com/linux/ubuntu:
apt-cache policy docker-ce

Docker installeren
Installeer nu Docker:
sudo apt install docker-ce
Controleer of Docker actief is:
sudo systemctl status docker

Docker starten zonder sudo
Docker kan alleen worden gestart door de root-gebruiker of door een gebruiker in de groep docker. Je kunt opdrachten vooraf laten gaan door sudo (zoals sudo docker ps). Het is echter makkelijker om jezelf toe te voegen aan de groep docker zodat je geen sudo hoeft te gebruiken voor elke opdracht:
sudo usermod -aG docker ${USER}
Log uit en log opnieuw in om de wijziging effect te laten hebben. Let er in het vervolg op, bij het werken met Docker of Docker Compose, dat je als deze niet-root gebruiker bent ingelogd (zoals in dit voorbeeld administrator). Ook als je bijvoorbeeld mappen gaat maken of configuratiebestanden voor Docker Compose gaat maken of aanpassen.
Werking controleren
Je kunt nu aan de slag met Docker. Installeer bijvoorbeeld de container hello-world om de werking te testen.
docker run hello-world
Docker zal eerst controleren of de image die nodig is op je systeem staat. Als dat niet het geval is, wordt deze opgehaald, ook wel pull genoemd. Na het downloaden wordt de container gestart en zie je aan de uitvoer dat het is gelukt.

Werken met Docker
Het werken met Docker komt hier niet in detail aan bod, maar we willen je wel de belangrijkste opdrachten meegeven om je op weg te helpen. We starten als voorbeeld een container met WordPress:
docker run --name website -p 8080:80 -d wordpress
Met --name website geven we de container de herkenbare naam website. De optie -p 8080:80 zorgt dat poort 8080 op de host wordt gekoppeld met poort 80 in de container. Dat is de http-poort waarop WordPress actief is. De optie -d (detach) zorgt dat de opdrachtprompt weer vrij is nadat de container in de achtergrond is gestart. Met wordpress verwijzen we naar de naam van de image. Die image zal de eerste keer worden gedownload. Dat kan ook handmatig met docker pull wordpress.
Als je http://ipadres:8080 in een browser opent, waarbij je het ip-adres van je server invult, zie je de installatiepagina van WordPress. Om verder te gaan is overigens een database nodig, wat we hier buiten beschouwing laten.

Containers beheren
Voor een lijst met actieve containers geef je de opdracht docker ps. Je ziet dat elke container een id heeft (in dit voorbeeld 2b793b889e42) en een naam (in ons voorbeeld website).

De id of naam gebruik je om een container te starten, stoppen of weg te gooien. Daarvoor gebruik je respectievelijk docker start, docker stop en docker rm, steeds gevolgd door de id of de naam van de container, zoals:
docker start 2b793b889e42 docker stop website docker rm website
Met Docker kun je dus in één opdracht een container starten met de gewenste opties. De container zal in de regel actief zijn totdat je deze stopt. Je kunt uiteraard meerdere containers starten en beheren, maar zeker in die situatie is het vaak makkelijker om met Docker Compose te werken.
Werken met Docker Compose
Docker Compose maakt standaard deel uit van Docker. Deze tool werkt met configuratiebestanden. Het is het meest praktisch om de bestanden en mappen voor Docker Compose binnen je thuismap te beheren. Maak daarvoor een map met mkdir ~/docker. Blader dan naar deze map map met cd ~/docker. Maak nu voor elke toepassing een eigen map. Als voorbeeld gaan we een webserver opzetten met Nginx.
We maken een map voor onze webserver met mkdir -p ~/docker/nginx en maken een map waarin we de HTML-bestanden voor de webserver kunnen zetten met mkdir -p ~/docker/nginx/html. Maak nu een eenvoudig HTML-bestand met nano ~/docker/nginx/html/index.html en zet daarin de volgende regels:
<!DOCTYPE html>
<html>
<head>
<title>Welkom bij Nginx!</title>
</head>
<body>
<h1>Welkom!</h1>
<p>Dit is een test voor Nginx via Docker Compose</p>
</body>
</html>
Bladeren naar de map voor je webserver met cd ~/docker/nginx. Maak in deze map een configuratiebestand voor Docker Compose met nano docker-compose.yml. Zet daarin de volgende regels:
version: '3'
services:
nginx:
image: nginx:latest
ports:
- "1234:80"
volumes:
- ./html:/usr/share/nginx/html
restart: unless-stopped
Bewaar het bestand met Ctrl+O en verlaat de editor met Ctrl+X.
In regel 7 geven we aan dat poort 1234 moet worden gekoppeld aan poort 80 in de container. In regel 9 koppelen we de map ./html met /usr/share/nginx/html in de container. Regel 10 zorgt dat de container opnieuw moet worden gestart tenzij deze handmatig is stopgezet. Je kunt de container nu starten:
docker compose up -d
De optie -d zorgt dat de opdrachtprompt weer beschikbaar is nadat de container is gestart. Wil je alle meldingen zien, dan kun je deze eventueel weglaten. Je kunt via http://ipadres:1234 de pagina index.html terugzien die via de webserver wordt geserveerd. Vervang ipadres door het ip-adres van de server. Wil je de container stoppen dan kan dat met:
docker compose down

Dit is een eenvoudig voorbeeld. Meestal is een configuratiebestand voor Docker Compose veel uitgebreider. Je kunt bijvoorbeeld via hetzelfde configuratiebestand naast een container voor de webserver ook containers voor WordPress en een MySQL-database configureren die buiten de host om een netwerk kunnen gebruiken.
Comments 2