Docker is software om andere software in een container uit te voeren. Met containers kun je toepassingen draaien in resource-geïsoleerde processen. Ze zijn vergelijkbaar met virtuele machines, maar containers zijn overdraagbaar, hulpbron vriendelijker en afhankelijker van het host-besturingssysteem.
Voor een gedetailleerde inleiding tot de verschillende componenten van een Docker-container, zie The Docker Ecosystem: An Introduction to Common Components.
Voor het artikel hieronder heb ik gebruik gemaakt van diverse Engelstalig artikelen die ik op Internet heb gevonden.
Installatie
Installeer Docker op je Debian systeem met de volgende commando’s (link):
sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Nadat de Docker Engine is geïnstalleerd kun je de Docker service starten en inschakelen zodat deze start na een systeem reboot met de volgende commando’s:
systemctl start docker systemctl enable docker
Je kunt controleren of Docker goed draait met het commando:
sudo systemctl status docker
Gebruik van het ‘Docker’ commando
Het gebruik van docker bestaat uit het doorgeven van opties en commando’s gevolgd door argumenten. De syntax is als volgt:
docker [optie] [commando] [argumenten]
Om alle beschikbare sub-commando’s te zien typ je:
docker
Je zult dan de volgende lijst zien:
attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes
Om de opties an en een specifiek commando te zien type je:
docker docker-subcommand --help
Voor algehele informatie over Docker te krijgen type je:
docker info
Werken met Docker containers
Docker containers worden gebouwd van Docker images. Standaard haalt Docker deze images op van Docker Hub, een Docker-register dat wordt beheerd door Docker, het bedrijf achter het Docker-project. Iedereen kan zijn Docker-images hosten op Docker Hub, dus de meeste toepassingen en Linux-distributies die je nodig hebt, hebben daar images gehost.
Je kunt zoeken naar beschikbare images op Docker Hub met het ‘docker search’ commando. Zoek je bijvoorbeeld een Debian image dan type je:
docker search debian
Om een docker image te downloaden gebruik je het ‘docker pull’ commando, bijvoorbeeld:
docker pull debian
Nadat een image is gedownload, kun je een container draaien met het gedownloade image met het ‘docker run’ commando. Als een image niet is gedownload wanneer docker wordt uitgevoerd met het run subcommando, zal de Docker client eerst het image downloaden en dan een container ermee draaien. De combinatie van de -i en -t opties geeft je met een interactieve shell toegang tot de container:
docker run -it debian
Je commando prompt zou moeten veranderen om aan te geven dat je nu in de container werkt en zou deze vorm moeten aannemen:
root@d9b100f2f636
Let op de container-id in de opdrachtprompt. In dit voorbeeld is dat d9b100f2f636. Die container-id heb je later nodig om de container te identificeren als je hem wilt verwijderen.
Je kunt elk commando in de container uitvoeren. Laten we bijvoorbeeld eens het pakket ‘nodejs’ in de container installeren. Voer de volgende commando’s uit:
apt update apt install nodejs
Dit installeert Node.js in de container vanuit de officiële debian repository. Wanneer de installatie is voltooid, controleer dan of Node.js is geïnstalleerd:
node -v
Je ziet het versienummer weergegeven in je terminal. Alle wijzigingen die je in de container aanbrengt, gelden alleen voor die container. Om de container te verlaten, typ je exit op de prompt.
Beheren Docker Containers
Na een tijdje Docker gebruikt te hebben, zul je veel actieve (draaiende) en inactieve containers op je computer hebben. Om de actieve te bekijken, gebruik je:
docker ps
Om alle containers te bekijken, actief en inactief, voer je docker ps uit met de -a switch:
docker ps -a
Om de laatst gemaakte container te bekijken, geef je de -l switch door:
docker ps -l
Om een gestopte container te starten, gebruik je docker start, gevolgd door de container-ID of de naam van de container. Laten we de debian-gebaseerde container starten met de ID van d9b100f2f636:
docker start d42d0bbfbd35
De container zal starten, en je kunt docker ps gebruiken om de status ervan te zien:
Om een draaiende container te stoppen, gebruik je docker stop, gevolgd door de container ID of naam. Deze keer gebruiken we de naam die Docker aan de container heeft toegekend:
docker stop d42d0bbfbd35
Zodra je hebt besloten dat je een container niet meer nodig hebt, verwijder je hem met het commando docker rm, opnieuw met de container-ID of de naam. Gebruik het docker ps -a commando om de container ID of naam te vinden voor de container die geassocieerd is met je image en verwijder deze.
docker rm debian
Je kunt een nieuwe container starten en deze een naam geven met de –name switch. Je kunt ook de –rm schakelaar gebruiken om een container te maken die zichzelf verwijdert wanneer hij wordt gestopt. Zie het docker run help commando voor meer informatie over deze en andere opties. Containers kunnen worden omgezet in images die je kunt gebruiken om nieuwe containers te bouwen. Laten we eens kijken hoe dat werkt.
Wijzigingen in een container vastleggen in een Docker image
Wanneer je een Docker image opstart, kun je bestanden aanmaken, wijzigen en verwijderen, net zoals bij een virtuele machine. De wijzigingen die je aanbrengt gelden alleen voor die container. Je kunt het starten en stoppen, maar zodra je het vernietigt met het docker rm commando, gaan de wijzigingen voorgoed verloren. Ik leg hieronder uit hoe je de toestand van een container bewaart als een nieuw Docker image.
Na het installeren van Node.js in de Debian container, heb je nu een container die draait vanaf een image, maar de container is anders dan de image die je gebruikte om hem te maken. Maar misschien wil je deze Node.js container later opnieuw gebruiken als basis voor nieuwe images. Dan commit je de wijzigingen naar een nieuwe Docker image instance met het volgende commando.
docker commit -m "Wat je met de image hebt gedaan" -a "Author Name" container_id repository/new_image_name
De -m switch is voor het commit bericht dat jou en anderen helpt te weten welke veranderingen je hebt gemaakt, terwijl -a wordt gebruikt om de auteur te specificeren. De container_id is degene die je eerder in de tutorial noteerde toen je de interactieve Docker sessie startte. Tenzij je extra repositories op Docker Hub hebt aangemaakt, is de repository meestal je Docker Hub-gebruikersnaam.
Bijvoorbeeld, voor de gebruiker HenriMatthijssen, met de container ID van d42d0bbfbd35, zou het commando zijn:
docker commit -m "Node.js toegevoegd" -a "HenriMatthijssen" d42d0bbfbd35 HenriMatthijssen/debian-nodejs
Wanneer je een image commit, wordt de nieuwe image lokaal op je computer opgeslagen. Later in deze tutorial leer je hoe je een image naar een Docker-register zoals Docker Hub kunt pushen, zodat anderen er toegang toe hebben. Door de Docker-images opnieuw op te roepen, wordt het nieuwe image getoond, evenals de oude waarvan hij is afgeleid:
docker images
Docker Images naar een Docker Repository pushen
De volgende logische stap na het maken van een nieuwe image van een bestaande image is deze te delen met een select aantal van je vrienden, de hele wereld op Docker Hub, of een andere Docker registry waartoe je toegang hebt. Om een image naar Docker Hub of een ander Docker-register te pushen, moet je daar een account hebben. Om je image te pushen, log je eerst in op Docker Hub.
docker login -u docker-registry-username
Je wordt gevraagd om te authenticeren met je Docker Hub-wachtwoord. Als je het juiste wachtwoord hebt opgegeven, zou de authenticatie moeten slagen. Vervolgens kun je je eigen image pushen met:
docker push docker-registry-username/docker-image-name
Om je debian-nodejs image naar de HenriMatthijssen repository te pushen, zou het commando zijn:
docker push HenriMatthijssen/debian-nodejs
Het proces kan enige tijd in beslag nemen omdat het image wordt geupload. Na het pushen van een image naar een registy, zou het op het dashboard van je account moeten staan.
Docker toegang geven tot USB devices
Als je Docker toegang wilt geven naar je USB poorten dan moet je een toevoeging maken in de ‘docker-compose.yaml’ file:
devices: – “/dev/ttyUSB0:/dev/ttyUSB0”
Docker volledig verwijderen van je systeem
Als je denkt dat Docker toch niks voor jou is dan kun je deze als volgt volledig verwijderen van je Debian systeem:
sudo apt-get purge -y docker-engine docker docker.io docker-ce sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce sudo rm -rf /var/lib/docker /etc/docker sudo rm /etc/apparmor.d/docker sudo groupdel docker sudo rm -rf /var/run/docker.sock