In onze Docker-tutorial laten we je ken­nis­ma­ken met het vir­tu­a­li­sa­tie­plat­form Docker en laten we je aan de hand van eenvoudig te volgen in­struc­ties zien hoe je Docker op je Ubuntu 22.04-systeem kunt gebruiken.

Structuur en kenmerken van Docker

‘Bouw, verzend en voer elke app uit, waar dan ook’ – dat is het motto van Docker. Het open-source con­tai­ner­plat­form biedt een flexibel, resource-arm al­ter­na­tief voor de emulatie van hard­wa­re­com­po­nen­ten op basis van virtuele machines (VM’s).

Terwijl tra­di­ti­o­ne­le hard­wa­re­vir­tu­a­li­sa­tie gebaseerd is op het starten van meerdere gast­sys­te­men op een ge­meen­schap­pe­lijk host­sys­teem, worden Docker-ap­pli­ca­ties met behulp van con­tai­ners als ge­ï­so­leer­de processen op hetzelfde systeem uit­ge­voerd. Dit wordt con­tainer­ge­ba­seer­de vir­tu­a­li­sa­tie genoemd, ook wel vir­tu­a­li­sa­tie op be­stu­rings­sys­teem­ni­veau genoemd.

Afbeelding: Virtual machines and software containers in comparison
While each virtual machine launches its own operating system, Docker con­tai­ners share the core of the host system

Een groot voordeel van con­tainer­ge­ba­seer­de vir­tu­a­li­sa­tie is dat ap­pli­ca­ties met ver­schil­len­de vereisten ge­ï­so­leerd van elkaar kunnen draaien zonder dat er een apart gast­sys­teem nodig is. Bovendien kunnen ap­pli­ca­ties met con­tai­ners op ver­schil­len­de platforms en in ver­schil­len­de in­fra­struc­tu­ren worden ge­ïm­ple­men­teerd zonder dat ze moeten worden aangepast aan de hardware- of soft­wa­re­con­fi­gu­ra­ties van het host­sys­teem.

Docker is het po­pu­lair­ste soft­wa­re­pro­ject dat ge­brui­kers con­tainer­ge­ba­seer­de vir­tu­a­li­sa­tie­tech­no­lo­gie biedt. Het open-sour­ce­plat­form is gebaseerd op drie ba­sis­com­po­nen­ten. Om con­tai­ners uit te voeren, hebben ge­brui­kers alleen de Docker-engine en speciale Docker-images nodig, die via de Docker-hub kunnen worden verkregen of zelf kunnen worden gemaakt.

Docker-images

Net als virtuele machines zijn Docker-con­tai­ners gebaseerd op Docker-images. Een image is een alleen-lezen sjabloon dat alle in­struc­ties bevat die de Docker-engine nodig heeft om een container te maken. Een Docker-image wordt be­schre­ven als een draagbare af­beel­ding van een container in de vorm van een tekst­be­stand, ook wel een Doc­ker­fi­le genoemd. Als een container op een systeem moet worden gestart, wordt eerst een pakket met de be­tref­fen­de image geladen, mits deze niet lokaal aanwezig is. De geladen image biedt het benodigde be­stands­sys­teem, inclusief alle pa­ra­me­ters voor de runtime. Een container kan worden gezien als een actief proces van een image.

De Docker-hub

De Docker Hub is een cloud­ge­ba­seerd register voor software-re­po­si­to­ries, een soort bi­bli­o­theek voor Docker-images. De online dienst is op­ge­splitst in een openbaar en een privé-gedeelte. Het openbare gedeelte biedt ge­brui­kers de mo­ge­lijk­heid om hun eigen ont­wik­kel­de images te uploaden en te delen met de community. Hier zijn een aantal officiële images be­schik­baar van het Docker-ont­wik­ke­laars­team en ge­ves­tig­de open-sour­ce­pro­jec­ten. Beelden die naar het privé-gedeelte van het register worden geüpload, zijn niet openbaar toe­gan­ke­lijk en kunnen dus bij­voor­beeld worden gedeeld binnen de interne kring van een bedrijf of met vrienden of kennissen. De Docker Hub is toe­gan­ke­lijk via hub.docker.com.

De Docker-engine

De kern van het Docker-project wordt gevormd door de Docker-engine. Dit is een open-source client-ser­ver­ap­pli­ca­tie, die in de huidige versie voor alle ge­brui­kers be­schik­baar is op alle gangbare platforms.

De ba­sis­ar­chi­tec­tuur van de Docker-engine is verdeeld over drie com­po­nen­ten: een daemon met ser­ver­func­ties, een pro­gram­mee­r­in­ter­fa­ce (API) gebaseerd op het pro­gram­meer­pa­ra­dig­ma REST (Re­pre­sen­ta­ti­o­nal State Transfer) en de terminal van het be­stu­rings­sys­teem (command line interface, CLI) als ge­brui­kers­in­ter­fa­ce (client).

  • Docker-daemon: Als server voor de Docker-engine wordt een daemon-proces gebruikt. De Docker-daemon draait op de ach­ter­grond van het host­sys­teem en wordt gebruikt voor de centrale aan­stu­ring van de Docker-engine. Deze functie creëert en beheert alle images, con­tai­ners of netwerken.
  • REST-API: De REST-API spe­ci­fi­ceert een reeks in­ter­fa­ces waarmee andere programma’s kunnen com­mu­ni­ce­ren met de Docker-daemon en deze in­struc­ties kunnen geven. Een van deze programma’s is de terminal van het be­stu­rings­sys­teem.
  • Terminal: Als client­pro­gram­ma gebruikt Docker de terminal van het be­stu­rings­sys­teem. Deze is via de REST-API ge­ïn­te­greerd met de Docker-daemon, waardoor ge­brui­kers deze kunnen bedienen via scripts of ge­brui­kers­in­voer.
Tip

In 2017 werd de Docker-engine hernoemd naar Docker Community Edition (afgekort tot Docker CE), maar in de officiële do­cu­men­ta­tie en Docker-re­po­si­to­ries wordt nog steeds meestal de oude naam gebruikt. Naast Docker CE is er ook Docker En­ter­pri­se Edition (Docker EE), dat enkele pre­mi­um­func­ties heeft. Dit is echter niet gratis en meer geschikt voor on­der­ne­min­gen.

Met Docker-commando’s kunnen ge­brui­kers­soft­wa­re­con­tai­ners recht­streeks vanaf de terminal worden gestart, gestopt en beheerd. De daemon wordt aan­ge­roe­pen via het commando docker en in­struc­ties zoals build, pull of run. Client en server kunnen zich op hetzelfde systeem bevinden. Ge­brui­kers hebben ook de mo­ge­lijk­heid om toegang te krijgen tot een Docker-daemon op een ander systeem. Af­han­ke­lijk van het type ver­bin­ding dat tot stand wordt gebracht, verloopt de com­mu­ni­ca­tie tussen de client en de server via de REST-API, via UNIX-sockets of via een net­werk­in­ter­fa­ce.

De volgende af­beel­ding il­lu­streert de in­ter­ac­tie tussen de af­zon­der­lij­ke Docker-com­po­nen­ten met de voor­beeld­op­drach­ten docker build, docker pull en docker run:

Afbeelding: Schematic representation of the Docker architecture
'The Docker ar­chi­tec­tu­re is based on the coo­p­e­ra­ti­on of the client (terminal'), server (Docker-daemon) en register (Docker Hub).'

Het commando docker build geeft de Docker-daemon de opdracht om een image aan te maken (stip­pel­lijn). Hiervoor moet een bij­be­ho­rend Doc­ker­fi­le be­schik­baar zijn. Als de image niet moet worden aan­ge­maakt, maar in plaats daarvan moet worden geladen vanuit een re­po­si­to­ry in de Docker-hub, dan wordt het commando docker pull gebruikt (stip­pel­lijn). Als de Docker-daemon via docker run wordt ge­ïn­stru­eerd om een container te starten, con­tro­leert het ach­ter­grond­pro­gram­ma of de bij­be­ho­ren­de con­tai­ne­ri­ma­ge lokaal be­schik­baar is. Als dat het geval is, wordt de container uit­ge­voerd (on­on­der­bro­ken lijn). Als de daemon de image niet kan vinden, start hij au­to­ma­tisch een pull vanuit de re­po­si­to­ry.

Werken met Docker

Nu is het tijd om vertrouwd te raken met de con­tai­ner­plat­form­toe­pas­sin­gen. Als u de Docker-engine nog niet hebt ge­ïn­stal­leerd, kunt u dat doen via de Linux-terminal. In­struc­ties hiervoor vindt u in ons artikel‘Docker in­stal­le­ren op Ubuntu 22.04’. Hieronder leert u hoe u de Docker-engine vanaf de terminal kunt bedienen, wat de Docker Hub voor u kan betekenen en waarom Docker-con­tai­ners een revolutie teweeg kunnen brengen in de manier waarop u met ap­pli­ca­ties werkt.

Hoe de Docker-engine te beheren

Sinds versie 16.04 gebruikt Ubuntu het ach­ter­grond­pro­gram­ma systemd(afkorting van ‘system daemon’) om processen te beheren.Systemd iseen init-proces dat ook wordt gebruikt op andere Linux-dis­tri­bu­ties zoals RHEL, CentOS of Fedora. Doorgaanskrijgt systemdhet proces-ID 1. Als eerste proces van het systeem is de daemon ver­ant­woor­de­lijk voor het starten, con­tro­le­ren en be­ëin­di­gen van alle volgende processen. Voor eerdere Ubuntu-versies (14.10 en ouder) neemt hetach­ter­grond­pro­gram­ma upstart deze functie over.

De Docker-daemon kan ook worden aan­ge­stuurd via systemd. In de stan­daard­in­stal­la­tie is het con­tai­ner­plat­form zo ge­con­fi­gu­reerd dat de daemon au­to­ma­tisch start wanneer het systeem wordt opgestart. Deze stan­daard­in­stel­ling kan worden aangepast via het op­dracht­re­gel­pro­gram­ma systemctl.

Met systemctl verstuurt u commando’s naar systemd om een proces te besturen of de status ervan op te vragen. De syntaxis van een dergelijk commando is als volgt:

systemctl [OPTION] [COMMAND]
bash

Sommige commando’s verwijzen naar spe­ci­fie­ke bronnen (bij­voor­beeld Docker). In de ter­mi­no­lo­gie van systemd worden deze units genoemd. In dit geval is het commando het resultaat van de be­tref­fen­de in­struc­tie en de naam van de unit die moet worden aan­ge­spro­ken.

Als u de autostart van de Docker-daemon wilt activeren (in­scha­ke­len) of de­ac­ti­ve­ren (uit­scha­ke­len), gebruikt u het op­dracht­re­gel­pro­gram­ma systemctl met de volgende op­drach­ten:

sudo systemctl enable docker
sudo systemctl disable docker
bash

Met het op­dracht­re­gel­pro­gram­ma systemctl kunt u de status van een eenheid opvragen:

sudo systemctl status docker
bash

Als de Docker-engine op uw Ubuntu-systeem actief is, zou de uitvoer in de terminal er als volgt uit moeten zien:

Afbeelding: The status query via systemctl shows: The Docker engine is active (running)
Status query via systemctl: The Docker Engine is active (running)

Als uw Docker-engine momenteel is ge­de­ac­ti­veerd, krijgt u de sta­tus­mel­ding ‘inactief (dood)’. In dat geval moet u de Docker-daemon handmatig starten om con­tai­ners uit te voeren.

Afbeelding: The status query via systemctl shows: The Docker engine is inactive (dead)
Status query via systemctl: The Docker engine is inactive (dead)

Als u uw Docker-engine handmatig wilt starten, stoppen of her­star­ten, voer dan een van de volgende commando’s uit in systemd.

Om de ge­de­ac­ti­veer­de daemon te starten, gebruikt u systemctl in com­bi­na­tie met het commando start:

sudo systemctl start docker
bash

Als de Docker-daemon moet worden beëindigd, gebruik dan in plaats daarvan het commando stop:

sudo systemctl stop docker
bash

Een herstart van de motor wordt gevraagd met het commando restart:

sudo systemctl restart docker
bash

Hoe gebruik je de Docker Hub?

Als de Docker-engine het hart van het con­tai­ner­plat­form vormt, dan is de Docker Hub de ziel van het open-sour­ce­pro­ject. Dit is waar de community samenkomt. In het cloud­ge­ba­seer­de register vinden ge­brui­kers alles wat ze nodig hebben om hun Docker-in­stal­la­tie tot leven te brengen.

De online dienst biedt diverse officiële re­po­si­to­ries met meer dan 100.000 gratis apps. Ge­brui­kers hebben de mo­ge­lijk­heid om een beeld­ar­chief aan te maken en deze ge­za­men­lijk met werk­groe­pen te gebruiken. Naast de pro­fes­si­o­ne­le on­der­steu­ning door het ont­wik­ke­lings­team kunnen beginners hier ook aan­slui­ting vinden bij de ge­brui­kers­ge­meen­schap. Op GitHub is een forum voor com­mu­ni­ty­on­der­steu­ning be­schik­baar.

Afbeelding: The Docker hub: Registration
Create your personal Docker ID for free by re­gis­tering / Source: hub.docker.com

Re­gi­stre­ren in de Docker Hub

Re­gi­stra­tie bij Docker Hub is gratis. Ge­brui­kers hebben alleen een e-mailadres en een zelf­ge­ko­zen Docker-ID nodig. Dit dient later als per­soon­lij­ke re­po­si­to­ry-naam­ruim­te en geeft ge­brui­kers toegang tot alle Docker-services. Momenteel omvat dit aanbod naast de Docker Hub ook de Docker Cloud, Docker Store en ge­se­lec­teer­de bè­ta­pro­gram­ma’s. Daarnaast kan de Docker-ID worden gebruikt om in te loggen bij het Docker Support Center, het Docker Success Portal en het Docker Forum.

Het re­gi­stra­tie­pro­ces bestaat uit vijf stappen:

  1. Kies uw Docker-ID: Kies als eerste onderdeel van de aanvraag een ge­brui­kers­naam die later als uw per­soon­lij­ke Docker-ID zal worden gebruikt.
  2. Voer een e-mailadres in: Voer uw huidige e-mailadres in. Houd er rekening mee dat u uw re­gi­stra­tie bij Docker Hub via e-mail moet be­ves­ti­gen.
  3. Kies een wacht­woord: Kies een geheim wacht­woord.
  4. Verstuur uw re­gi­stra­tie: Klik op ‘Aanmelden’ om uw re­gi­stra­tie te versturen. Zodra de gegevens volledig zijn verzonden, stuurt Docker een link naar uw opgegeven e-mailadres waarmee u uw e-mailadres kunt ve­ri­fi­ë­ren.
  5. Bevestig uw e-mailadres: bevestig uw e-mailadres door op de ve­ri­fi­ca­tie­link te klikken.

De online diensten van het Docker-project zijn direct be­schik­baar nadat u zich in de browser hebt ge­re­gi­streerd. Hier kunt u re­po­si­to­ries en werk­groe­pen aanmaken of met ‘Explore’ in de Docker Hub zoeken naar openbare bronnen.

Afbeelding: Dashboard of the Docker hub
Select and set re­po­si­to­ries and work­groups via the Docker hub dashboard / Source: hub.docker.com

U kunt zich ook recht­streeks aanmelden op de terminal van uw be­stu­rings­sys­teem via docker login. Een ge­de­tail­leer­de be­schrij­ving van het commando vindt u in de Docker-do­cu­men­ta­tie.

In principe is Docker Hub ook be­schik­baar voor mensen zonder account of Docker ID. In dat geval kunnen echter alleen af­beel­din­gen uit openbare re­po­si­to­ries worden geladen. Het uploaden (pushen) van je eigen af­beel­din­gen is niet mogelijk zonder een Docker ID.

Maak op­slag­plaat­sen aan in de Docker Hub

Het gratis Docker Hub-account bevat één privé-re­po­si­to­ry en biedt de mo­ge­lijk­heid om een onbeperkt aantal openbare re­po­si­to­ries aan te maken. Als u meer privé-re­po­si­to­ries nodig hebt, kunt u deze ont­gren­de­len met een betaalde upgrade.

Ga als volgt te werk om een re­po­si­to­ry aan te maken:

  1. Kies een naam­ruim­te: Nieuw aan­ge­maak­te re­po­si­to­ries worden au­to­ma­tisch toe­ge­we­zen aan de naam­ruim­te van uw Docker-ID. U kunt ook de ID invoeren van een or­ga­ni­sa­tie waarvan u lid bent.
  2. Geef de re­po­si­to­ry een label: voer een naam in voor de nieuw aan­ge­maak­te re­po­si­to­ry.
  3. Voeg een be­schrij­ving toe: voeg een korte be­schrij­ving toe voor uw re­po­si­to­ry.
  4. Zicht­baar­heid instellen: Bepaal of de re­po­si­to­ry openbaar zichtbaar moet zijn (openbaar) of alleen toe­gan­ke­lijk voor u of uw or­ga­ni­sa­tie (privé).

Bevestig uw invoer door op ‘Aanmaken’ te klikken.

Afbeelding: The Docker hub: Input screen for creating a repository
Your re­po­si­to­ries are au­to­ma­ti­cally created in the namespace of your Docker ID / Source: hub.docker.com

Teams en or­ga­ni­sa­ties aanmaken

Met de hub biedt Docker een cloud­ge­ba­seerd platform waarop zelf­ge­maak­te images centraal worden beheerd en ge­mak­ke­lijk kunnen worden gedeeld met werk­groe­pen. In de ter­mi­no­lo­gie van Docker worden deze ‘or­ga­ni­sa­ties’ genoemd. Net als ge­brui­kers­ac­counts krijgen or­ga­ni­sa­ties in­di­vi­du­e­le ID’s waarmee images kunnen worden aan­ge­bo­den en ge­down­load. Rechten en rollen binnen een or­ga­ni­sa­tie kunnen worden toe­ge­we­zen via teams. Ge­brui­kers die zijn toe­ge­we­zen aan het team ‘Eigenaren’ hebben bij­voor­beeld de be­voegd­heid om privé- of openbare re­po­si­to­ries aan te maken en toe­gangs­rech­ten toe te wijzen.

Werk­groe­pen kunnen ook recht­streeks via het dashboard worden aan­ge­maakt en beheerd. Meer in­for­ma­tie over or­ga­ni­sa­ties en teams vindt u in de Docker-do­cu­men­ta­tie.

Werken met af­beel­din­gen en con­tai­ners

Als eerste aan­spreek­punt voor officiële Docker-bronnen is de Docker Hub ons startpunt voor deze inleiding tot het omgaan met images en con­tai­ners. Het ont­wik­kel­team heeft de demo-image whalesay be­schik­baar gesteld, die als basis zal dienen voor de volgende Docker-tutorial.

Docker-images down­lo­a­den

De whalesay- af­beel­ding is te vinden op de website van Docker Hub. Voer hiervoor de term whalesay in de zoekbalk naast het Docker-logo in.

Afbeelding: The search function in Docker hub
Search the Docker hub using the search bar or the ‘Explore’ button / Source: hub.docker.com

Klik in de zoek­re­sul­ta­ten op de bron met de titel docker/whalesay om toegang te krijgen tot de openbare re­po­si­to­ry voor deze af­beel­ding.

Docker-re­po­si­to­ries worden altijd volgens hetzelfde patroon opgebouwd. In de koptekst van de pagina vinden ge­brui­kers de titel van de af­beel­ding, de categorie van de re­po­si­to­ry en het tijdstip van de laatste upload (last pushed).

Afbeelding: Web view of a Docker repository
In the re­po­si­to­ry, users generally find all in­for­ma­ti­on that is needed to use an image / Source: hub.docker.com

Elke Docker-re­po­si­to­ry biedt ook de volgende infoboxen:

  1. Be­schrij­ving: Ge­de­tail­leer­de be­schrij­ving, meestal inclusief ge­bruiks­aan­wij­zing
  2. Docker pull-commando: Com­man­do­re­ge­lop­dracht die wordt gebruikt om de image uit de re­po­si­to­ry te down­lo­a­den (pull)
  3. Eigenaar: In­for­ma­tie over de maker van de re­po­si­to­ry
  4. Op­mer­kin­gen: Op­mer­kin­gen­veld aan het einde van de pagina

Uit de in­for­ma­tie­vak­ken van de re­po­si­to­ry blijkt dat whalesay een aan­pas­sing is van het open-source Perl-script cowsay. Het programma, ont­wik­keld door Tony Monroe in 1999, genereert een ASCII-af­beel­ding in de vorm van een koe, die samen met een bericht in de terminal van de gebruiker ver­schijnt.

Om docker/whalesay te down­lo­a­den, gebruik je het commando docker pull:

docker pull [OPTIONS] NAME [:TAG|@DIGEST]
bash

Het commando docker pull geeft de daemon de opdracht om een image uit de re­po­si­to­ry te laden. U geeft aan om welke image het gaat door de titel van de image (NAME) in te voeren. U kunt Docker ook in­struc­ties geven over hoe het gewenste commando moet worden uit­ge­voerd (OPTIONS). Optionele invoer omvat tags (:TAG) en in­di­vi­du­e­le iden­ti­fi­ca­tie­num­mers (@DIGEST), waarmee u een spe­ci­fie­ke versie van een image kunt down­lo­a­den.

Een lokale kopie van de docker/whalesay -af­beel­ding wordt verkregen met de volgende opdracht:

docker pull docker/whalesay
bash

Over het algemeen kunt u deze stap overslaan. Als u een container wilt starten, downloadt de Docker-daemon au­to­ma­tisch de images uit de re­po­si­to­ry die hij niet op het lokale systeem kan vinden.

Docker-images als con­tai­ners starten

Om een Docker-image te starten, gebruikt u het commando docker run:

docker run [OPTIONS] IMAGE [:TAG|@DIGEST] [CMD] [ARG...]
bash

Het enige ver­plich­te onderdeel van het docker run -commando is de naam van de gewenste Docker-image. Maar wanneer u een container start, kunt u ook extra opties, TAG’s en DIGEST’s de­fi­ni­ë­ren. Bovendien kan het docker run worden ge­com­bi­neerd met andere commando’s die worden uit­ge­voerd zodra de container start. In dit geval wordt de CMD (COMMAND, ge­de­fi­ni­eerd door de maker van de image en au­to­ma­tisch uit­ge­voerd wanneer de container wordt gestart) over­schre­ven. Andere optionele con­fi­gu­ra­ties kunnen worden ge­de­fi­ni­eerd via aan­vul­len­de ar­gu­men­ten (ARG…). Dit maakt het bij­voor­beeld mogelijk om ge­brui­kers toe te voegen of om­ge­vings­va­ri­a­be­len over te dragen.

Gebruik de op­dracht­re­ge­lop­dracht

docker run docker/whalesay cowsay boo
bash

om het bestaande Perl-script als af­beel­ding te down­lo­a­den en in een container uit te voeren. Je zult zien dat whalesay aan­zien­lijk verschilt van het bron­script.

Afbeelding: Terminal output of the container docker/whalesay: The whale says ‘boo’
If docker/whalesay is run with the standard command, the Docker whale is limited to a short ‘boo’

Als de af­beel­ding docker/whalesay wordt uit­ge­voerd, geeft het script een ASCII-af­beel­ding in de vorm van een walvis weer, evenals het tekst­be­richt ‘boo’, dat wordt door­ge­ge­ven met het cowsay- commando in de terminal.

Net als bij de testrun zoekt de daemon eerst naar de gewenste af­beel­ding in de lokale be­stands­map. Aangezien er geen pakket met dezelfde naam bestaat, wordt een pull uit de Docker-re­po­si­to­ry gestart. Ver­vol­gens start de daemon het aan­ge­pas­te cowsay-programma. Als dit is voltooid, wordt de container au­to­ma­tisch beëindigd.

Net als cowsay biedt ook whalesay van Docker de mo­ge­lijk­heid om in te grijpen in de pro­gram­ma­se­quen­tie om de tekst­uit­voer in de terminal te be­ïn­vloe­den. Test deze functie door bij­voor­beeld de ‘boo’ in het uit­voer­com­man­do te vervangen door een wil­le­keu­ri­ge te­ken­reeks of door een flauwe wal­vis­grap.

sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
bash
Afbeelding: Terminal output of the container docker/whalesay: A whale with an individual message
Make your Docker whale say whatever you want by placing words in his speech bubble

Alle Docker-images op het lokale systeem weergeven

Als u niet zeker weet of u een bepaalde af­beel­ding al hebt ge­down­load, kunt u een overzicht bekijken van alle af­beel­din­gen op uw lokale systeem. Gebruik de volgende op­dracht­re­ge­lop­dracht:

sudo docker image
bash

Het commando docker images (al­ter­na­tief docker image ls) geeft alle lokale af­beel­din­gen weer, inclusief be­stands­groot­te, tag en af­beel­dings-ID.

Afbeelding: Overview of all images on the local system
The overview displays the images hello-world and docker/whalesay

Als u een container start, wordt de on­der­lig­gen­de image als kopie ge­down­load uit de re­po­si­to­ry en permanent op uw computer op­ge­sla­gen. Dit bespaart u tijd als u de image later nog eens wilt gebruiken. Er wordt alleen een nieuwe download gestart als de bron van de image verandert, bij­voor­beeld als er een nieuwere versie be­schik­baar is in de re­po­si­to­ry.

Alle con­tai­ners op het lokale systeem weergeven

Als u een overzicht wilt weergeven van alle con­tai­ners die op uw systeem draaien of in het verleden hebben gedraaid, gebruikt u de op­dracht­re­ge­lop­dracht docker ps in com­bi­na­tie met de optie --all (afgekort: -a):

sudo docker ps -a
bash
Afbeelding: Overview of all containers on the local system
The overview shows all con­tai­ners that have been launched on the Docker engine

De ter­mi­na­l­out­put bevat in­for­ma­tie zoals de be­tref­fen­de container-ID, de on­der­lig­gen­de af­beel­ding, het commando dat werd uit­ge­voerd toen de container werd gestart, het tijdstip waarop de container werd gestart en de status.

Als u alleen de con­tai­ners wilt weergeven die momenteel op uw systeem worden uit­ge­voerd, gebruikt u de op­dracht­re­ge­lop­dracht docker ps zonder andere opties:

sudo docker ps
bash

Op dit moment zouden er echter geen actieve con­tai­ners op uw systeem moeten staan.

Docker-images maken

Onze Docker-tutorial heeft u niet alleen laten zien hoe u images in de Docker Hub kunt vinden, down­lo­a­den en uitvoeren op elk systeem waarop de Docker-engine is ge­ïn­stal­leerd. Met Docker krijgt u niet alleen toegang tot het uit­ge­brei­de aanbod aan apps in het register. Het platform biedt ook een breed scala aan opties om uw eigen images te maken en deze te delen met andere ont­wik­ke­laars.

In de in­lei­den­de hoofd­stuk­ken van deze Docker-tutorial heb je al geleerd dat elke Docker-image is gebaseerd op een Doc­ker­fi­le. Je kunt Doc­ker­fi­les zien als een soort bouw­sja­bloon voor images. Dit zijn een­vou­di­ge tekst­be­stan­den die alle in­struc­ties bevatten die Docker nodig heeft om een image te maken. In de volgende stappen leer je hoe je dit type Doc­ker­fi­le schrijft en Docker opdracht geeft om dit als basis voor je eigen image te gebruiken.

  1. Maak een nieuwe map aan: Het Docker-ont­wik­ke­laars­team raadt aan om voor elk Doc­ker­fi­le een nieuwe map aan te maken. Mappen kunnen eenvoudig worden aan­ge­maakt in de terminal van Linux. Gebruik de volgende op­dracht­re­gel om een map met de naam my­doc­ker­build aan te maken:
mkdir mydockerbuild
bash
Afbeelding: Ubuntu terminal: The command mkdir
Create new di­rec­to­ries with the command mkdir
  1. Navigeer in de nieuwe map: Gebruik het commando cd om te navigeren in de nieuw aan­ge­maak­te werkmap.
cd mydockerbuild
bash
Afbeelding: Ubuntu terminal: The command cd
With the help of the cd command, switch to another working directory
  1. Nieuw tekst­be­stand aanmaken: Je kunt ook eenvoudig tekst­be­stan­den aanmaken via de terminal met Ubuntu. Gebruik hiervoor een editor zoals Nano of Vim. Maak een tekst­be­stand aan met de naam Doc­ker­fi­le in de map my­doc­ker­build.
nano Dockerfile
bash
Afbeelding: Ubuntu terminal: Create text files with Nano
The text editor Nano is prein­stal­led on all Ubuntu versions
  1. Schrijf Doc­ker­fi­le: Het nieuw aan­ge­maak­te tekst­be­stand dient als bouwplan voor uw zelf­ont­wik­kel­de image. In plaats van de image helemaal zelf te pro­gram­me­ren, gebruiken we in deze Docker-tutorial de demo-image docker/whalesay als sjabloon. Deze wordt ge­ïn­te­greerd met behulp van het commando FROM in uw Doc­ker­fi­le. Gebruik de tag :latest om te verwijzen naar de nieuwste versie van de image.
FROM docker/whalesay:latest

Tot nu toe werkt docker/whalesay door woorden in zijn mond te leggen. In de terminal wordt de exacte tekst die u hebt ingevoerd weer­ge­ge­ven in com­bi­na­tie met het commando om de container te starten. Maar het zou in­te­res­san­ter zijn als het script au­to­ma­tisch nieuwe tekst­uit­voer zou genereren. Dit kan bij­voor­beeld worden gedaan met behulp van het fortunes-programma dat op elk Linux-systeem be­schik­baar is. De ba­sis­func­tie van fortunes is het genereren van fortune cookie-uit­spra­ken en hu­mo­ris­ti­sche aforismen. Gebruik de volgende opdracht om uw huidige lokale pak­ket­in­dex bij te werken en fortunes te in­stal­le­ren:

RUN apt-get -y update && apt-get install -y fortunes

Definieer ver­vol­gens een CMD- in­struc­tie. Deze wordt uit­ge­voerd na het RUN-commando, tenzij deze is over­schre­ven door de call (docker run image CMD). Gebruik het volgende commando om het fortunes-programma uit te voeren met de optie -a (‘Kies uit alle databases’) en de uitvoer weer te geven via het cowsay- programma in de terminal:

CMD /usr/games/fortune -a | cowsay

Je Doc­ker­fi­le zou er als volgt uit moeten zien:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

Opmerking: Commando’s in een Doc­ker­fi­le worden altijd met enkele re­gel­af­stand ge­schre­ven en beginnen altijd met een trefwoord. De on­der­lig­gen­de syntaxis is niet hoofd­let­ter­ge­voe­lig, dus het maakt niet uit of u hoofd­let­ters of kleine letters gebruikt. Er is echter wel een con­sis­ten­te hoofd­let­ter­ge­bruik voor tref­woor­den vast­ge­steld.

Afbeelding: The text editor Nano in the Ubuntu terminal
Control the text editor Nano via the key com­bi­na­ti­ons given in the footer
  1. Tekst­be­stand opslaan: Sla uw invoer op. Als u de Nano-editor gebruikt, slaat u het bestand op met de toets­com­bi­na­tie [CTRL] + [O] en bevestigt u met [ENTER]. Nano geeft u de melding dat er drie regels naar het ge­se­lec­teer­de bestand zijn ge­schre­ven. Sluit de tekst­edi­tor met de toets­com­bi­na­tie [CTRL] + [X].
  2. Af­beel­ding maken als Doc­ker­fi­le: Om een af­beel­ding te maken op basis van een Doc­ker­fi­le, navigeert u eerst naar de map waar het tekst­be­stand zich bevindt. Start het maken van de af­beel­ding met de op­dracht­re­ge­lop­dracht docker build. Als u de af­beel­ding een in­di­vi­du­e­le naam wilt geven of een tag wilt toevoegen, gebruikt u de optie -t, gevolgd door de gewenste com­bi­na­tie van label en tag. Het stan­daard­for­maat is name:tag.

In het huidige voorbeeld moet een af­beel­ding met de naam docker-whale worden gemaakt:

docker build -t docker-whale .
bash

De laatste periode geeft aan dat het on­der­lig­gen­de Doc­ker­fi­le in de ge­se­lec­teer­de map is gevonden. U kunt ook een be­stands­pad of een URL voor de bron­be­stan­den opgeven.

Het bouw­pro­ces begint zodra het commando wordt bevestigd met [ENTER]. Eerst con­tro­leert de Docker-daemon of hij alle bestanden heeft die hij nodig heeft om de image te maken. In Docker-ter­mi­no­lo­gie wordt dit sa­men­ge­vat onder de term ‘context’.

Ver­vol­gens bevindt de docker/whalesay -af­beel­ding met de tag :latest zich op:

Als de vereiste context voor het maken van de image al volledig aanwezig is, start de Docker-daemon de image-sjabloon die via FROM is gekoppeld in een tij­de­lij­ke container en gaat hij verder met de volgende opdracht in het Doc­ker­fi­le. In het huidige voorbeeld is dit de RUN-opdracht, waardoor het fortunes-programma wordt ge­ïn­stal­leerd.

Aan het einde van elke stap van het beeld­cre­a­tie­pro­ces geeft Docker u een ID voor de bij­be­ho­ren­de laag die in die stap is gemaakt. Dit betekent dat elke regel in het on­der­lig­gen­de Doc­ker­fi­le over­een­komt met een laag van het beeld dat daarop is gebouwd.

Wanneer het RUN-commando is voltooid, stopt de Docker-daemon de container die ervoor is gemaakt, ver­wij­dert deze en start een nieuwe tij­de­lij­ke container voor de laag van de CMD-in­struc­tie. Aan het einde van het aan­maak­pro­ces wordt deze tij­de­lij­ke container ook beëindigd en ver­wij­derd. Docker geeft u de ID van de nieuwe image:

Successfully built a8f2048c9ab8
Afbeelding: Ubuntu terminal: Status message during image creation
Docker images are created in multiple layers

Je nieuw aan­ge­maak­te af­beel­ding is te vinden onder de naam docker-whale in het overzicht van je lokaal op­ge­sla­gen af­beel­din­gen.

sudo docker images
bash
Afbeelding: Ubuntu terminal: Overview of all images
The newly created image in the image overview

Om een container te starten vanuit uw nieuw aan­ge­maak­te image, gebruikt u de op­dracht­re­ge­lop­dracht sudo docker run in com­bi­na­tie met de naam van de image:

sudo docker run docker-whale
bash

Als de af­beel­ding correct is gemaakt vanuit het Doc­ker­fi­le, zou je walvis je nu moeten in­spi­re­ren met min of meer wijze woorden. Opmerking: elke keer dat je de container opnieuw opstart, wordt er een nieuwe zin ge­ge­ne­reerd.

Afbeelding: Container based on docker-whale: Text output in the terminal
Thanks to fortunes, the ASCII whale now provides witty or wise phrases

Tag Docker-images en upload ze naar Docker Hub.

Als u uw aan­ge­pas­te docker-whale- image naar de hub wilt uploaden en be­schik­baar wilt maken voor de community of een werkgroep, moet u deze eerst koppelen aan een re­po­si­to­ry met dezelfde naam in uw eigen per­soon­lij­ke naam­ruim­te. In de Docker-ter­mi­no­lo­gie wordt deze stap ‘tagging’ genoemd.

Om een af­beel­ding in de Docker Hub te pu­bli­ce­ren, gaat u als volgt te werk:

  1. Maak een re­po­si­to­ry aan: Log in op de Docker Hub met je Docker-ID en per­soon­lij­ke wacht­woord en maak een openbare re­po­si­to­ry aan met de naam docker-whale.
Afbeelding: The Docker hub: Entry form for creating a repository
Create a re­po­si­to­ry for your custom image / Source: hub.docker.com
  1. Bepaal de af­beel­dings-ID: Bepaal de ID van uw aan­ge­pas­te af­beel­ding docker-whale met behulp van de op­dracht­re­ge­lop­dracht docker images.
Afbeelding: Overview of all local images in the Ubuntu terminal
The command docker images lists all images that are saved on your system

In ons geval is de af­beel­dings-ID a8f2048c9ab8. We hebben dit nodig voor het taggen in de volgende stap.

  1. Tag de af­beel­ding: Tag de docker-whale- af­beel­ding met behulp van het op­dracht­re­gel­pro­gram­ma docker tag volgens het volgende:
sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
bash

Voor het huidige voorbeeld luidt de op­dracht­re­gel­richt­lijn voor tagging als volgt:

sudo docker tag a8f2048c9ab8 [Namespace]/docker-whale:latest
bash

Je kunt con­tro­le­ren of je je af­beel­ding correct hebt getagd met behulp van het docker images -overzicht. De naam van de re­po­si­to­ry moet nu je Docker-ID bevatten.

Afbeelding: Ubuntu terminal: Image overview before and after tagging
Link images with your Docker ID using the command docker tag
  1. De af­beel­ding uploaden: Om de af­beel­ding te uploaden, moet u eerst inloggen op de Docker Hub. Dit kunt u doen met behulp van het commando docker login.
sudo docker login
bash

De terminal vraagt je dan om je ge­brui­kers­naam (Docker ID) en wacht­woord in te voeren.

Afbeelding: Log in to the Docker hub via the Ubuntu terminal
Before you can upload an image to the Docker hub, you first need to log in

Als het inloggen is gelukt, gebruik dan de op­dracht­re­ge­lop­dracht docker push om je af­beel­ding te uploaden naar de nieuw aan­ge­maak­te re­po­si­to­ry.

sudo docker push [Namespace]/docker-whale
bash

Het uploaden duurt slechts enkele seconden. De huidige status wordt weer­ge­ge­ven in de terminal.

Afbeelding: Ubuntu terminal: Status message of the image upload
After uploading, the image is available under the set tag latest in the Docker hub

Log in op de Docker Hub via de browser om de geüploade af­beel­ding te bekijken.

Afbeelding: Docker hub: The repository [Namespace]/docker-whale in the detailed view
The latest update of your re­po­si­to­ry is shown in the detailed view / Source: hub.docker.com

Als u meer dan één af­beel­ding per re­po­si­to­ry wilt uploaden, gebruik dan ver­schil­len­de tags om uw af­beel­din­gen in ver­schil­len­de versies aan te bieden. Bij­voor­beeld:

[Namespace]/docker-whale:latest
[Namespace]/docker-whale:version1
[Namespace]/docker-whale:version2

Een overzicht van de ver­schil­len­de beeld­ver­sies is te vinden in de Docker Hub-re­po­si­to­ry onder het tabblad ‘Tags’.

Afbeelding: Docker hub: The ‘Tags’ tab
In the ‘Tags’ tab, you’ll find all versions of an image / Source: hub.docker.com

Af­beel­din­gen van ver­schil­len­de projecten moeten echter in aparte op­slag­plaat­sen worden aan­ge­bo­den.

Als het uploaden is gelukt, is je aan­ge­pas­te af­beel­ding nu be­schik­baar in de openbare re­po­si­to­ry voor alle Docker-ge­brui­kers we­reld­wijd.

  1. Testrun: Test het succes van de upload door te proberen de af­beel­ding te down­lo­a­den.

Houd er rekening mee dat de lokale versie van de image eerst moet worden ver­wij­derd om een nieuw exemplaar met dezelfde tag te kunnen down­lo­a­den. Anders meldt Docker dat de gewenste image al in de huidige versie aanwezig is.

Afbeelding: The Image is up to date
If an image exists locally, the pull command is cancelled

Om de lokale Docker-image te ver­wij­de­ren, gebruikt u de op­dracht­re­ge­lop­dracht docker rmi in com­bi­na­tie met de bij­be­ho­ren­de image-ID. Deze wordt zoals ge­woon­lijk bepaald via docker images. Als Docker een conflict re­gi­streert, bij­voor­beeld omdat een image-ID in meerdere re­po­si­to­ries wordt gebruikt of in een container wordt gebruikt, herhaalt u uw opdracht met de optie --force (afgekort*-f* ) om een ver­wij­de­ring af te dwingen.

sudo docker rmi -f a8f2048c9ab8
bash
Afbeelding: Command docker rmi in combination with the option -f (force)
Use the command docker rmi in com­bi­na­ti­on with the option -f to force a deletion

Geef opnieuw een overzicht van alle lokale af­beel­din­gen weer:

sudo docker Images
bash

De ver­wij­der­de elementen zouden niet meer in de ter­mi­nal­uit­voer moeten ver­schij­nen. Gebruik nu het pull-commando in de re­po­si­to­ry om een nieuwe kopie van de image te down­lo­a­den van de Docker hub.

sudo docker pull [Namespace]/docker-whale
bash
Afbeelding: Ubuntu terminal: Download from the Docker hub
The pre­vious­ly published image is suc­ces­sful­ly down­lo­a­ded

Aan­vul­len­de Docker-on­der­wer­pen en tutorials

Het Docker-universum is groot en in de loop der tijd is er een levend eco­sys­teem ontstaan rond Docker-tools. Docker is vooral handig voor be­heer­ders, vooral als ze complexe ap­pli­ca­ties met meerdere con­tai­ners parallel op ver­schil­len­de systemen draaien. Docker biedt diverse functies voor het or­ke­stre­ren van dit soort clusters. Meer in­for­ma­tie hierover vindt u in ons artikel over Docker-or­kestra­tie met Swarm en Compose.

De digitale gids bevat aan­vul­len­de tutorials voor het werken met Docker:

  • Een Docker-re­po­si­to­ry instellen
  • Docker-container volumes
  • Docker: back-up en herstel
  • Docker in­stal­le­ren en uitvoeren op een Linux-server
  • Docker Compose-hand­lei­ding

Docker is geschikt voor ver­schil­len­de toe­pas­sings­sce­na­rio’s. In de digitale gids vindt u de volgende tutorials:

Docker is niet altijd de beste keuze voor elke toe­pas­sing. Een van onze artikelen behandelt de po­pu­lair­ste al­ter­na­tie­ven voor Docker. Daarnaast hebben we veel artikelen be­schik­baar waarin Docker wordt ver­ge­le­ken met andere platforms:

  • Ku­ber­ne­tes versus Docker
  • Openshift versus Docker
  • Podman versus Docker
Ga naar hoofdmenu