Je weet nu hoe je een image in de Docker-hub vindt, deze downloadt en op ieder systeem uitvoert dat de Docker-engine heeft geïnstalleerd. Maar met Docker heb je tot veel meer diensten toegang dan alleen het omvangrijke app-aanbod. Het platform biedt ook nog uitgebreide mogelijkheden om eigen images te creëren en met andere ontwikkelaars te delen.
In de inleidende hoofdstukken van deze tutorial heb je al gelezen dat het Docker-image zich op een zogenoemd Dockerfile baseert. Dockerfiles zijn een soort van montagehandleiding voor images. Het zijn eenvoudige tekstbestanden met alle stappen die Docker nodig heeft om een image te creëren. Leer met onderstaande stappen hoe je zo'n Dockerfile schrijft en hoe je Docker beveelt om dit als basis voor een eigen image te gebruiken.
1. Nieuwe registry maken: de Docker-ontwikkelaars raden aan om voor iedere Dockerfile een eigen registry aan te maken. Je kunt een registry op Linux eenvoudig via de terminal aanmaken. Gebruik het onderstaande commando om een registry met de naam mydockerbuild aan te maken.
$ mkdir mydockerbuild
2. In de nieuwe registry navigeren: gebruik het commando cd om in de nieuwe werkregistry te navigeren.
$ cd mydockerbuild
3. Nieuw tekstbestand aanmaken: ook tekstbestanden kun je op Ubuntu eenvoudig via de terminal creëren. Gebruik daarvoor een editor zoals Nano of Vim. Creëer in de registry mydockerbuild een tekstbestand met de naam Dockerfile.
$ nano Dockerfile
4. Dockerfile schrijven: het nieuwe tekstbestand is een bauwplan voor je zelfontwikkelde image. Bij deze Docker-tutorial programmeren we een image niet in zijn geheel. In plaats daarvan gebruiken we de demo-image docker/whalesay als patroon. Het image voegen we via het commando FROM aan de Dockerfile toe. Gebruik de tag :latest om naar de nieuwste versie van het image te verwijzen.
FROM docker/whalesay:latest
Tot nu functioneerde docker/whalesay zo, dat je zelf kon aangeven wat de walvis zegt. In de terminal verschijnt precies de tekst die je daarvoor in combinatie met het commando om de container op te starten hebt gebruikt. Maar het is natuurlijk veel interessanter als het script automatisch steeds nieuwe teksten zou genereren. Dit kun je bijvoorbeeld met het programma fortunes realiseren dat op ieder Linuxsysteem beschikbaar is. De basisfunctie van fortunes is het genereren van filosofische uitspraken en grappige aforismen. Gebruik onderstaand commando om je lokale pakket-index te actualiseren en fortunes te installeren:
RUN apt-get -y update && apt-get install -y fortunes
Vervolgens definieer je een CMD-statement. Dit wordt na het commando RUN uitgevoerd, als er niet tijdens het openen (docker run image CMD) overheen is geschreven. Gebruik
CMD /usr/games/fortune -a | cowsay
Vervolgens definieer je een CMD-statement. Dit wordt na het commando RUN uitgevoerd, als er niet tijdens het openen (docker run image CMD) overheen is geschreven. Gebruik
CMD /usr/games/fortune -a | cowsay
om het programma fortunes met de optie -a ("kies uit alle databases") uit te voeren en de mededelingen via het programma cowsay in de terminal te laten zien.
Je Dockerfile moet er nu als volgt uitzien:
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
Let op: commando's binnen een Dockerfile bestaan altijd uit alleen maar één regel en beginnen altijd met een sleutelwoord. De syntaxis van het systeem is case-insensitive - het maakt dus niet uit of je hoofdletters of kleine letters gebruikt. Het is echter gebruikelijk om sleutelwoorden altijd met hoofdletters te schrijven.
5. Tekstbestand opslaan: sla je bestand op. Gebruik de toetsencombinatie [CTRL] + [O] als je de editor Nano gebruikt en bevestig met [ENTER]. Nano meldt nu dat drie regels in het gekozen bestand zijn geschreven. Beëindig de teksteditor met de toetsencombinatie [CTRL] + [X].
6. Image vanuit Dockerfile creëren: om een image vanuit een Dockerfile aan te maken, moet je eerst naar de registry navigeren, waarin je het tekstbestand hebt opgeslagen. Je creëert een image met het commando docker build. Als je het image individueel een naam of tag wilt geven, moet je gebruikmaken van de optie -t en vervolgens de gewenste combinatie van naam en tag toevoegen. Gebruik de standaardopbouw .
Bij het actuele voorbeeld is het de bedoeling een image met de naam docker-whale aan te maken:
$ docker build -t docker-whale .
De afsluitende punt geeft aan dat de Dockerfile die als basis dient, in de gekozen registry te vinden is. Als alternatief is het mogelijk om een bestandspad of URL naar het bronbestand aan te geven.
Het build-proces begint zodra je het commando met [ENTER] hebt bevestigd. Eerst controleert de Docker-daemon of alle bestanden ter beschikking staan die hij nodig heeft om een image aan te maken. In de Docker-terminologie worden deze samengevat onder het begrip ‘context’. In de terminal verschijnt de statusmelding:
Sending build context to Docker daemon 2.048 kB
Vervolgens wordt het image docker/whalesay met de tag :latest gelokaliseerd:
Step 1/3 : FROM docker/whalesay:latest
---> 6b362a9f73eb
Als de context die nodig is om het image te creëren in zijn geheel beschikbaar is, start de Docker-daemon het via FROM toegevoegde image-patroon in een tijdelijke container op en gaat naar het volgende commando in de Dockerfile. Bij het actuele voorbeeld gaat het om een RUN-commando waardoor het programma fortunes wordt geïnstalleerd.
Step 2 : RUN apt-get -y update && apt-get install -y fortunes
---> Running in 80b81eda1a11
…etc.
Aan het einde van iedere stap die wordt gezet om een image te maken, geeft Docker je een ID voor de layer (laag) die tijdens deze stap is aangemaakt. Iedere regel in de Dockerfile die als basis dient, is in dit geval een layer van het image dat daarop is opgebouwd.
Als het RUN-commando is beëindigd, stopt de Docker-daemon de daarvoor gecreëerde container, verwijdert hem en start een nieuwe tijdelijke container op voor de layer van het CMS-statement.
Step 3/3 : CMD /usr/games/fortune -a | cowsay
---> Running in c3ac46675e7a
---> 4419af61d32d
Removing intermediate container c3ac46675e7a
Wanneer je aan het einde komt van het proces waarin je een image creëert, wordt ook de tijdelijke container, die in stap 3 is aangemaakt, afgesloten en verwijderd. Docker geeft de ID van de nieuwe image aan:
Successfully built 4419af61d32d
Je nieuwe image vind je onder de naam docker-whale in het overzicht van je lokaal opgeslagen images.
$ sudo docker images
Om een container uit je nieuwe image op te starten, gebruik je het commando sudo docker run in combinatie met de naam van de image.
$ sudo docker run docker-whale
Als het image foutloos vanuit de Dockerfile is aangemaakt, is je walvis nu in staat om filosofische en grappige uitspraken te maken. Let op: iedere keer dat je de container opnieuw start, wordt een andere uitspraak gegenereerd.