Arvutiteaduse instituut
  1. Kursused
  2. 2023/24 kevad
  3. Veebiteenuste ja hajussüsteemide arendus (LTAT.06.018)
EN
Logi sisse

Veebiteenuste ja hajussüsteemide arendus 2023/24 kevad

  • Pealeht
  • Loengud
  • Praktikumid
  • Lahenduste Esitamine

Seitsmes praktikum - Rakenduste konteineriseerimine

Selles praktikumis õpime kuidas kasutada Dockerit, et luua konteineried. Uurime, millised konteinerite halduse võimalusi Docker pakub ning kasutame neid teadmisi, et konteineriseerida oma varasem Flask REST API rakendus. Seejärel laeme üles loodud konteineri uue Dockeri pildina (Image) DockerHub registrisse.

Viited

  1. Docker'i ülevaade - https://docs.docker.com/get-started/overview/
  2. Docker käsurea käskude ülevaade - https://docs.docker.com/engine/reference/commandline/cli/
  3. Dockerfaili spetsifikatsioon - https://docs.docker.com/engine/reference/builder/

Probleemide korral kontrollige:

  1. Võimalikud probleemid ja nende potentsiaalsed lahendused osa praktikumi juhendi lõpus.
  2. Küsige otse #praktikum-7-docker Zulip teemas.
    • Ka siis kui soovite lihtsalt viheid.

Ülesanne 7.1: Dockeri seadistamine

Selles ülesandes seadistame Dockeri keskkonna oma arvutis. Seda saab teha nii Linuksis, Windowsis kui ka MacOS arvutis, aga olenevalt OS versioonist võib Dockeri üles seadmine olla probleemidevaba või suhteliselt keeruline. Küsige abi õppejõu käest, kui probleeme tekib. Vajadusel saab kasutada ka Azure virtuaalmasinaid.

  1. DockerHub Konto loomine.
    • Logige sisse DockerHub keskkonda või looge uus konto: https://hub.docker.com/signup
  2. Docker'i installeerimine.
    • Linuksis (Ubuntu/Debian):
      • Jälgige Docker'i installeerimise ametlikku õpetust: https://docs.docker.com/engine/install/ubuntu/
      • Lisage oma linuksi tava kasutaja docker gruppi, et ei oleks vaja sudo käsku kasutada dockeri konteinerite loomisel:
      • sudo usermod -aG docker $USER (Peale seda peaks käsurea programmi uuesti käivitame, et see muudatus arvesse läheks)
    • Windowsis
      • Jälgige ametlikku Windows Docker Desktop installeerimise õpetust: https://docs.docker.com/desktop/windows/install/
      • Kui teilt küsitakse kumba virtualiseerimise lahendust kasutada, siis:
        • Windows 10: Kasutage WSL 2 backend
          • Võib vaja minna Windows uuenduste installeerimist lisatarkvarale. Windows Updates -> Advanced Options -> Receive updates for OTHER Microsoft products when you update Windows.
        • Varasemad Windows OS'ga arvutid: Kasutage Hyper-V backend and Windows containers
  3. Testime, et Docker töötab.
    • Avage UUS käsurida (Linux terminal või Windows cmd)
      • Käivitage käsk: docker ps -a olemasolevate konteinerite nimekirja näitamiseks.

NB! Kui tekivad probleemid, küsige abi õppejõult. Vajadusel saab Dockeri jaoks kasutada ka Azure Virtuaalmasinat või saab õppejõud teile keskkonna ette valmistada Ülikooli pilves!

Docker kasutab algseadistusena IP aadresse, mis algavad: 172.17. Sarnaseid aadresse kasutatakse ka Ülikooli võrgus, mis tekitab tihti probleeme. Dockeri võrgukonfiguratsiooni muutmine, et vältida konflikte ülikooli HPC või VPN võrkudega. Dockeri võrguseadete muutmiseks on vaja täiendavaid muudatusi:

  1. Linuxis
    • Kontrollige, et kaust eksisteerib: /etc/docker
    • Looge Dockeri kaustas daemon.json fail: sudo nano /etc/docker/daemon.json järgmise sisuga:
      {
        "default-address-pools": [{ "base":"172.80.0.0/16","size":24 }]
      }
    • Tehke Docker teenusele restart sudo service docker restart
  2. Windowsis:
    • Avage Docker Desktop Settings -> Docker Engine vaade, ja lisage sinna JSON konfiguratsiooni SISSE, uus plokk:
        "default-address-pools": [
          {
            "base": "172.80.0.0/16",
            "size": 24
          }
        ]
    • Vaadake, et eelmine JSON alam-plokk lõppeb ilusti komaga.
    • Savestage ning tehke Docker teenusele restart kui seda pakutakse.

Ülesanne 7.2: Dockeri käskude harjutamine

Selles ülesandes vaatame üle ning harjutame läbi tüüpilised ning kõige kasulikumad Docker käsud.

  • Logige sisse oma dockeri kontole dockeri terminalist: docker login
    • Kasutajanimi: teie DockerHub ID
    • Parool: DockerHub parool
    • Seda läheb vaja kuna anonüümsetel kontodel on mitmed DockerHub limiidid, ning võib juhtuda, et praktikumi lõpuks võidakse hakata teie ligipääsu piirama.
  • Docker Image alla laadimine DockerHub registrist:
    • docker pull ubuntu
  • Docker konteineri loomine:
    • docker run -di -p 80:80 --name praks7ubuntu ubuntu
    • Valik -di sunnib konteinerit tööle jääma.
    • Kui me paneme paiga konteineri nime ( --name praks7ubuntu) siis saame seda nime kasutada konteineri ID asemel.
    • Samuti ei õnnestu meil sama nimega konteinerit luua, kui selle nimega konteiner juba eksisteerib.
  • Konteineri sees käsu käivitamine
    • Me saame konteineri sees käsurea käske käivitada docker exec käsu kaudu.
    • Näiteks failide vaatamiseks saame ls -al käsu konteineri sees käivitada nii:
      • docker exec praks7ubuntu ls -al
  • Konteineri info vaatamine
    • Me saame konteineri konfiguratsiooni uurida docker inspect kaudu.
      • Näiteks kogu konfiguratiooni vaatamiseks: docker inspect praks7ubuntu
      • Näiteks konkreetse väärtuse (bridge võrgu IP aadressi) vaatamine: docker inspect --format='{{.NetworkSettings.Networks.bridge.IPAddress}}' praks7ubuntu
  • Konteineri sisse faili liigutamine
    • Loome uue lokaalse faili test.txt
    • Kirjutage sellesse faili omal valikul mingi tekst.
    • Liigutame selle faili konteineri sisse kausta /tmp/text.txt
      • docker cp test.txt praks7ubuntu:/tmp/text.txt
  • Konteineri Volume mountimine
    • Selle asemel, et fail liigutada konteinerisse, saame ka selle paigaldada (mount) kontainerisse, mingisse asukohta konteineri loomise ajal. Aga selleks peame alguses konteineri seisma panema ning uuesti looma
    • Konteineri seisma panemine
      • docker stop praks7ubuntu
    • Konteineri kustutamine
      • docker rm praks7ubuntu
    • Konteineri uuesti loomine koos kausta/faili mountimisega:
      • on võimalik kasutada kahte viisi, kas -v või --mount abil. Siin näites, meie kasutame --mount võimalust:
      • docker run -di --mount type=bind,source=C:\Users\jakovits\test.txt,target=/tmp/text2.txt --name praks7ubuntu ubuntu
        • --mount type=bind,source=C:\Users\jakovits\test.txt,target=/tmp/text2.txt määrab, et:
          • Välise masina fail C:\Users\jakovits\test.txt paigaldataks konteinerisse asukohta /tmp/text2.txt
          • NB! asendage faili tee korrektse asukohaga teie masinas. Linuksi ja MacOS puhul kasutage samuti täisteed failini.
    • Muutke faili sisu väljaspoolt dockeri konteinerit
    • Kontrollime kas faili susu muutus konteineri sees:
      • docker exec -it praks7ubuntu cat /tmp/text2.txt

Esitamiseks: Tehke sellest olukorrast ekraanipilt, kus on näha tehtud muudatus ning see, et docker konteineri sees on selle muudatuse tulemus näda:

Kui me aga soovime, et mingi fail, või konteineri sisene muudatus oleks püsiv, tuleks meil uus konteiner luua. Seda saab teha nii, et modifitseerime või loome uue Dockerfaili. Aga saab ka teha nii, et salvestame konteineri praeguse seisu uue Pildina. Proovime seda viimast võimalust:

  • Konteineri käsitsi modifitseerimine ja uue pildina salvestamine
    • Avame konteineri sees kasurea. Siis ei pea iga käsu jaoks docker exec käsku kasutama
      • docker exec -it praks7ubuntu /bin/bash
        • Selle tulemusena pannakse konteineri sees tööle /bin/bash käsurida interaktiivselt.
      • NB! Teiste Linux versioonide põhistes konterinerites ei pruugi /bin/bash olla installeeritud. Sellisel juhul saab kasutada /bin/sh selle asemel
    • Installeerime uue tarkvara: nano failide modifitseerimiseks
      • apt update
      • apt install nano
    • Loome /tmp/test3.txt faili:
      • nano /tmp/test3.txt
    • Väljume Dockeri sisemisest interaktiivsest käsureast:
      • exit
    • Salvestame muudetud konteineri uue Docker Image'na.
      • Asendage järgmises käsus "Pelle" oma nimega.
      • docker commit -m "added nano and /tmp/test3.txt file" -a "Pelle" praks7ubuntu "ubuntukoosnanoga"
    • Vaadake Docker piltide nimekirja:
      • docker images
    • Paneme uuesti konteineri seisma:
      • docker stop praks7ubuntu

Ülesanne 7.3: Flask rakenduse konteineriseerimine

Selles ülesandes võtame ette oma Neljanda praktikumi Flask rakenduse ning konteineriseerimise selle nii, et seda on võimalik käivitada Docker konteinerina.

Kasuks võiks tulla Dockerfile spetsifikatsioon: https://docs.docker.com/engine/reference/builder/

  • Loome uue kausta praktikum7
  • Kausta sees loome faili Dockerfile

Dockerfile sisu defineerimine:

  • Loome uue teksti faili mille nimi on Dockerfile (ei tohiks lõppeda .txt laiendiga)
  • Defineerime Dockerfile sees, et alus Docker pildina kasutataks python:3-alpine dockerHub pilti.
    • Lisage Dockerfaili sisse rida: FROM python:3-alpine
    • Pildi nimi Python
      • Määrab, et kasutame Python Docker pilti: https://hub.docker.com/_/python
    • Pildi silt/versioon: 3-alpine
      • Määrab, et kasutame alpine tüüpi linuksi keskkonda, ning python 3 versiooni.
      • Leiate sellele vastava sildi info ja Dockerfail'i DockerHub'ist: https://hub.docker.com/layers/python/library/python/3-alpine/images/sha256-6fb270e2f36634073f8ded1a10db8c12ce5d10bc28756c47ac41eaa2920b09a1?context=explore
  • Loome uue kausta, kuhu liigutame meie rakenduse ning mis on selle töökaustaks
    • RUN mkdir -p /usr/src/app
  • Seadistame loodud kausta konteineri aktiivseks töökaustaks:
    • WORKDIR /usr/src/app
    • Iseseisev muudatus: Lisage Dockerfile käsk, mis loob uue raamatud kausta konteineri töökausta sisse.
      • Teie rakendus salvestab sinna raamatute failid.
      • Vaadake, et teie Flask rakendus kautaks relatiivset teed selle kaustani ./raamatud või raamatud.
      • Kui teie rakendus vajab kausta jaoks teist asukohta, saate muuta selle kus kaust luuakse, või modifitseerida rakendust, et kasutaks relatiivset teed.
  • Liigutame requirements.txt faili meie arvutist töökausta sama nimega:
    • COPY requirements.txt requirements.txt
  • Instaleerime kõik Python teegid, mis on kirja pandud requirements.txt failis
    • RUN pip3 install --no-cache-dir -r requirements.txt
  • Kopeerime rakenduse Python faili töökausta.
    • COPY rest_example.py app.py
      • Kopeeritud faili nimi PEAB olema app.py
      • NB! Modifitseerige seda käsku, kui teie Python faili nimi on erinev, või kui teil on vaja liigutade mitut faili.
  • Defineerimie, mis porti peaks lahti tegema (see käsk otseselt seda porti lahti EI TEE)
    • EXPOSE 5000
  • Defineerimine, mis on see käsk, mis alustab konteineri sisese peamise protsessi:
    • CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
    • See kärk paneb tööle Flask serveri
      • Varem kopeeritud faili nimi PEAB olema app.py, et see käsk töötaks
  • Loome requirements.txt faili, kus paneme kirja kõik vajalikud Python teegid, mis on vaja meie rakenduse jaoks installeerida.
    • Paneme sinna kirja vajalike teekide nimed ning ka nende versiooni numbrid:
      • flask==3.0.2
      • requests==2.31.0
      • Versiooninumbrid on kasulikud kirja panna, kuna muidu ei pruugi meie rakendus enam edukalt töötada tulevikus, kui teekide uued versioonid uuresti muutuvad.
  • Ehitame konteineri pildi (Nimega praktikum7flask)
    • Hoolitsege, et olete käsureal kaustas praktikum7
    • docker build -t praktikum7flask .
  • Testime, et konteiner töötab. Loome uue konteineri pildist praktikum7flask
    • docker run -d -p 5000:5000 --name praks7konteiner praktikum7flask
      • -d tulemusena jääb kontainer taustal tööle.
      • Konteineri nime praks7konteiner kaudu on lihtsam konteineri haldamise käske kasutada. Ei pea otsima konteineri genereeritud ID väärtust.
      • -p 5000:5000 tulemusena avatakse port 5000, ning välise masina selle pordi kaudu on konteineri sees jooksev veebirakendus kätte saadav.
  • Kontrollige, et Flask rakendus töötab korrektselt: http://localhost:5000/raamatud
    • Tehke POST päring raamatu alla laadimiseks Gutenberg repositooriumist.
  • Dockeri konteineri logi saate vaadata nii:
    • docker logs praks7konteiner
  • Kui vaja dockeri pilti ümber ehitada, ning uuesti testida, siis võib olla vajadus vana konteiner seisma panna ning kustutada:
    • docker stop praks7konteiner
    • docker rm praks7konteiner

Ülesanne 7.4: Docker Image laadimine DockerHub'i

Selles ülesandes laeme üles enda loodud docker konteineri uue pildina DockerHub registreisse.

  • Hoolitsege selle eest, et te oleksite oma DockerHUb kontoga käsureal sisse logitud.
    • docker login
  • Loome uue sildi meie konteinerile:
    • docker tag praktikum7flask teie-dockerhub-id/praktikum7flask:task7.4
    • Sildiks paneme task7.4
    • Docker pildi/image nimi on praktikum7flask, jätame selle ka DockerHUb pildi nimeks.
  • Laeme üles sildistatud Docker Pildi DockerHub'i:
    • docker push teie-dockerhub-id/praktikum7flask:task7.4

Ülesanne 7.5: Loodud Docker Image testimine

Selles ülesandes seame üles kaks koopiat oma loodud DockerHub konteineri piltidest (Image).

  • Pange tööle kaks konteinerit Docker Images/Pildist teie-dockerhub-id/praktikum7flask:task7.4
    • Mõlemal peaks olema erinev port avatud. Näiteks 5000, 5001
  • Jagage mõlema konteineri vahel sama välisspoolne (Host masina) kaust, mis on ühendatud (mounted) sellesse konteineri sisemisse kausta, kus rakendus hoiab raamatuid.
  • Testige, et rakendusi saab koos kasutada nii, et ühe rakenduse kaudu loodud raamatu failid on nähtavad teisest rakendusest.
    • Pärisrakenduste puhul on parem vältida sellist Host masina kaustade kasutamist andmete jagamiseks, kuna mitmeserveriliste keskkondade puhul on raskem garanteerida, et konteinerid näevad alati sama HOST serveri kausta. Näiteks kui käivitatakse mitu konteinerit erinevates serverites või konteinereid liigutatakse.

Tehke ekraanipildid, mis näitavad, et see testimine õnnestus.

  • Peaks olema näha, et ühe rakenduse kaudu loodud raamatud on kätte saadavad teises.

Lahenduse esitamine

Praktikumi lahendusena tuleb esitada:

  1. DockerHub link teie loodud Docker pildile.
  2. Dockerfile, requirements.txt, Python failid.
  3. Ekraanipildid ülesannetest 7.2 ja 7.5.
Lahenduste esitamiseks peate olema sisse loginud ja kursusele registreerunud.

Võimalikud probleemid ja nende potentiaalsed lahendused.

  • Kontrollige, et teil on sisse lülitatud "Receive updates for other Microsoft products when you update Windows" Windows Update seadete lisavalikutes, et WSL2 kerneli uuendused automaatselt installeeritaks.
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused