- 1 1. Sissejuhatus
- 2 2. Dockerfile’i põhistruktuur
- 3 3. Praktiline: Ubuntu-põhise Dockerfile’i loomine
- 4 4. Docker image’i ehitamine ja kontrollimine
- 5 5. Rakendus: Python keskkonna loomine
- 6 6. Levinumad probleemid ja lahendused
- 7 7. Kokkuvõte
- 8 8. KKK (Korduma kippuvad küsimused)
- 8.1 K1. Millist Ubuntu versiooni peaksin Dockerfile’is valima?
- 8.2 K2. Miks saan "paketti ei leitud" (apt-get install) veateate?
- 8.3 K3. Kuidas Dockerfile’is määrata keskkonnamuutujaid?
- 8.4 K4. Mis vahe on CMD ja ENTRYPOINT käsul Dockerfile’is?
- 8.5 K5. Muutsin Dockerfile’i, aga muudatus ei jõua image’i. Miks?
1. Sissejuhatus
Mis on Docker ja Dockerfile?
Viimastel aastatel on Docker kiiresti levinud arenduskeskkondade seadistamise ja rakenduste juurutamise tõhustamise vahendina. Docker võimaldab rakenduse koos kõigi sõltuvustega pakendada ühte " konteinerisse ", mida saab käivitada igas keskkonnas sama moodi.
Selle Docker-konteineri loomiseks on vaja "Dockerfile" nime kandvat projekti faili. Dockerfile on tekstifail, milles määratletakse baas-operatsioonisüsteemi kujutis, paigaldatavad tarkvarad, keskkonnamuutujad jne. Arendajad saavad selle failiga automaatselt üles ehitada kohandatud keskkonna.
Miks kasutada Ubuntu baasi?
Dockerfile’i loomisel tuleb esmalt valida baas-operatsioonisüsteemi kujutis. Kõige populaarsem valik on Ubuntu. Ubuntu on Debianil põhinev Linuxi distributsioon, mis võimaldab paindlikku ja lihtsalt kasutatavat arenduskeskkonda ning pakub rohkesti pakette.
Ubuntu-põhisel Dockerfile’il on järgmised eelised:
- Rikkalik ametlik ja kogukonna dokumentatsioon, mis muudab õppimise lihtsamaks
- Paljusid pakette ja tööriistu saab hõlpsasti paigaldada APT kaudu
- Saadaval on kerged minimaalsed kujutised (
ubuntu:20.04
,ubuntu:24.04
jne)
Artikli eesmärk ja sihtrühm
Selles artiklis tutvustame märksõna "Dockerfile Ubuntu" põhjal, kuidas luua Ubuntu-baasil Dockerfile’i – samm-sammult ja arusaadavalt ka algajatele.
Käsitleme Dockerfile’i põhistruktuuri, Ubuntu keskkonna loomist, Python jms arenduskeskkonna seadistamist, samuti tüüpilisi vigu ja nende lahendusi.
Soovitame seda artiklit järgnevatele kasutajatele:
- Neile, kes soovivad esimest korda Dockerfile’iga keskkonda seadistada
- Neile, kes tahavad Ubuntu peal korduvkasutatavat arenduskeskkonda luua
- Neile, kes soovivad teada ka probleemide lahendamise viise
2. Dockerfile’i põhistruktuur
Mis on Dockerfile? Selle rolli mõistmine
Dockerfile on nagu retsept Docker image’i loomiseks. See tekstifail määrab, millist baas-OS-i kasutatakse, millist tarkvara paigaldatakse ja milliseid seadistusi tehakse.
Selle faili alusel saab docker build
käsuga kiiresti ja usaldusväärselt luua arendus- või rakenduskeskkondi.
Dockerfile’i kasutamise eelised:
- Kõik keskkonna seadistused saab automatiseerida (manuaalset tööd pole vaja)
- Vähendab arendajate vahel keskkonna erinevusi
- Lihtne integreerida CI/CD torujuhtmetesse
Dockerfile’i tüüpilised põhidirektiivid
Dockerfile sisaldab mitmeid käske (direktiive), millest allpool on peamised. Neid kombineerides saab luua Ubuntu-põhise Dockerfile’i.
Käsk | Selgitus |
---|---|
FROM | Määrab baasil kasutatava Docker image’i. Nt: FROM ubuntu:24.04 |
RUN | Käivita shelli käsk, nt pakettide paigaldamiseks |
COPY | Kopeerib kohaliku faili image’i sisse |
ADD | Sarnaselt COPY-le, kuid toetab ka URL-i laadimist ja arhiivide lahtipakkimist |
WORKDIR | Määrab töökataloogi |
ENV | Keskkonnamuutuja määramine |
CMD | Käsk, mis käivitatakse konteineri alguses (saab üle kirjutada) |
ENTRYPOINT | Käsk, mida alati käivitatakse (CMD asemel/kõrval) |
Ubuntu-põhise Dockerfile’i minimaalne näide
Siin on Ubuntu-põhise Dockerfile’i lihtne näide:
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y \
curl \
vim
CMD ["/bin/bash"]
See Dockerfile kasutab Ubuntu 24.04 baasi, paigaldab curl
ja vim
ning käivitab bash shelli.
Ubuntu siltide (tag) valimine
Ubuntu Docker image’id on avaldatud Docker Hubi ametlikus repositooriumis. ubuntu:latest
kasutab kõige uuemat versiooni, kuid soovitatav on alati määrata konkreetne versioon.
Näiteks:
ubuntu:22.04
(LTS: pikaajalise toega, stabiilsusele keskendunud)ubuntu:24.04
(uusim LTS kandidaat, rohkem uusi funktsioone)
Vali kas stabiilsus või uuenduslikkus vastavalt oma vajadustele.
3. Praktiline: Ubuntu-põhise Dockerfile’i loomine
Vajalike pakettide paigaldamine Ubuntu keskkonda
Ubuntu baasil Dockerfile’iga tuleb tihti lisapaketid paigaldada. Tavaliselt kasutatakse arenduseks järgmisi tööriistu:
curl
– failide allalaadimiseks või API päringuteksvim
– lihtne tekstiredaktorgit
– versioonihaldusbuild-essential
– põhilised kompileerimistööriistad (C/C++)
Neid paigaldatakse RUN
käsuga Dockerfile’is.
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y \
curl \
vim \
git \
build-essential
Et saada värskeimad paketid, tuleb alati enne paigaldamist käivitada apt-get update
.
Mitte-interaktiivne paigaldus
Ubuntu apt-get install
võib vahel küsida kasutajalt sisendit, kuid Dockeri build-protsessis pole see võimalik. Selleks kasuta keskkonnamuutujat, et paigaldada vaikimisi ilma küsimusteta:
ENV DEBIAN_FRONTEND=noninteractive
See võimaldab nt lokaliseerimisvalikute automaatset vahelejätmist.
Ketta säästmine: vahemälu kustutamine
APT jätab alla laaditud failid image’isse, mis muudab selle suureks. Kustutades vahemälu saad image’i väiksemaks:
RUN apt-get update && apt-get install -y \
curl \
vim \
&& rm -rf /var/lib/apt/lists/*
Mitme käsu ühendamine ühte RUN
käsku vähendab ka kihte (layers).
Parimad praktikad Dockerfile’i kirjutamisel
Soovitatavad parimad praktikad Dockerfile’i jaoks:
- Kombineeri
RUN
käsud, et vähendada kihtide arvu - Määra versioonid ja seadistused
ENV
abil - Lisa kommentaare, mis selgitavad, mida iga käsk teeb
- Kustuta mittevajalikud failid (
rm
,--no-install-recommends
)
Näide:
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
Nii saad kergema ja paremini hooldatava Dockerfile’i.
4. Docker image’i ehitamine ja kontrollimine
Dockerfile’ist image’i ehitamine
Kui Dockerfile on valmis, loo Docker image järgmise käsuga selle kataloogis:
docker build -t my-ubuntu-image .
-t
valikuga määrad image’ile nime (my-ubuntu-image
).
tähendab jooksvat kataloogi (kus on Dockerfile)
Docker loeb käsud järjest läbi ja loob uue image’i.
Ehitatud Docker image’i kontrollimine
Pärast ehitamist näed oma image’i nimekirjas järgmise käsuga:
docker images
See näitab kõiki lokaalseid image’eid, nt:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-ubuntu-image latest abcd1234abcd 5 minutes ago 189MB
Saad kontrollida, kas image on korrektselt loodud.
Docker konteineri käivitamine ja testimine
Testimiseks käivita oma image järgmise käsuga:
docker run -it my-ubuntu-image
-it
lülitab sisse interaktiivse terminali- Kui näed konteineri sees bash prompti, on kõik korras
Konteineri sees testid paigaldatud tööriistu, nt:
curl --version
vim --version
Kõik töötab, kui käsud annavad vastuse.
Kasutute image’ide ja konteinerite puhastamine
Korduva testimise käigus koguneb kasutuid image’eid ja konteinereid. Puhasta neid järgmiste käskudega:
- Peatatud konteinerite kustutamine:
docker container prune
- Kasutamata image’ide kustutamine:
docker image prune
- Kõigi kasutamata andmete kustutamine (ettevaatlikult!):
docker system prune
Nii säästad kettaruumi ja väldid tõrkeid.
5. Rakendus: Python keskkonna loomine
Python’i paigaldamine Ubuntu-põhises Dockerfile’is
Kui vajad Python’it (nt arenduseks, testimiseks või masinõppeks), on kõige parem see selgesõnaliselt paigaldada – isegi kui see on juba eelpaigaldatud.
Python’i paigaldamine APT kaudu
Lihtsaim viis on paigaldada Python APT-iga. Näide:
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
See paigaldab süsteemi stabiilse Python 3 versiooni ja pip
i. Nüüd saad vajadusel paigaldada Python’i raamatukogusid.
pyenv’iga Python’i versioonihaldus
Kui vajad konkreetset Python’i versiooni või mitme versiooni vahel vahetamist, kasuta pyenv-i.
Näide: paigalda Dockerfile’is pyenv ja Python 3.11.6
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
git \
curl \
make \
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
wget \
llvm \
libncurses5-dev \
libncursesw5-dev \
xz-utils \
tk-dev \
libffi-dev \
liblzma-dev \
&& rm -rf /var/lib/apt/lists/*
# Installi pyenv
RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv
ENV PYENV_ROOT="$HOME/.pyenv"
ENV PATH="$PYENV_ROOT/bin:$PATH"
RUN echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
# Paigalda soovitud Python'i versioon
RUN pyenv install 3.11.6 && pyenv global 3.11.6
Nii saad vajadusel hõlpsasti versioone vahetada.
requirements.txt ja Python’i pakettide haldus
Kui projekt vajab mitut raamatukogu, kasuta requirements.txt
faili.
Paiguta faili projekti juurkausta, nt:
flask==2.3.2
requests>=2.25.1
pandas
Seejärel lisa Dockerfile’i:
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt
See paigaldab kõik vajalikud raamatukogud korraga ja tagab keskkonna taastatavuse.
Parimad praktikad
- Kasutades Python’it, loo virtuaalkeskkond (
virtualenv
võivenv
), et vältida sõltuvuste konflikte. - Kasuta
--no-cache-dir
et image oleks väiksem. - Uuenda pip enne raamatukogude paigaldamist (
pip install --upgrade pip
), et vältida vigu.
6. Levinumad probleemid ja lahendused
Õiguste (permission) vead
Näide:
Permission denied
Selline viga tekib siis, kui kopeeritud failil puudub käivitusõigus või skripti omanik/kasutaja pole õigesti määratud.
Lahendus:
- Muuda fail käivitatavaks:
RUN chmod +x script.sh
- Vajadusel muuda faili omanikku:
RUN chown root:root /path/to/file
Paketti ei leitud või install ebaõnnestus
Näide:
E: Unable to locate package xxx
See viga tekib, kui apt-get update
käsku pole eelnevalt käivitatud või paketi nimi on vale.
Lahendus:
- Käivita alati
apt-get update
enne installi:
RUN apt-get update && apt-get install -y curl
- Kontrolli, et paketi nimi oleks õige ja kirjavigu poleks
Võrguvead (network related errors)
Näide:
Temporary failure resolving 'deb.debian.org'
See viga näitab, et DNS-i lahendamine ei õnnestu buildimise ajal.
Lahendus:
- Docker teenuse taaskäivitamine võib aidata:
sudo systemctl restart docker
- Vaata üle Dockeri DNS-seaded (
/etc/docker/daemon.json
lisa DNS-id):
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
Build-cache mõjud – vana olek jääb alles
Docker kasutab kihiliste buildide kiirendamiseks cache’i, mistõttu muudatused Dockerfile’is ei pruugi kohe mõjuda.
Lahendus:
- Keela cache ja tee build uuesti:
docker build --no-cache -t my-image .
Konteineri käivituskäsk ei tööta või konteiner sulgub kohe
Põhjused:
CMD
võiENTRYPOINT
käsk annab veaCMD
on["/bin/bash"]
või muu shell, mis mitte-interaktiivses režiimis lõpetab kohe
Lahendus:
- Käivita konteiner debugimiseks interaktiivses režiimis:
docker run -it my-image /bin/bash
- Saa aru CMD ja ENTRYPOINT erinevusest ning kasuta neid vastavalt vajadusele
Iga vea kogemus parandab oskust Dockerfile’i koostada. Kui tekib probleem, loe veateade rahulikult läbi ja analüüsi, millises kihis või käsus probleem tekkis.
7. Kokkuvõte
Olulised punktid Ubuntu-põhise Dockerfile’i loomisel
Selles artiklis selgitasime kuidas luua Ubuntu-põhist Dockerfile’i alates baasist kuni täiustatud teemadeni. Olulisemad punktid veelkord:
- Dockerfile’i põhistruktuuri mõistmine on esimene samm
FROM
,RUN
,CMD
,ENV
jt käskudega saad keskkonna automaatselt seadistada. - Ubuntu on stabiilne ja paindlik baasimage
Palju pakette, suur kasutajaskond ja LTS-versioonid sobivad arenduskeskkonnaks hästi. - Tõhus paketihaldus võimaldab paigaldada vajalikud tööriistad ja raamatukogud.
apt-get
õige kasutamine, vahemälu puhastamine ja mitte-interaktiivne režiim on võtmekohad. - Ka keerulisemad arenduskeskkonnad (nt Python) saab Dockerfile’iga hõlpsasti seadistada.
pyenv
,pip
jarequirements.txt
tagavad taasloetava arenduskeskkonna. - Veaotsingu oskus aitab hoida töövoogu stabiilsena.
Õiguste, võrgu või cache’i probleemidest arusaamine aitab arenduskiirust tõsta.
Dockerfile õppimise järgmised sammud
Kui valdad Dockerfile’i, saad lisaks arendusele ka test- ja tootmiskeskkonda lihtsamini hallata. Järgmisena võiksid õppida:
- Docker Compose – mitme konteineri haldus
- CI/CD tööriistad (GitHub Actions, GitLab CI jt) – automaatne paigaldus ja testimine
- Kubernetes – konteinerite orkestreerimine
Ametlikud dokumendid ja viited
- Docker ametlik dokumentatsioon (inglise keeles)
- Docker Hub – Ubuntu ametlikud kujutised
- pyenv GitHub repo
8. KKK (Korduma kippuvad küsimused)
K1. Millist Ubuntu versiooni peaksin Dockerfile’is valima?
Vastus: Üldiselt tasub eelistada LTS (Long Term Support) versiooni, näiteks ubuntu:22.04
või ubuntu:20.04
, sest neil on 5-aastane tugi ja need sobivad hästi tootmiskeskkonda. Kui vajad kõige uuemaid pakette, võid proovida ubuntu:24.04
, kuid testi see eelnevalt põhjalikult.
K2. Miks saan "paketti ei leitud" (apt-get install
) veateate?
Vastus: Peamine põhjus on, et pole eelnevalt tehtud apt-get update
käsku. See uuendab pakettide nimekirja, muidu ei pruugi vajalik pakett nähtav olla.
Õige näide:
RUN apt-get update && apt-get install -y curl
Kontrolli alati ka paketi nime õigekirja (nt python
vs python3
).
K3. Kuidas Dockerfile’is määrata keskkonnamuutujaid?
Vastus: Kasuta ENV
käsku. See kehtib nii buildimise kui ka konteineri käitamise ajal.
Näide:
ENV DEBIAN_FRONTEND=noninteractive
Seda kasutatakse nt apt-get
installi küsimuste vältimiseks, samuti saab määrata rakenduse seadistusi või API võtmeid.
K4. Mis vahe on CMD
ja ENTRYPOINT
käsul Dockerfile’is?
Vastus: Mõlemad määravad käsu, mis käivitatakse konteineri alguses, kuid nende kasutus ja käitumine on erinevad.
Omadus | CMD | ENTRYPOINT |
---|---|---|
Ülekirjutatavus | Saab üle kirjutada docker run käsuga | Reeglina ei saa üle kirjutada (CMD läheb argumendiks) |
Kasutus | Vaikimisi käsk | Alati täidetav käsk |
Näited:
CMD ["python3", "app.py"]
# või
ENTRYPOINT ["python3"]
CMD ["app.py"]
Teisel juhul saab docker run my-image another_script.py
anda CMD argumendiks.
K5. Muutsin Dockerfile’i, aga muudatus ei jõua image’i. Miks?
Vastus: Docker kasutab buildimisel cache’i, seega väikesed muudatused ei pruugi kohe nähtavaks saada.
Lahendus:
docker build --no-cache -t my-image .
Nii ehitatakse kõik käsud uuesti ja muudatused rakenduvad.