Docker containers

Projectdoelen:

  • De student kan 3 voordelen opnoemen, die docker containers bieden boven een normale installatie van pakketten

  • Voordeel 1: Isolatie: Minder systeemvervuiling

  • Voordeel 2: Voorspelbaarheid: Gedrag van applicatie verandert niet op ander operating systems.

  • Voordeel 3: Inzetbaarheid: docker containers kunnen makkelijk kant en klaar gedistribueerd worden

  • De student kan een container van de docker hub 'pullen'

  • De student kan een eigen container pushen naar de docker hub

  • De student kan een eenvoudige docker container bouwen mbv docker-compose en Dockerfiles

Les 1 Account/Linux VM

  • Account maken op docker hub. Met deze account kun je docker containers downloaden en uitproberen. Ook kun je je eigen images 'uploaden'.

  • Debian 11 (Bullseye) GUI virtuele machine maken van minimaal 40 Gb en 2048 Mb RAM. Als desktop environment selecteer je de lichtgewicht XFCE desktop.

debian openlogo.svg
Figure 1. Debian

Je gaat docker installeren in je Debian VM.

Docker installatieproces.

Stap Commando

Update de apt pakketindex en installeer pakketten zodat apt een repository over HTTPS kan gebruiken

sudo apt update && sudo apt upgrade -y

De officiele Docker GPG key toevoegen aan je systeem

sudo apt install ca-certificates curl gnupg lsb-release

Maak een directory aan voor de keyring van Debian

sudo mkdir /etc/apt/keyrings

Haal nu de gpg sleutel op, waarmee je de integriteit van dit pakket gecontroleerd wordt

sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Je Debian repository aanpassen

sudo 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

Opnieuw updaten

sudo apt update

Bij een GPG fout dit commando uitvoeren

sudo chmod a+r /etc/apt/keyrings/docker.gpg

En weer opnieuw proberen up te daten

sudo apt update

Installeer de laatste versie van Docker Engine, containerd, and Docker Compose

sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Je eerste programma klonen

sudo docker run hello-world

Installatie van docker-compose. Met docker-compose kun je verschillende Dockerfiles aan elkaar koppelen. Daardoor kun je containers laten samenwerken.

Stap Commando

Download de laatste versie van docker-compose. Hiermee voeg je ook het pad naar het uitvoerbare bestand van docker-compose in.

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Geef het uitvoerbare bestand van docker-compose de juiste permissies

sudo chmod +x /usr/local/bin/docker-compose

Voer deze stap alleen uit wanneer je straks command not found krijgt wanneer je docker-compose wilt uitvoeren.

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Test de installatie

docker-compose --version

Je zou zoiets in beeld moeten krijgen

docker-compose version 1.29.2, build 5becea4c

Les 2 Basic commands in Docker

Docker is een platform waarmee ontwikkelaars gemakkelijk toepassingen kunnen implementeren, uitvoeren en beheren in een gecontaineriseerde omgeving. Een container is een lichtgewicht, standalone, uitvoerbaar pakket dat alles bevat wat nodig is om een stuk software te draaien, inclusief de code, een runtime = (uitvoerbaar bestand), systeemtools, bibliotheken en instellingen.

Hier zijn enkele basiscommando’s om met Docker aan de slag te gaan:

  • docker pull: Deze opdracht wordt gebruikt om een specifieke afbeelding te downloaden uit het Docker-register.

  • docker run: Dit commando wordt gebruikt om een container te starten vanuit een specifiek image.

  • docker ps (-a): Dit commando wordt gebruikt om alle draaiende containers op te sommen.

  • docker stop: Dit commando wordt gebruikt om een draaiende container te stoppen.

  • docker rm: Dit commando wordt gebruikt om een container te verwijderen.

  • docker images: Dit commando wordt gebruikt om alle lokaal opgeslagen images op te sommen.

  • docker rmi: Dit commando wordt gebruikt om een specifieke image te verwijderen.

Daarnaast kun je docker-compose gebruiken om multi-container applicaties te beheren met behulp van een docker-compose.yml bestand.

Inleveren

Voer het commando docker pull hello-world uit. Hiermee haal je een simpele Hello world! container op. Probeer de bovenstaande commando’s uit. Plak de screenshot van het resultaat van elk commando in een document en uplod het naar de ELO.

Les 3 Docker image downloaden en testen

In deze les leer je hoe je van docker hub een image kunt downloaden.

Dit doe je met het commando docker pull <xxx> Met dit commando haal je altijd de laatst versie van een container op.

We gaan een docker image ophalen met de naam Mediawiki

  • Stap 1: log in op docker hub met je account.

  • Stap 2: Typ in het zoekvenster "mediawiki"

  • Stap 3: Kopieer het commando rechtsboven, wat begint met docker pull en plak het in de terminal van je VM. Vergeet niet om het als root user uit te voeren (sudo)

  • Stap 4: Wanneer de 'pull' klaar is. kun je de container starten met sudo docker run --name some-mediawiki -p 8080:80 -d mediawiki

  • Stap 5: Open de browser in je VM en typ in de adresbalk localhost:8080. Je ziet dat poort 80 in de docker container met poort 8080 op je host machine 'praat'

mediawiki
Figure 2. Setup pagina van Wikimedia
  • Klik op Complete the installation

  • Kies je favoriete taal in de language setup

  • Scroll naar beneden en kijk of je de regel The environment has been checked. You can install MediaWiki. ziet staan. Zo ja, ga dan door met de installatie

  • Klik helemaal onderin op Continue

  • Kies op de volgende pagina _Database type: SQLite

  • Geef een naam aan je Wiki. Bijvoorbeeld: open source of Mijn kennisbank

  • Laat de keuze op Same as the wiki name staan

  • Maak nu een administrator account aan. Je kunt je eigen mailadres gebruiken.

  • Laat het subscribe en het Share data…​ keuzevakje leeg

  • Kies daarna I’m bored already, just install the wiki.

  • Klik dan nog een keer op continue

  • Er wordt een bestand met de naam LocalSettings.php automatisch gedownload naar je Downloads directory

  • Kopieer dit bestand vanuit de Downloads directory naar je container…​

  • Je moet daarvoor eerst de naam van je container weten. Dat kun je uitvinden met sudo docker ps -a

  • Je ziet dat voor de naam wikimedia een hash staat. Bijvoorbeeld: 0b1b6ae74f71

  • Voer nu het commando sudo docker cp LocalSettings.php 0b1b6ae74f71:/var/www/html/ uit

  • Ga weer terug naar je browser en log opnieuw in

  • Maak een nieuwe wikipagina aan door achter de url in de adresbalk newpage te typen

  • Klik daarna op de link create this page

  • Kopieer daarna wat tekst uit een Wikipedia pagina in het tekstvak en sla de pagina op

Inleveren

Maak nu een screenshot van je nieuwe wikiartikel en upload het naar de ELO.
newpage
Figure 3. Nieuwe pagina aanmaken
  • Sluit de browser

  • Stop de container met het commando docker stop 0b1b6ae74f71. Op de plaats van de hash -0b1b6ae74f71- vul je natuurlijk de hash in van jouw container!

  • Voor de volgende les voer je alvast dit commando uit: docker pull busybox

Les 3 Docker images beheren

Je hebt nu al mooi wat ervaring met docker opgedaan! Tijd om het beheer van je docker images aan te pakken.

  • Met het commando sudo docker ps -a krijg je een overzicht in beeld van alle gemaakte containers

  • Wanneer je sudo docker ps -a | grep Up intikt, krijg je een overzicht in beeld van alle actieve containers

  • Wanneer je sudo docker ps -a | grep Exited intikt, krijg je een overzicht in beeld van alle inactieve containers

  • Met sudo docker images krijg je alle gedownloade images in beeld

  • Het commando sudo docker restart 0b1b6ae74f71 herstart je je container. Dat kan handig zijn wanneer er veel is gewijzigd in de container.

  • De container kun je inactief maken met sudo docker stop 0b1b6ae74f71.

  • Wanneer je de container helemaal wilt verwijderen doe je dat met sudo docker rm 0b1b6ae74f71

  • Het commando sudo docker run -it ubuntu bash haalt de docker image van ubuntu op. Vervolgens kom je in de bash shell van de container terecht. Met de toetsencombi CTRL+D verlaat je de shell weer. Dat kun je ook doe door exit in te tikken.

Inleveren

Voer het commando `sudo docker run -it ubuntu bash` uit. Wanneer je 'binnen' bent, ga je de image updaten met `sudo apt update && sudo apt upgrade`
Maak vervolgens een screenshot zoals je hieronder ziet. Lever dit in op de ELO.
update container
Figure 4. Update container ubuntu

Les 4 Docker images aanpassen

Om te demonstreren dat een container na een herstart weer in de originele staat terugkeert kun je het volgende proberen:

Start je ubuntu container met sudo docker run -it ubuntu bash Voer rm -rf /usr/bin in de container uit.

Warning
Zorg ervoor dat je dit commando uitvoert in de container en niet op je laptop/desktop!

Hierdoor zullen andere commando’s zoals ls -l en bv. uptime niet werken. Zodra zulke commando’s niet meer werken, kun je de container afsluiten (type exit en druk op Enter) en hem dan opnieuw opstarten met het commando sudo docker run -it ubuntu bash. Aangezien Docker elke keer een nieuwe container aanmaakt, zou alles weer moeten gaan werken.

Controleer dat.

  • Voer het commando sudo docker run -p 8000:80 kezepema/dvwa-easyhack uit.

  • Voer nu sudo docker images uit. Je krijgt ongeveer zo’n overzicht in beeld:

images
Figure 5. Images overzicht
  • We gaan de naam van deze image aanpassen.

  • Dat doe je met sudo docker image tag 3e9a8a15cf64 easyhack

  • Op de plaats van 3e9a8a15cf64 voer je natuurlijk je eigen image_id in!

  • Nu gaan we de oude image weghalen. Dat gaat zo: sudo docker rmi -f kezepema/easyhack

  • Kijk nu weer naar het overzicht van de images. Is de image kezepema/easyhack verdwenen?

  • Start je container: sudo docker run -p 8000:80 easyhack

  • Open de browser in je VM en voer in de adres balk in: localhost:8000/website_2 (Probeer het geheime document te vinden!)

  • Probeer ook de raadsels op te lossen van localhost:8000/website_3, localhost:8000/website_4, localhost:8000/website_5 en localhost:8000/website_6

Inleveren

Zorg dat je vanuit website_6 de geheime zin kraakt.
Noteer de oplossing in Kladblok en lever dit in op de ELO.

Les 5 Een eigen docker image bouwen

  • Maak een directory aan in je Debian VM met de naam mijn_docker

  • Maak in die directory een bestand aan met de naam Dockerfile

  • Kopieer en plak de onderstaande tekst in het bestand:

FROM ubuntu
RUN apt update
RUN apt  install nginx -y
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

Wat staat hier nou eigenlijk?

Commando Uitleg

FROM ubuntu

Haal een ubuntu container op

RUN apt update

Wanneer de ubuntu image gedownload is, moet het systeem ge-update worden.

RUN apt install nginx -y

Na de update van het systeem, moet nginx geinstalleerd worden. Nginx is een webserver pakket, net zoiets als Apache2

COPY index.html /var/www/html/

Kopieer uit de directory waar je nu inzet, het bestand index.htm naar de nieuwe container in de locatie /var/www/html

EXPOSE 80

Zet de http poort 80 open in de container

CMD ["nginx","-g","daemon off;"]

Start de webserver nginx

Op het einde van de bouw van de container zie je ongeveer deze informatie:

title:Let op de regel Successfully built c076a10e93b3 ← Hiermee start je je container
  • Maak een index.html bestand aan met je eigen naam op de plaats van <Voornaam> en <Achternaam> als inhoud:

  • echo '<html><head><link rel="stylesheet" href="mijnstijl.css"></head><body><div id="sidebar">Hoi mijn naam is:<h1> Voornaam Achternaam</h1></div></body></html>' > index.html

  • Gebruik het commando sudo docker build -t mijneerstecontainer . (vergeet de punt aan het einde van het commando niet. Hiermee wordt bedoeld: bouw de container in deze directory)

  • Start je container met het commando sudo docker run -d -p 5000:80 mijneerstecontainer:latest. De -d betekent draai de code in 'detached' mode, op de achtergrond dus. De -p betekent zet poort 80 in de container op en laat deze praten met poort 5000 in de host.

  • Open nu je browser. Typ in de adresbalk localhost:5000

  • Wanneer het goed is, zie je de website die je net hebt gemaakt.

Inleveren

Maak een screenshot van je eigen webpagina.
Upload je screenshot en lever dit in op de ELO.

Les 6 Je Dockerfile uitbreiden

In de vorige les heb je al wat basiscommando’s uitgeprobeerd in je Dockerfile. Je Dockerfile bevat in feite alle informatie om een container te bouwen.

FROM maakt een laag vanaf een bepaalde Docker image.
COPY voegt bestanden vanuit de hostdirectory naar de container.
RUN voert een programma in de container uit.
CMD voert een commando uit in de container.

We gaan een stylesheet aan je Dockerfile toevoegen. dan ziet je webpagina er wat meer 'fancy' uit.

  • Maak eerst een stylesheet aan in de directory waar zich ook je Dockerfile bevindt.

  • Typ: nano mijnstijl.css

  • Plak de onderstaande inhoud in het bestand:

<style>
* {
  box-sizing: border-box;
}

body {
  margin: 0;
  font-family: Arial, Helvetica, sans-serif;
}

/* Style the side navigation */
.sidenav {
  height: 100%;
  width: 200px;
  position: fixed;
  z-index: 1;
  top: 0;
  left: 0;
  background-color: #111;
  overflow-x: hidden;
}


/* Side navigation links */
.sidenav a {
  color: white;
  padding: 16px;
  text-decoration: none;
  display: block;
}

/* Change color on hover */
.sidenav a:hover {
  background-color: #ddd;
  color: black;
}

/* Style the content */
.content {
  margin-left: 200px;
  padding-left: 20px;
}
</style>
  • Sla het bestand op met CTRL+O en daarna CTRL+X

  • Pas nu je index.html bestand aan. Die heb je al eerder gemaakt in Les 5.

  • Voeg onder de <html> tag een <head> tag in.

  • Voeg de volgende regel toe na <head>: <link rel="stylesheet" href="mijnstijl.css">

  • Plaats onder deze regel de close tag </head>

html css
Figure 6. Eindresultaat
  • Sla het bestand op.

  • Nu moet je je Dockerfile bijwerken.

Inleveren

Stuur je bijgewerkte Dockerfile in op de ELO

Les 7 Je Dockercontainer 'pushen'

Je hebt een account aangemaakt op Github. In deze les leer je hoe je je eigen image kunt pushen naar de docker hub.

In de vorige les heb je geleerd hoe je zelf een Dockerfile kunt aanpassen en uitbreiden.

Wanneer je deze image wilt uploaden naar je account op de docker hub,heb je een aantal stappen nodig:

  • Login op https://hub.docker.com

  • Je moet een repository (een soort bibliotheek) aanmaken voor jouw image.

  • Klik op het woord Repositories bovenaan dockerhub

repo
Figure 7. Klik op Repositories
  • Klik daarna op de blauwe knop Create

create
Figure 8. Create repository
  • Vul nu de naam van je repository in. Bijvoorbeeld: mijneerstecontainer of testcontainer en klik daarna op 'Create'

repo
Figure 9. Naam van de repository
  • Ga nu terug naar je terminal.

  • Tik het commando sudo docker images

images22
Figure 10. Een overzicht van de images
  • Je moet nu eerst de tag aanpassen van je image.

  • Hiervoor pakken we de image van ubuntu uit de lijst: ubuntu latest 6b7dfa7e8fdb 5 weeks ago 77.8MB

  • In de lijst zie je dat de naam van de image ubuntu is en de huidige tag is latest

  • Dit moeten we aanpassen. sudo docker tag ubuntu:latest kezepema/dockerhub:test

-

docker push <je accountnaam>/<jouw containernaam>:<de naam waarmee je de container start>

Voorbeeld:

psa
Figure 11. lijst met gemaakte containers

Kijk naar de eerste container bovenin de lijst.

De image naam is easyhack. De tag naam is latest. In dit geval is er geen tagname ingegeven. Automatisch wordt dan 'latest' toegevoegd. Mijn gebruikersnaam is kezepema.

In dit geval zou het dus zo worden:

docker push kezepema/easyhack:latest