Beetaversioon: sisu on enamasti terviklik ja avalikuks katsetamiseks valmis, kuid vajab veel tehnilist, keelelist ja kasutatavuse kontrolli.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Dockeri alused, mis kuulub osasse Osa V: Arendus ja töövood.

Dockeri alused

Loogika

Docker aitab panna rakenduse koos käivituskeskkonnaga ühte korratavasse pakki.

Kõige tähtsam mõttejärjekord on:

  1. vali või koosta konteinerkuju (image)
  2. käivita sellest konteiner
  3. seo vajadusel port või kataloog hostsüsteemiga
  4. vaata logisid ja käivita käske konteineri sees
  5. kui teenuseid on mitu, kirjelda need compose.yaml failis

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äskMilleksMida tavaliselt näed
konteinerkuju (image)käivitusmallnimi ja märgend, näiteks python:3.13-slim
konteinerkonteinerkujust käivitatud protsesstöötav või peatatud eksemplar
Dockerfilekonteinerkuju koostamise retseptFROM, WORKDIR, COPY, RUN, CMD
docker buildkoosta konteinerkujukoostamiskihid ja kuju nimi
docker runkäivita konteinerprogrammi väljund või konteineri ID
docker psvaata töötavaid konteinereidkonteinerite tabel
docker logsloe konteineri väljunditprogrammi logiread
docker execkäivita käsk töötavas konteineriskäsu väljund konteineri seest
docker composekäivita seotud teenusedteenuste 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 exec konteineri käivitamiseks, kuigi see töötab ainult juba töötavas konteineris
  • eeldatakse, et depends_on tähendab andmebaasi täielikku valmisolekut
  • pannakse konteinerisse venv ainult harjumusest, kuigi konteiner ise juba isoleerib keskkonda
  • kustutatakse käsuga docker compose down -v kogemata 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:

  • alpine on konteinerkuju
  • echo tere või uname -a on käsk, mis käivitatakse konteineri sees
  • --rm kustutab 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.

OlukordTavaliselt sobib
ainult Pythoni paketid peavad olema eraldivenv
vaja on kindlat Linuxi keskkonda või süsteemipaketteDocker
projekt vajab andmebaasi, vahemälu või mitut teenustDocker Compose
tahad kiiresti väikest kohalikku skripti tehavenv
meeskonnal peab sama rakendus eri masinates sarnaselt käivitumaDocker

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-slim valib Pythoni baaskeskkonna
  • WORKDIR /app määrab töökataloogi konteineri sees
  • COPY app.py . kopeerib faili konteinerkujusse
  • CMD ["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:

  • -d paneb konteineri taustale
  • --name pyweb annab konteinerile nime
  • -p 127.0.0.1:8000:8000 seob ainult kohaliku arvuti pordi 8000 konteineri pordiga 8000; ilma 127.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üsteemis
  • dst=/app või /app on sama kataloog konteineri sees
  • -w /app teeb 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 down peatab ja eemaldab teenuste konteinerid ning võrgu
  • docker compose down -v eemaldab ka nimega andmeköited
  • andmebaasi andmeköite kustutamine tähendab sageli andmete kustutamist

Arenduse tööjaotus

Hea algaja tööjaotus on:

KusMida tee
hostsüsteemismuuda faile, salvesta muudatusi Gitiga, hoia dokumentatsiooni
konteineriskä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ällu
  • COPY 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:

  • up käivitab teenused ja näitab logisid
  • up -d käivitab teenused taustal
  • logs -f app jälgib ühe teenuse logi
  • exec app sh avab käsu töötavas teenusekonteineris
  • down peatab 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

VajadusSobiv tööriist
proovi üht käsku puhtas konteinerkujusdocker run --rm alpine uname -a
kontrolli valmis rakenduse konteinerkujudocker build ja docker run
arenda koodi konteineri sees, kuid failid jäävad hostsüsteemihostitee sidumine
käivita rakendus koos andmebaasi või muu teenusegadocker compose
IDE avab kogu tööruumi konteinerisarenduskonteiner 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

  1. Mis vahe on konteinerkujul (image) ja konteineril?
  2. Miks on --rm kasulik lühikeste katsete puhul?
  3. Mida teeb -p 127.0.0.1:8000:8000?
  4. Mis vahe on hostitee sidumisel ja nimega andmeköitel (named volume)?
  5. Millal valid docker compose tavalise docker run asemel?
  6. Miks ei tasu docker compose down -v kä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 olemasolu
  • docker run --rm alpine echo tereohutu esimene käivitus
  • docker build -t rakendus .koosta konteinerkuju
  • docker run --rm rakenduskäivita konteiner
  • docker pstöötavad konteinerid
  • docker logs -f nimijälgi logi
  • docker exec -it nimi shsisene töötavasse konteinerisse
  • docker compose up -dteenused taustale
  • docker compose downpeata ja eemalda konteinerid ning võrk

Olulisemad lipud, märgid ja kiirnupud

  • imagekonteinerkuju ehk käivitusmall
  • konteinerkäivitatud või peatatud eksemplar
  • Dockerfilekonteinerkuju retsept
  • compose.yamlmitu teenust
  • volumepüsiv andmeköide
  • registrykonteinerkujude 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öökataloog
  • docker compose down -vpeatab ja kustutab ka andmeköited