Docker

docker

Met docker is het mogelijk om via de command line (CLI) containers te maken en te beheren. Op public cloud diensten kan eenvoudig een Linux host gemaakt worden die ondersteuning biedt voor containers. On-premise kan een bare-metal host of een VM gebruikt worden, of een desktop/laptop met een modern OS.

In CentOS kan docker geïnstalleerd worden via deze instructies: https://docs.docker.com/engine/install/centos/

in Debian: https://docs.docker.com/engine/install/debian/

en in Ubuntu: https://docs.docker.com/engine/install/ubuntu/

Om de docker daemon automatisch te starten, ook na een restart van de host:

$ sudo systemctl enable docker-ce --now

Docker Desktop

Docker Desktop biedt een grafische interface om docker containers te beheren zonder de commando’s op een command line te hoeven geven.

Docker Desktop for Mac

Volg de instructies op deze pagina: https://docs.docker.com/docker-for-mac/install/

Docker Desktop for Windows

Volg de instructies op deze pagina: https://docs.docker.com/docker-for-windows/install/


Docker via de CLI:

Handig is het om de huidige gebruiker toe te voegen aan de docker group:

$ sudo usermod -aG docker ${USER}

hierna opnieuw inloggen!

Het commando ‘docker‘ wordt gevolgd door een subcommando, bijvoorbeeld ‘run‘ dat aangeeft dat een image gestart moet worden. De naam van de image dient ingegeven te worden en als voorbeeld is er ‘hello-world‘ waardoor het volledige commando er als volgt uitziet:

$ docker run hello-world

Er wordt eerst gecontroleerd of de image ‘hello-world’ lokaal aanwezig is, zoniet dan wordt deze gedownload van de Docker Hub waarna het geladen en uitgevoerd wordt.

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

Om bijvoorbeeld een ubuntu container te starten, type het volgende commando:

$ docker run -it ubuntu bash

Het resultaat is een geïsoleerde Ubuntu bash shell:

In de Docker Hub kunnen gebruikers en bedrijven hun code plaatsen die dan door iedereen gebruikt kunnen worden.

Kijk op https://hub.docker.com voor een Docker image genaamd ‘whalesay

Om deze image te gebruiken, type het volgende commando:

$ docker run docker/whalesay cowsay Hello World!

De eerste keer dat dit commando uitgevoerd wordt zal docker de image zoeken op het lokale systeem. Als het daar (nog) niet aanwezig is wordt het opgehaald van de Docker Hub. Met het commando docker images wordt een lijst met aanwezige images getoond. als de whalesay image nogmaals wordt aangeroepen zal deze vanuit de lokale verzameling images gestart worden.

We kunnen ook zelf een docker image schrijven en deze laden. Laten we hier een directory maken genaamd mydockerbuild

$ mkdir mydockerbuild
$ cd mydockerbuild

Hier gaan we een bestand maken genaamd Dockerfile met

$ vi Dockerfile

We geven dit bestand de volgende inhoud:

FROM docker/whalesay:latest
LABEL Maintainer="Nico Oosterwijk" NAME="whalesay"
RUN apt update
RUN apt install -y fortunes
CMD /usr/games/fortune -a | cowsay

Het woord ‘FROM‘ laat docker weten welke base-image gebruikt gaat worden, vervolgens doen we een apt-update met ‘RUN’ om daarna ‘fortunes’ te installeren en uit te voeren met ‘CMD’.

Step 1/4 : FROM docker/whalesay:latest
latest: Pulling from docker/whalesay
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
00bf65475aba: Pull complete
...
Status: Downloaded newer image for docker/whalesay:latest
 ---> 6b362a9f73eb
Step 2/4 : LABEL Maintainer="Nico Oosterwijk" Name="whalesay"
---> Running in 87cad719ef2d
Removing intermediate container 87cad719ef2d
 ---> b97cb483a190
Step 3/4 : RUN apt update 
 ---> Running in 8effd43cf430
...
Removing intermediate container 8effd43cf430
 ---> 50377237a303
Step 4/5 : RUN apt install -y fortunes 
 ---> Running in c45e887516e6
Removing intermediate container c45e887516e6
 ---> 423c4ed354ff
Step 5/5 : CMD /usr/games/fortune -a | cowsay
---> Running in f79bebedb08e
Removing intermediate container f79bebedb08e
 ---> ea0ad5e48e04
Successfully built ea0ad5e48e04
Successfully tagged docker/whalesay:latest

Voor elke instructie in Dockerfile wordt een ‘intermediate‘ layer gemaakt, aangepast en in een definitieve layer geplaatst. De intermediate layers worden verwijderd en uiteindelijk blijft er een ‘image‘ over waar de definitieve layers in aanwezig zijn.

Als hetzelfde build-commando wordt gegeven zonder aanpassingen in de Dockerfile, wordt gebruik gemaakt van het ‘cache’-mechanisme van docker en worden de eerder aangemaakte layers gebruikt:

Step 1/5 : FROM docker/whalesay:latest
 ---> 6b362a9f73eb
Step 2/5 : LABEL Maintainer="Nico Oosterwijk" Name="whalesay"
 ---> Using cache
 ---> b97cb483a190
Step 3/5 : RUN apt -y update
 ---> Using cache
 ---> 50377237a303
Step 4/5 : RUN apt install -y fortunes
 ---> Using cache
 ---> 423c4ed354ff
Step 5/5 : CMD /usr/games/fortune -a | cowsay
 ---> Using cache
 ---> ea0ad5e48e04
Successfully built ea0ad5e48e04
Successfully tagged docker/whalesay:latest

Wordt de Dockerfile wel aangepast, dan wordt vanaf de aanpassing opnieuw gebouwd en nieuwe layers aangemaakt. Voor efficiëntie is het dus verstandig om instructies die (vaak) wijzigen, zo laag mogelijk in de Dockerfile te plaatsen.

Nadat dit bestand is aangemaakt gaan we docker instructie geven om er een image van te maken met:

$ docker build -t docker-whale .

(vergeet de laatste . punt niet)

Met het commando ‘docker images‘ worden de lokale images getoond en dus ook degene die we zojuist gemaakt hebben:

Om deze uit te voeren:

$ docker run docker-whale

De docker image gaan we delen met de wereld! In de Docker Hub gaan we een repository maken en we loggen vervolgens in via het commando ‘docker login

We taggen de image met het image ID:

$ docker tag 6d6944493858 nokkie/docker-whale:latest

Vervolgens geven we het commando ‘docker push‘ om de image in de repository te plaatsen.

That’s all folks!