Dockeri alused
Loogika
Docker aitab panna rakenduse koos käivituskeskkonnaga ühte korratavasse pakki.
Kõige tähtsam mõttejärjekord on:
- vali või ehita
image - käivita sellest
konteiner - jaga vajadusel port või kaust hostmasinaga
- vaata logisid ja käivita käske konteineri sees
- kui teenuseid on mitu, kirjelda need
compose.yamlfailis
Git ja venv ei kao Dockeri tõttu ära. Tavaliselt elab lähtekood hostmasina Git-repos, Docker annab sellele koodile ühtse jooksutuskeskkonna.
Kiire orientiir
| Mõiste või käsk | Milleks | Mida tavaliselt näed |
|---|---|---|
image | käivitusmall | nimi ja tag, näiteks python:3.13-slim |
konteiner | image'ist käivitatud protsess | töötav või peatunud eksemplar |
Dockerfile | image'i ehitamise retsept | FROM, WORKDIR, COPY, RUN, CMD |
docker build | ehita image | buildi kihid ja image'i nimi |
docker run | käivita konteiner | programmi väljund või konteineri ID |
docker ps | vaata töötavaid konteinereid | konteinerite tabel |
docker logs | loe konteineri väljundit | programmi logiread |
docker exec | käivita käsk töötavas konteineris | käsu väljund konteineri seest |
docker compose | käivita seotud teenused | teenuste logid ja seis |
Tüüpilised algaja vead
- aetakse segi
imageja konteiner - arvatakse, et konteineri sees käsitsi muudetud failid jäävad alati alles
- kasutatakse
docker execkonteineri käivitamiseks, kuigi see töötab ainult juba jooksvas konteineris - eeldatakse, et
depends_ontähendab andmebaasi täielikku valmisolekut - pannakse konteinerisse
venvainult harjumusest, kuigi konteiner ise juba isoleerib keskkonda - kustutatakse
docker compose down -vkäsuga kogemata andmebaasi volume
Kas Docker töötab
Enne esimese näite tegemist kontrolli, kas Docker on masinas olemas ja teenus töötab.
docker --version
docker compose version
docker run --rm hello-world
hello-world on väike test-image. Esimesel käivitamisel võib Docker selle internetist alla laadida.
macOS-is ja Windowsis tähendab Docker tavaliselt Docker Desktopi või muud taustal töötavat virtuaalmasina kihti. Kui käsk ütleb, et Docker daemon ei tööta, ava Docker Desktop ja proovi uuesti.
Image ja konteiner
image on valmis käivitusmall. konteiner on sellest mallist käivitatud konkreetne eksemplar.
Ühest image'ist võib korraga töötada mitu konteinerit:
docker run --rm alpine echo tere
docker run --rm alpine uname -a
Siin:
alpineon imageecho terevõiuname -aon käsk, mis käivitatakse konteineri sees--rmkustutab konteineri pärast lõpetamist
Oluline algaja kaitsepiire: konteiner on vahetatav. Kui tahad andmeid säilitada, hoia need hostmasina kaustas, named volume'is või Git-repos.
venv vs Docker
venv ja Docker lahendavad eri probleemi.
| Olukord | Tavaliselt sobib |
|---|---|
| ainult Pythoni paketid peavad olema eraldi | venv |
| vaja on kindlat Linuxi keskkonda või süsteemipakette | Docker |
| projekt vajab andmebaasi, vahemälu või mitut teenust | Docker Compose |
| tahad kiiresti väikest lokaalset skripti teha | venv |
| tiimil peab sama rakendus eri masinates sarnaselt käivituma | Docker |
Dockeri sees ei ole eraldi venv enamasti vajalik. Kui üks konteiner jooksutab üht rakendust, on konteiner ise eralduskiht.
Esimene väike Dockerfile
Kõige selgem esimene näide on väike programm, mille image ise käivitab.
mkdir -p ~/tmp/docker-naide
cd ~/tmp/docker-naide
app.py
print("Tere konteinerist")
Dockerfile
FROM python:3.13-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
Siin:
FROM python:3.13-slimvalib Pythoni baaskeskkonnaWORKDIR /appmäärab töökausta konteineri seesCOPY app.py .kopeerib faili image'isseCMD ["python", "app.py"]ütleb vaikimisi käivitatava käsu
Ehita ja käivita:
docker build -t tere-rakendus .
docker run --rm tere-rakendus
Tulemus peaks olema:
Tere konteinerist
Punkt . käsu lõpus tähendab build context'i: kausta, mille sisu Docker buildi ajal näeb.
.dockerignore
Build context ei peaks sisaldama kõike, mis projektikaustas on.
Tüüpiline .dockerignore:
.git
.venv
__pycache__/
dist/
*.log
See teeb buildi kiiremaks ja vähendab riski, et image'isse satub juhuslikke kohalikke faile.
docker run: käsk, port ja nimi
docker run loob uue konteineri ja käivitab selle.
docker run --rm python:3.13-slim python --version
Kui konteineri sees jookseb server, tuleb port hostmasinasse siduda.
docker run --rm -d --name pyweb -p 8000:8000 python:3.13-slim python -m http.server 8000
Siin:
-dpaneb konteineri taustale--name pywebannab konteinerile nime-p 8000:8000seob hosti pordi8000konteineri pordiga8000
Kontroll:
docker ps
docker logs pyweb
docker stop pyweb
Brauseris peaks teenus olema aadressil:
http://localhost:8000
Kui port on juba kasutusel, vali vasakul pool teine hosti port, näiteks -p 8080:8000.
logs ja exec
Kui konteiner on juba käimas, alusta veaotsingut logidest.
docker logs pyweb
docker logs -f pyweb
-f jälgib logi jooksvalt.
Käsk konteineri sees:
docker exec pyweb pwd
docker exec -it pyweb sh
docker exec ei loo uut konteinerit. See käivitab käsu olemasolevas töötavas konteineris.
Praktiline märkus: paljudes väikestes image'ites ei ole bash paigaldatud. sh töötab sagedamini.
Bind mount: hosti kaust konteinerisse
Builditud image sobib valmis rakenduse proovimiseks. Arenduses tahad sageli, et konteiner näeks sinu praegust projektikausta kohe.
docker run --rm -it --mount type=bind,src="$PWD",dst=/app -w /app python:3.13-slim sh
Sama lühem, vanem ja väga levinud kuju on:
docker run --rm -it -v "$PWD":/app -w /app python:3.13-slim sh
Siin:
src="$PWD"või"$PWD"on sinu praegune kaust hostmasinasdst=/appvõi/appon sama kaust konteineri sees-w /appteeb sellest töökausta
Konteineri sees saad näiteks käivitada:
python app.py
python -m pip install -r requirements.txt
pytest
Bind mount'i puhul muutub hosti fail päriselt. See on arenduses mugav, aga tähendab ka, et konteineris tehtud muudatus võib muuta sinu töökausta.
Named volume
Bind mount seob konteineri konkreetse hosti kaustaga. Named volume on Dockeri hallatav püsiv andmeala.
Kõige tavalisem kasutus on andmebaasi andmed:
volumes:
pgdata:
Compose'i teenuses:
services:
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
Pea meeles:
docker compose downpeatab ja eemaldab teenuste konteinerid ning võrgudocker compose down -veemaldab ka named volume'id- andmebaasi volume'i kustutamine tähendab sageli andmete kustutamist
Arenduse tööjaotus
Hea algaja tööjaotus on:
| Kus | Mida tee |
|---|---|
| hostmasinas | muuda faile, tee Git commit'e, hoia dokumentatsiooni |
| konteineris | käivita rakendus, installi sõltuvusi, testi, silu keskkonda |
| volume'is | hoia andmeid, mis peavad konteineri vahetamisel alles jääma |
Väldi olulise koodi kirjutamist ainult konteineri sisemisse failisüsteemi. Kui konteiner kustub, võib see töö kaduda.
Kui rakendus vajab pakette
Pythoni projektis on sõltuvused sageli failis requirements.txt.
requirements.txt
requests==2.32.3
Dockerfile
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]
Siin on oluline järjekord:
- sõltuvuste fail kopeeritakse enne rakenduse koodi
RUN pip install ...jääb võimalusel build cache'iCOPY app.py .tuleb hiljem, sest rakenduse kood muutub sagedamini
docker compose: mitu teenust korraga
Kui projekt vajab rakendust ja andmebaasi, muutub üks pikk docker run käsk ebamugavaks. Siis kirjelda teenused failis compose.yaml.
services:
app:
image: python:3.13-slim
working_dir: /app
volumes:
- .:/app
command: python -m http.server 8000
ports:
- "8000:8000"
db:
image: postgres:16
environment:
POSTGRES_DB: opik
POSTGRES_USER: opik
POSTGRES_PASSWORD: opikpass
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Tüüpilised käsud:
docker compose up
docker compose up -d
docker compose logs -f app
docker compose exec app sh
docker compose down
Tähendused:
upkäivitab teenused ja näitab logisidup -dkäivitab teenused taustallogs -f appjälgib ühe teenuse logiexec app shavab käsu töötavas teenusekonteinerisdownpeatab ja eemaldab selle compose-projekti konteinerid ning võrgu
Uues Dockeris kasutatakse kuju docker compose. Vanemates juhendites võid näha kuju docker-compose.
depends_on ei ole valmisolekukontroll
Compose'is näed sageli:
depends_on:
- db
See aitab käivitusjärjekorraga, kuid ei tähenda automaatselt, et andmebaas on juba ühendusteks valmis.
Päris projektis võib vaja minna:
- rakenduse enda retry-loogikat
- andmebaasi healthcheck'i
- käivitusskripti, mis ootab teenuse valmidust
Algaja jaoks piisab esialgu teadmisest: kui app ütleb käivitumisel, et andmebaas pole valmis, vaata esmalt docker compose logs db ja proovi pärast hetke uuesti.
Millal valida run, build või compose
| Vajadus | Sobiv tööriist |
|---|---|
| proovi üht käsku puhtas image'is | docker run --rm image käsk |
| kontrolli valmis rakenduse image'it | docker build ja docker run |
| arenda koodi konteineri sees, kuid failid jäävad hosti | bind mount |
| käivita rakendus koos andmebaasi või muu teenusega | docker compose |
| IDE avab kogu tööruumi konteineris | arenduskonteiner ehk devcontainer |
See valik vähendab segadust: ära tee compose'i ainult selleks, et käivitada üht lühikest käsku, ja ära kirjuta üht hiiglaslikku docker run käsku, kui projektis on mitu teenust.
Ohutus ja privaatsus
Konteiner ei ole maagiline turvasein.
Ole ettevaatlik, kui:
- image on tundmatust allikast
- annad konteinerile hosti kaustu bind mount'iga
- paned keskkonnamuutujatesse paroole või võtmeid
- näed juhendit, mis mount'ib Docker socket'i, näiteks
/var/run/docker.sock - käsk kasutab
--privileged
Algaja hea reegel: ära käivita võõrast image'it koos oma kodukataloogi või salajaste failide mount'iga.
Kettaruumi kontroll ja koristamine
Docker võib aja jooksul koguda image'eid, peatunud konteinereid ja build cache'i.
Ohutu vaatamine:
docker system df
docker ps -a
docker images
Koristuskäske kasuta alles siis, kui saad aru, mida need kustutavad:
docker container prune
docker image prune
Need ei ole esimesed õppimiskäsud. Need on hilisemaks, kui Docker on juba igapäevases kasutuses.
Seos arenduskonteineritega
Arenduskonteiner ehk devcontainer on Dockeri peale ehitatud IDE-töövoog.
Tavaliselt toimub nii:
- Docker käivitab konteineri
- IDE ühendub konteineri sisse
- projektikaust mount'itakse tööruumina
- terminal, testid ja keele tööriistad jooksevad konteineris
Arenduskonteiner ei asenda Dockeri põhimõtteid. Ta teeb sama loogika mugavamaks, eriti siis, kui projekt vajab keerulisemat keskkonda.
Praktiline õppimisjärjekord
Õpi Dockerit selles järjekorras:
docker run --rm alpine echo tere- image ja konteineri vahe
- väike
Dockerfile docker build -t nimi .- port, logid ja
exec - bind mount arenduseks
docker composemitme teenuse jaoks- volume'id ja andmete püsivus
Nii on igal sammul selge, kas sa käivitad valmispilti, ehitad uut image'it, jagad faile või juhid teenuste komplekti.
Minitest
- Mis vahe on image'il ja konteineril?
- Miks on
--rmkasulik lühikeste katsete puhul? - Mida teeb
-p 8000:8000? - Mis vahe on bind mount'il ja named volume'il?
- Millal valid
docker composetavalisedocker runasemel? - Miks ei tasu
docker compose down -vkäsu tähendust arvamata käivitada?
Lisalugemine
Selle teema usaldusväärsemad viited leiad lisast Lisa E: usaldusväärsed viited ja lisalugemine.
Peatüki täisspikker
Edasijõudnu
Eesmärk
image on käivitusmall; konteiner on sellest tehtud töötav eksemplar; andmed püsivad ainult hostis, volume'is või Git-repos.
Põhikäsud
docker --versionkontrolli olemasoludocker run --rm alpine echo tereohutu esimene käivitusdocker build -t rakendus .ehita imagedocker run --rm rakenduskäivita imagedocker pstöötavad konteineriddocker logs -f nimijälgi logidocker exec -it nimi shsisene töötavasse konteinerissedocker compose up -dteenused taustaledocker compose downpeata komplekt
Olulisemad lipud, märgid ja kiirnupud
imagekäivitusmallkonteinertöötav eksemplarDockerfileimage'i retseptcompose.yamlmitu teenustvolumepüsiv andmesisuregistryimage'ite hoidla--rmkustuta lühikatse konteiner pärast lõppu-p 8000:8000seo hosti port konteineri pordiga--mount type=bind,src="$PWD",dst=/appjaga praegune kaust konteinerisse-w /appmäära konteineri töökaustdown -vpeatab ja kustutab ka volume'id