Dockeri alused
Loogika
Docker aitab panna rakenduse koos käivituskeskkonnaga ühte korratavasse pakki.
Kõige tähtsam mõttejärjekord on:
- vali või koosta konteinerkuju (
image) - käivita sellest
konteiner - seo vajadusel port või kataloog hostsüsteemiga
- 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 asub lähtekood hostsüsteemi Giti hoidlas ning Docker annab koodile ühtse käivituskeskkonna.
Kiire orientiir
| Mõiste või käsk | Milleks | Mida tavaliselt näed |
|---|---|---|
konteinerkuju (image) | käivitusmall | nimi ja märgend, näiteks python:3.13-slim |
konteiner | konteinerkujust käivitatud protsess | töötav või peatatud eksemplar |
Dockerfile | konteinerkuju koostamise retsept | FROM, WORKDIR, COPY, RUN, CMD |
docker build | koosta konteinerkuju | koostamiskihid ja kuju 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 konteinerkuju (
image) ja konteiner - arvatakse, et konteineri sees käsitsi muudetud failid jäävad alati alles
- kasutatakse
docker execkonteineri käivitamiseks, kuigi see töötab ainult juba töötavas konteineris - eeldatakse, et
depends_ontähendab andmebaasi täielikku valmisolekut - pannakse konteinerisse
venvainult harjumusest, kuigi konteiner ise juba isoleerib keskkonda - kustutatakse käsuga
docker compose down -vkogemata andmebaasi andmeköide
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 katsetamiseks mõeldud konteinerkuju. 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 virtuaalmasinakihti. Kui käsk ütleb, et Dockeri deemon ei tööta, ava Docker Desktop ja proovi uuesti.
Konteinerkuju (image) ja konteiner
Konteinerkuju (image) on valmis käivitusmall. Konteiner on sellest mallist käivitatud konkreetne eksemplar.
Ühest konteinerkujust võib korraga töötada mitu konteinerit:
docker run --rm alpine echo tere
docker run --rm alpine uname -a
Siin:
alpineon konteinerkujuecho 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 hostsüsteemi kataloogis, nimega andmeköites (named volume) või Giti hoidlas.
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 kohalikku skripti teha | venv |
| meeskonnal peab sama rakendus eri masinates sarnaselt käivituma | Docker |
Dockeri sees ei ole eraldi venv enamasti vajalik. Kui üks konteiner käitab üht rakendust, on konteiner ise eralduskiht.
Esimene väike Dockerfile
Kõige selgem esimene näide on väike programm, mille konteinerkuju 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öökataloogi konteineri seesCOPY app.py .kopeerib faili konteinerkujusseCMD ["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ähistab koostamiskonteksti (build context): kataloogi, mille sisu Docker koostamise ajal näeb.
.dockerignore
Koostamiskontekst ei peaks sisaldama kõike, mis projektikataloogis on.
Tüüpiline .dockerignore:
.git
.venv
.env
.env.*
__pycache__/
dist/
*.log
See kiirendab koostamist ja vähendab ohtu, et konteinerkujusse 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 töötab server, tuleb port hostsüsteemiga siduda.
docker run --rm -d --name pyweb -p 127.0.0.1:8000:8000 python:3.13-slim python -m http.server 8000
Siin:
-dpaneb konteineri taustale--name pywebannab konteinerile nime-p 127.0.0.1:8000:8000seob ainult kohaliku arvuti pordi8000konteineri pordiga8000; ilma127.0.0.1-ta võib port olla avatud ka võrgust
Kontroll:
docker ps
docker logs pyweb
Brauseris peaks teenus olema aadressil:
http://localhost:8000
Kui port on juba kasutusel, vali vasakul pool teine hosti port, näiteks -p 127.0.0.1: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. Katkesta jälgimine Ctrl-c-ga enne järgmist käsku; see ei peata konteinerit.
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.
Interaktiivsest sh-st välju käsuga exit. Kui brauserikatse, logid ja exec on proovitud, peata hosti terminalis konteiner käsuga docker stop pyweb. Valiku --rm tõttu eemaldatakse see siis ka nimekirjast. Väikeses konteinerkujus ei pruugi bash-i olla; sh on sagedamini olemas.
Hostitee sidumine konteinerisse
Koostatud konteinerkuju sobib valmis rakenduse proovimiseks. Arenduses tahad sageli, et konteiner näeks kohe sinu praegust projektikataloogi.
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 kataloog hostsüsteemisdst=/appvõi/appon sama kataloog konteineri sees-w /appteeb sellest töökataloogi
Konteineri sees käivita varem loodud app.py, seejärel välju. Pakettide paigaldamine ja testimine vajavad projekti sõltuvusfaili ning teste; neid esimene näide veel ei sisalda:
python app.py
exit
Hostitee sidumise (bind mount) korral muutub hostsüsteemi fail kohe. See on arenduses mugav, kuid tähendab ka, et konteineris tehtud muudatus võib muuta sinu töökataloogi.
Konteineri peatamine üksi ei kustuta selle kirjutatavat kihti. Andmed kaovad konteineri eemaldamisel, näiteks --rm või docker compose down korral, kui need pole seotud hostitee või andmeköitega.
Nimega andmeköide
Hostitee sidumine ühendab konteineri hostsüsteemi kindla faili või kataloogiga. Nimega andmeköide (named volume) on Dockeri hallatav püsiv andmeala.
Kõige tavalisem kasutus on andmebaasi andmed:
volumes:
pgdata:
Järgmine on ainult teenusekirjelduse katkend, mitte iseseisev käivitatav fail. Täielik fail koos parooli ja teenustega tuleb allpool:
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 nimega andmeköited- andmebaasi andmeköite kustutamine tähendab sageli andmete kustutamist
Arenduse tööjaotus
Hea algaja tööjaotus on:
| Kus | Mida tee |
|---|---|
| hostsüsteemis | muuda faile, salvesta muudatusi Gitiga, hoia dokumentatsiooni |
| konteineris | käivita rakendus, paigalda sõltuvusi, testi, silu keskkonda |
andmeköites (volume) | 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. Järgmine variant näitab paigalduse asukohta Dockerfile'is. Versioonita requests valib paigaldushetkel sobiva versiooni; korduvaks koostamiseks salvesta oma läbiproovitud versioonid, nagu venv-peatükis.
requirements.txt
requests
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 koostamisvahemälluCOPY 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:
- "127.0.0.1:8000:8000"
db:
image: postgres:16
environment:
POSTGRES_DB: opik
POSTGRES_USER: opik
POSTGRES_PASSWORD: opikpass
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
See kohalik katse käivitab kaks teenust, kuid HTTP-failiserver ei kasuta veel andmebaasi. Parool opikpass on ainult harjutuseks; andmebaasi porti ei avaldata hostile. Failiserver jagab praegust katsekataloogi, seega ära kasuta saladusi sisaldavat projekti.
Käivita teenused taustal:
docker compose up -d
docker compose logs db
Kui logi järgi võtab andmebaas ühendusi vastu, kontrolli seda. psql on PostgreSQL-i klient, -U määrab kasutaja, -d andmebaasi ja -c täidetava SQL-käsu:
docker compose exec db psql -U opik -d opik -c 'SELECT 1;'
Tulemuses näed väärtust 1. Ava HTTP-teenus brauseris ja lõpeta katse:
docker compose down
Logi saab pikemalt jälgida käsuga docker compose logs -f app; enne järgmisi käske katkesta jälgimine Ctrl-c-ga. Interaktiivsest docker compose exec app sh shellist välju exit-iga.
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 korduskatsete loogikat
- andmebaasi tervisekontrolli (
healthcheck) - 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 konteinerkujus | docker run --rm alpine uname -a |
| kontrolli valmis rakenduse konteinerkuju | docker build ja docker run |
| arenda koodi konteineri sees, kuid failid jäävad hostsüsteemi | hostitee sidumine |
| 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 kasuta Compose'i ainult ühe lühikese käsu käivitamiseks ega kirjuta üht väga pikka docker run käsku, kui projektis on mitu teenust.
Ohutus ja privaatsus
Konteiner ei ole maagiline turvasein.
Ole ettevaatlik, kui:
- konteinerkuju on tundmatust allikast
- seod konteineriga hostsüsteemi katalooge
- paned keskkonnamuutujatesse paroole või võtmeid
- näed juhendit, mis seob konteineriga Dockeri sokli, näiteks
/var/run/docker.sock - käsk kasutab
--privileged
Algaja hea reegel: ära käivita võõrast konteinerkuju nii, et seod sellega oma kodukataloogi või salajased failid.
Kettaruumi kontroll ja koristamine
Docker võib aja jooksul koguda konteinerkujusid, peatatud konteinereid ja koostamisvahemälu.
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 konteineriga
- projektikataloog seotakse tööruumina
- terminal, testid ja keele tööriistad töötavad konteineris
Arenduskonteiner ei asenda Dockeri põhimõtteid. Ta teeb sama loogika mugavamaks, eriti siis, kui projekt vajab keerulisemat keskkonda.
Minitest
- Mis vahe on konteinerkujul (
image) ja konteineril? - Miks on
--rmkasulik lühikeste katsete puhul? - Mida teeb
-p 127.0.0.1:8000:8000? - Mis vahe on hostitee sidumisel ja nimega andmeköitel (
named volume)? - 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
Konteinerkuju (image) on käivitusmall; konteiner võib töötada või olla peatatud. Konteineri eemaldamisel kaob selle kirjutatav kiht, mitte seotud hostifailid ega püsivad andmeköited.
Põhikäsud
docker --versionkontrolli olemasoludocker run --rm alpine echo tereohutu esimene käivitusdocker build -t rakendus .koosta konteinerkujudocker run --rm rakenduskäivita konteinerdocker pstöötavad konteineriddocker logs -f nimijälgi logidocker exec -it nimi shsisene töötavasse konteinerissedocker compose up -dteenused taustaledocker compose downpeata ja eemalda konteinerid ning võrk
Olulisemad lipud, märgid ja kiirnupud
imagekonteinerkuju ehk käivitusmallkonteinerkäivitatud või peatatud eksemplarDockerfilekonteinerkuju retseptcompose.yamlmitu teenustvolumepüsiv andmeköideregistrykonteinerkujude hoidla--rmkustuta lühikatse konteiner pärast lõppu-p 127.0.0.1:8000:8000docker run: avalda port ainult oma arvutile--mount type=bind,src="$PWD",dst=/appjaga praegune kataloog konteinerisse-w /appmäära konteineri töökataloogdocker compose down -vpeatab ja kustutab ka andmeköited