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