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 image forken van de docker hub

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

  • De student kan een eenvoudige docker image bouwen met yaml

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 virtuele machine maken van minimaal 40 Gb en 2048 Mb RAM.

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

Les 2 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>

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.

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><body>Hoi mijn naam is:<h1> Voornaam Achternaam</h1></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 gebruik je het volgende commando:

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

Voorbeeld:

psa
Figure 7. 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