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
- Docker'i ülevaade - https://docs.docker.com/get-started/overview/
- Docker käsurea käskude ülevaade - https://docs.docker.com/engine/reference/commandline/cli/
- Dockerfaili spetsifikatsioon - https://docs.docker.com/engine/reference/builder/
Probleemide korral kontrollige:
- Võimalikud probleemid ja nende potentsiaalsed lahendused osa praktikumi juhendi lõpus.
- 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.
- DockerHub Konto loomine.
- Logige sisse DockerHub keskkonda või looge uus konto: https://hub.docker.com/signup
- 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.
- Võib vaja minna Windows uuenduste installeerimist lisatarkvarale.
- Varasemad Windows OS'ga arvutid: Kasutage
Hyper-V backend and Windows containers
- Windows 10: Kasutage
- Linuksis (Ubuntu/Debian):
- 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.
- Käivitage käsk:
- Avage UUS käsurida (Linux terminal või Windows cmd)
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:
- 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
- Kontrollige, et kaust eksisteerib:
- 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.
- Avage Docker Desktop
Ü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
- Me saame konteineri sees käsurea käske käivitada
- 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
- Näiteks kogu konfiguratiooni vaatamiseks:
- Me saame konteineri konfiguratsiooni uurida
- 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
- Loome uue lokaalse faili
- 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.
- Välise masina fail
- on võimalik kasutada kahte viisi, kas
- 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 kasutamadocker exec -it praks7ubuntu /bin/bash
- Selle tulemusena pannakse konteineri sees tööle
/bin/bash
käsurida interaktiivselt.
- Selle tulemusena pannakse konteineri sees tööle
- 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 modifitseerimiseksapt 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
- Avame konteineri sees kasurea. Siis ei pea iga käsu jaoks
Ü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
- Lisage Dockerfaili sisse rida:
- 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õiraamatud
. - 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.
- Kopeeritud faili nimi PEAB olema
- 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
- Varem kopeeritud faili nimi PEAB olema
- 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.
- Paneme sinna kirja vajalike teekide nimed ning ka nende versiooni numbrid:
- Ehitame konteineri pildi (Nimega
praktikum7flask
)- Hoolitsege, et olete käsureal kaustas
praktikum7
docker build -t praktikum7flask .
- Hoolitsege, et olete käsureal kaustas
- 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:
- DockerHub link teie loodud Docker pildile.
- Dockerfile, requirements.txt, Python failid.
- Ekraanipildid ülesannetest 7.2 ja 7.5.
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.