Kasuta paremal olevat sisukorda kiireks navigeerimiseks ↗️
Eelmisel nädalal õppisime Ansible role'e, kuidas automatiseerida serverite konfiguratsiooni. Täna astume järgmisesse dimensiooni - konteinerite maailma. Kui Ansible aitab hallata olemasolevaid servereid, siis Docker muudab selle, kuidas me rakendusi üldse ehitame ja jooksutame.
Mõtle konteineritele kui LEGO klotside süsteemile - iga konteiner on üks klots, mis saab kiiresti kokku panna suuremateks rakendusteks. Aga erinevalt LEGO-st, need "klotsid" sisaldavad terveid rakendusi ja jooksevad igal arvutil täpselt ühesuguselt.
Docker on tööriist konteinerite loomiseks ja haldamiseks. Aga mis need konteinerid siis on ja miks nad paremad on kui traditsioonilised lahendused?
Põhiline probleem, mida Docker lahendab, on kuulus "töötab mu masinas" sündroom. Sa ehitad rakenduse oma laptopil, see töötab suurepäraselt. Liigutad serverisse - ei tööta. Kolleeg üritab käivitada oma masinas - ei tööta. Probleem pole sinus ega sinu koodis, vaid selles, et erinevates keskkondades on erinevad versioonid, sõltuvused ja konfiguratsioonid.
Docker võimaldab sul pakkida rakenduse koos kõigi sõltuvustega ühte "kasti" ehk konteinerisse, mis töötab igal arvutil täpselt ühesuguselt. See konteiner sisaldab kõike vajalikku: operatsioonisüsteemi osi, runtime'i, teeke, sõltuvusi ja sinu rakendust ennast.
Enne kui edasi liikume, pead mõistma nelja põhilist mõistet:
Image on mall konteineri jaoks, nagu CD-ROM või programmi installer. See sisaldab kõike vajalikku: operatsioonisüsteemi osi, rakendust ja kõiki sõltuvusi. Image on muutumatu - kui sa teed sinna muudatusi, loodi tegelikult uus image.
Container on käivitatud image, nagu programm, mis jookseb su arvutis. Container elab ja töötab, teda saab peatada, taaskäivitada või kustutada. Iga kord kui käivitad sama image'i, saad uue konteineri.
Dockerfile on tekstifail, mis sisaldab retsepti image'i loomiseks. See kirjeldab samm-sammult, kuidas image ehitada: millist base image'i kasutada, millised failid kopeerida, millised käsud käivitada.
Registry on pood image'ite jaoks, nagu App Store nutitelefonile. Kõige populaarsem on Docker Hub, kus leidub tuhandeid valmis image'e kõikvõimalike rakenduste jaoks.
Füüsiliste serverite ajastul (kuni 2000. aastate algus) tähendas üks rakendus üht serverit. See oli kallis ja ebaefektiivne - enamik servereid kasutasid ainult 5-15% oma võimsusest, aga maksma pidid täishinnaga.
Virtuaalmasinad (2000-2010) lahendasid osa probleemist. Üks võimas server sai majutada mitu virtuaalmasinat, igaüks oma operatsioonisüsteemiga. Aga iga virtuaalmasin vajab täispikka operatsioonisüsteemi, mis tähendab 1-2GB mälukasutust ja 20GB kettaruumi isegi lihtsa rakenduse jaoks.
Konteinerid (alates 2013) viisid efektiivsuse järgmisele tasemele. Erinevalt virtuaalmasinadest jagavad kõik konteinerid sama operatsioonisüsteemi kerneli. See tähendab, et üks konteiner kasutab ainult 10-100MB mälu ja käivitub sekundite jooksul.
Virtuaalmasin on nagu terve eraldi korter - seal on oma köök, vannituba, elekter, kõik. Iga korter on täiesti eraldatud, aga ka ressursimahukas.
Konteiner on nagu tuba jagatud korteris - sa jagad kööki ja vannituba (operatsioonisüsteemi kerneli), aga sinu tuba (rakendus) on täiesti privaatne. See on palju efektiivsem.
Virtuaalmasinad on endiselt õiged valik, kui vajad erinevaid operatsioonisüsteeme samal serveril, maksimaalset turvalist eraldatust või töötad legacy süsteemidega, mis pole konteineri jaoks sobivad.
Konteinerid on ideaalsed kaasaegsete veebirakenduste, mikroteenuste arhitektuuri, arendus- ja testimiskeskkondade ning kiire deployment'i jaoks.
Docker'i installimine Ubuntu või Debian süsteemis käib mitmeastmeliselt, sest tahame kasutada ametlikku Docker'i repositooriumit, mitte distributsiooniga kaasas olevat aegunud versiooni.
Kõigepealt uuenda pakettide nimistut ja installi vajalikud eeldused:
sudoaptupdate
sudoaptinstall-yapt-transport-httpsca-certificatescurlgnupglsb-release
```bash
LisaDocker'i ametlik GPG võti ja repositoorium:```bashcurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgecho "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null```bashNüüd saad installida Docker'i:
```bash
sudoaptupdate
sudoaptinstall-ydocker-cedocker-ce-clicontainerd.io
```bash
KäivitaDocker'i teenus ja seadista see automaatselt käivituma:```bashsudo systemctl start dockersudo systemctl enable docker```bashViimane samm on lisada oma kasutaja docker gruppi, et sa ei peaks pidevalt sudo kasutama:```bashsudo usermod -aG docker $USER```bashPärast seda pead välja logima ja tagasi sisse logima, või käivitama `newgrp docker` käsu.Testi installatsiooni:```bashdocker --versiondocker run hello-world```bashViimane käsk laadib väikese testi image'ijakäivitabselle.Kuinäedtervitussõnumit,onDockeredukaltinstallitud.
## Docker'i käsurea põhialusedDocker'i käsurea süntaks järgib lihtsat mustrit: `docker [VALIKUD] KÄSK [ARGUMENDID]`. Kõik Docker'ifunktsioonidonkättesaadavadalamkäskudekaudu.
### Image'ide haldamineImage'ide allalaadimine käib `pull` käsuga:```bashdocker pull nginx # Viimane versioondocker pull nginx:1.21 # Konkreetne versioondocker pull ubuntu:20.04 # Erinevad operatsioonisüsteemid```textLokaalse image'idevaatamisekskasuta:
```bash
dockerimages# Kõik lokaalsed image'iddockersearchmysql# Otsi Docker Hub'ist```text
Kasutamataimage'ide kustutamiseks:```bashdocker rmi nginx # Kustuta konkreetne imagedocker image prune # Kustuta kõik kasutamata image'id
```text
### Konteinerite käivitamineLihtsaimviiskonteinerikäivitamiseks:
```bash
dockerrunnginx
```text
Seekäsklaadibnginximage'i (kui see veel masinas pole), loob sellest konteineri ja käivitab selle. Probleem on see, et käsk blokeerib terminali.Praktilisemad variandid:```bashdocker run -d nginx # Käivita taustaal (detached)docker run --name my-web nginx # Anna konteinerile nimidocker run -p 8080:80 nginx # Ühenda port 8080 konteineri port 80-ga```textInteraktiivse konteineri jaoks, näiteks kui tahad Ubuntu'gakatsetada:
```bash
dockerrun-itubuntubash# Interaktiivne terminal```text
Käivitatudkonteineriskäsujooksutamiseks:
```bash
dockerexec-itcontainer_namebash# Ühenda käivitatud konteinerisse```text
### Konteinerite jälgimine ja haldamineVaata,millisedkonteineridtöötavad:
```bash
dockerps# Töötavad konteineriddockerps-a# Kõik konteinerid (ka peatatud)```text
Konteinerilogidevaatamiseks:
```bash
dockerlogscontainer_name# Näita logedockerlogs-fcontainer_name# Jälgi loge reaalajas```text
Konteinerielutsüklihaldamine:
```bash
dockerstartcontainer_name# Käivita peatatud konteinerdockerstopcontainer_name# Peata konteinerdockerrestartcontainer_name# Taaskäivitadockerrmcontainer_name# Kustuta konteiner```text
### Praktiline näideVaatame,kuidaskäivitadalihtneveebiserver:
```bash
# Käivita Nginx konteinerdockerrun-d--namemy-web-p8080:80nginx
# Testi brauseris või curl'igacurlhttp://localhost:8080
# Vaata konteineri logedockerlogsmy-web
# Peata ja kustutadockerstopmy-web
dockerrmmy-web
```bash
## Dockerfile - rakenda konteineri retseptDockerfileontekstifail,missisaldabjuhiseidDocker'ile, kuidas ehitada image sinu rakenduse jaoks. See on nagu retsept, mis kirjeldab kõik vajalikud sammud.### Põhilised juhised**FROM** määrab base image'i,millelthakataehitama:
```dockerfile
FROMnginx:alpine# Väike ja kiireFROMpython:3.9# Python runtimeFROMnode:16# Node.js runtime```text
Tootmiseskasutaalatikonkreetseidversioone:
```dockerfile
FROMnode:16.14.2-alpine# Täpne versioon, mitte "latest"```text
**WORKDIR**määrabtöökatalogikonteineris:
```dockerfile
WORKDIR/app# Kõik järgnevad käsud tehakse siin```text
**COPY**kopeeribfailehostsüsteemistkonteinerisse:
```dockerfile
COPYapp.py/app/# Üks failCOPYsrc//app/src/# Terve kaustCOPY./app/# Kõik praegusest kaustast```text
**RUN**käivitabkäsuimage'i ehitamise ajal:```dockerfileRUN apt-get update && apt-get install -y curlRUN pip install -r requirements.txt```text**CMD** määrab vaikimisi käsu, mis käivitatakse konteineri käivitamisel:```dockerfileCMD ["python", "app.py"]CMD ["nginx", "-g", "daemon off;"]```bash### Praktiline näide: Python rakendusLoome lihtsa Flask rakenduse ja pakime selle konteinerisse.Loo fail `app.py`:```pythonfrom flask import Flaskapp = Flask(__name__)@app.route('/')def hello(): return '<h1>TereDocker'i maailmast!</h1>'if__name__=='__main__':
app.run(host='0.0.0.0',port=5000)```text
Loofail`requirements.txt`:
Eduka Docker'i kasutamise tootmiskeskkonnas saab kokku võtta mõne olulise põhimõttega:
Kasuta alati ametlikke base image'e, mille turvalisust jälgitakse ja mida uuendatakse regulaarselt. Kopeeri sõltuvuste failid enne rakenduse koodi, et ära kasutada kihtide cache'imise eeliseid. Kasuta mitmestaadilisi ehitusi tootmises, et hoida image väike ja turvaline.
Loo alati mitte-root kasutaja ja määra paketiversioonid kindlalt. Kombineeri RUN käsud üheks ja kasuta .dockerignore faili. Lisa tervisecontrollid, et orkestreerimissüsteemid saaksid konteineri seisundit jälgida.
Kasuta kohandatud võrke mitme konteineri rakenduste jaoks ja nimega volume'e andmete säilitamiseks tootmises.
Selles teooriaülevaates õppisid Docker'i põhitõdesid: mis on konteinerid, kuidas nad erinevad virtuaalmasinadest ja miks nad on kaasaegse tarkvara arendamise põhialus. Samuti õppisid edasijõudnute tehnikaid, mis muudavad image'id kiiremaks, turvalisemaks ja väiksemaks.
Docker'i võrgustiku mõistmine on kriitilise tähtsusega mitme konteineri rakenduste ehitamiseks. Podman pakub huvitavat alternatiivi, eriti kui turvalisus on prioriteet.
Järgmistes praktikumides ja kodutöödes rakendad neid teadmisi ning õpid Docker Compose'i, mis aitab hallata keerukaid mitme konteineri rakendusi.