Dockerfile ja Ubuntu: Samm-sammuline juhend arenduskeskkonna loomiseks

目次

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äskSelgitus
FROMMäärab baasil kasutatava Docker image’i. Nt: FROM ubuntu:24.04
RUNKäivita shelli käsk, nt pakettide paigaldamiseks
COPYKopeerib kohaliku faili image’i sisse
ADDSarnaselt COPY-le, kuid toetab ka URL-i laadimist ja arhiivide lahtipakkimist
WORKDIRMäärab töökataloogi
ENVKeskkonnamuutuja määramine
CMDKäsk, mis käivitatakse konteineri alguses (saab üle kirjutada)
ENTRYPOINTKä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äringuteks
  • vim – lihtne tekstiredaktor
  • git – versioonihaldus
  • build-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 pipi. 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õi venv), 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õi ENTRYPOINT käsk annab vea
  • CMD 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 ja requirements.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

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.

OmadusCMDENTRYPOINT
ÜlekirjutatavusSaab üle kirjutada docker run käsugaReeglina ei saa üle kirjutada (CMD läheb argumendiks)
KasutusVaikimisi käskAlati 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.

年収訴求