Zabalenie služby do Docker obrazu
o tom, ako distribuovať svoju aplikáciu vo forme Docker obrazu
Video pre cvičenie
Upozornenie
Predtým, ako prídete na cvičenie, tak:
nainštalovať vývojové prostredie PyCharm Professional
vytvoriť si účet na hub.docker.com so svojim univerzitným loginom (v tvare
ab123cd)nainštalovať si lokálne Docker
zvládať základy práce s technológiou Docker
stiahnite si obraz
python:3.13-slimpríkazom:$ docker image pull python:3.13-slimak používate OS Linux, nainštalujte si nástroj
hadolint; v opačnom prípade si stiahnite docker obrazhadolint/hadolint
Motivácia
Na minulom cvičení sme si vytvorili jednoduchú notifikačnú službu s názvom Notifier, pomocou ktorej bude môcť ktokoľvek, kto je šúčasťou infraštruktúry Smart department posielať notifikácie pomocou knižnice Apprise. A keďže budeme chcieť na vytvorenej službe zarobiť obrovské prachy, pokúsime sa ju dnes zabaliť do Docker obrazu, aby sme ju tým pádom vedeli nasadiť kdekoľvek.
Ciele
naučiť sa vytvoriť Docker obraz pre svoju aplikáciu
extrahovať konfiguráciu aplikácie mimo jej kód
naučiť sa ovládať aplikáciu bežiacu v kontajneri pomocou premenných prostredia
Postup
Make Something Working
V prvom kroku sa pokúsime spraviť nutné minimum na to, aby sme vytvorili Docker obraz s našou službou. Nutné minimum znamená, že neaplikujeme best practices, ale že sa sústredíme len na to, aby sme službu ako Docker kontajner vedeli úspešne spustiť.

Task
Vo svojom projekte vytvorte súbor Dockerfile, pomocou
ktorého vytvoríme Docker obraz služby.
Súbor Dockerfile vytvorte v koreňovom priečinku vášho
projektu. Podoba projektu po jeho vytvorení bude vyzerať nasledovne:
./
├── Dockerfile
├── readme.md
├── requirements.txt
└── src/
├── main.py
└── models.py
Task
Vytvorte minimálny funkčný Docker obraz.
Vytvorenie každého Docker obrazu sa obyčajne skladá z týchto základných častí:
- výber základného obrazu pomocou kľúčového slova
FROM, - inštalácia potrebných balíkov pre spustenie aplikácie pomocou
kľúčového slova
RUN, - prekopírovanie zdrojových súborov aplikácie pomoocu kľúčového slova
COPY, a - spustenie aplikácie pri spustení kontajnera pomocou kľúčového slova
CMDaleboENTRYPOINT
Základná podoba tohto súboru bude pre nás vyzerať nasledovne:
# base image
FROM python:3.14-slim
# mkdir /app && cd /app
WORKDIR /app
# install requirements/dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir --requirement requirements.txt \
&& rm requirements.txt
# copy src files
COPY src/ .
# command to run when container starts
CMD [ "/usr/bin/env", "python3", "main.py" ]Poznámka
Podobne, ako je tomu pri programovaní, aj pri písaní súboru
Dockerfile je možné použiť linter. Na kontrolu môžete
použiť linter s názvom hadolint.
Nástroj hadolint môžete použiť viacerými spôsobmi:
- môžete ho použiť online vo vašom prehliadači,
- ako rozšírenie vášho editora, napr. rozšírenie pre VS Code,
- môžete si ho nainštalovať do vášho systému pomocou správcu balíčkov vašej distribúcie,
- môžete si ho stiahnuť ako binárku, alebo
- ho môžete použiť ako Docker kontajner.
Použitím linteru sa vyhnete pri písaní Dockerfile
súborov zbytočných chýb. Použitiu lintera sa preto nevyhýbajte.
Task
Na základe vytvoreného súboru Dockerfile vytvorte
Docker obraz s názvom notifier.
Docker obraz môžete vytvoriť nasledovným príkazom:
$ docker image build --tag notifier .Overiť si úspešne vytvorený obraz môžete spustením príkazu na vypísanie zoznamu všetkých obrazov:
REPOSITORY TAG IMAGE ID CREATED SIZE
notifier latest 2a290634240b 6 hours ago 154MB
python 3.14-slim 88fe63acba12 4 weeks ago 119MBTask
Overte vytvorený Docker obraz spustením kontajnera.
Overiť vytvorený obraz môžete spustením nasledujúceho príkazu z príkazového riadku:
$ docker container run --rm -it notifierKontajner sa síce spustí, ale okamžite sa ukončí.
Poznámka
Ak používate vývojové prostredie PyCharm, môžete súbor
Dockerfile spustiť - buď stlačením klávesovej skratky
Ctrl + Shift + F10 alebo vybratím položky
Run 'Dockerfile'. Aby ste však videli obraz aj v zozname
všetkých obrazov, upravte si konfiguráciu spustenia pridaním
značky (z angl. tag). Tým pádom zakaždým, keď spustíte
Dockerfile, sa okrem spustenia kontajnera v prípade potreby
vytvorí aj nová verzia obrazu.
Poznámka
Čím viac zmien spravíte v súbore Dockerfile, tým viac
obrazov v zozname všetkých repozitárov, bude vyzerať nasledovne:
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 1c3f710c6719 2 days ago 15.1MB
Tieto obrazy zmažete príkazom:
$ docker image pruneRunning Container with Application Settings
Po spustení sa kontajner okamžite ukončil, pretože nedostal potrebnú konfiguráciu. Ako teda zabezpečiť, aby sme do kontajnera vedeli vniesť konfiguračné hodnoty prostredníctvom premenných prostredia?
V tomto kroku pripravíme všetko potrebné na to, aby sa kontajner spustil spolu s konfiguráciou uloženou v environmentálnych premenných.
Task
Spustite kontajner z vytvoreného obrazu spolu s premennými prostredia.
Vlastnosti služby je možné nastaviť pri spustení kontajneru pomocou premenných prostredia. To je možné urobiť opäť viacerými spôsobmi:
Pomocou IDE - Premenné prostredia je možné nastaviť v dialógu pre spustenie ako aplikácie z prostredia, tak aj pre spustenie kontajnera zo súboru
Dockerfile.Z príkazového riadku pomocou voľby
--envpríkazu:$ docker container run --rm -it \ --name notifier \ --env NOTIFIER_BROKER=147.232.205.176 \ --env NOTIFIER_PORT=8883 \ --env NOTIFIER_USERNAME=student \ --env NOTIFIER_PASSWORD=dgRk9cQ8sU4fCO \ --env NOTIFIER_SSL=true \ --env NOTIFIER_TOPIC_PREFIX=services/notifier \ --env NOTIFIER_UID=ab123cd \ notifierZ príkazového riadku pomocou voľby
--env-file, pomocou ktorej zadáme umiestnenie súboru s premennými prostredia:$ docker container run --rm -it \ --name notifier \ --env-file local.env \ notifierKombináciou volieb
--enva--env-file:$ docker container run --rm -it \ --name notifier \ --env-file local.env \ --env NOTIFIER_BROKER=mother.fei.tuke.sk \ notifier
Task
Overte, že sa v kontajneri naozaj predmetné premenné prostredia nachádzajú.
Vypísať zoznam premenných prostredia je možné zadaním príkazu
printenv vo vnútri kontajneru. To zabezpečíme týmto
príkazom:
$ docker container run --rm -it \
--env-file local.env \
notifier printenvPublishing Image to Repository
Obraz sme vytvorili a je pripravený na používanie. Vypublikujeme ho do repozitára hub.docker.com, aby sme ho vedeli použiť odkiaľkoľvek a rovnako, aby ho vedel použiť ktokoľvek.
Task
Prihláste sa do účtu hub.docker.com.
$ docker loginTask
Odošlite do svojho účute v repozitári hub.docker.com vytvorený obraz služby notifier.
Najprv označkovať obraz:
$ docker image tag notifier:latest USER/notifier:latest
$ docker image tag notifier:latest USER/notifier:2025
$ docker image tag notifier:latest USER/notifier:2025.1Následne obraz odošleme spolu so všetkými značkami:
$ docker image push --all-tags USER/notifierTask
Overte úspešnosť odoslania.
Ak ste postupovali správne, tak po zobrazení svojho profilu na serveri hub.docker.com, uvidíte svoj obraz.
(Some) Best Practices
Ak sa budete snažiť nasadzovať svoje riešenia vo forme Docker kontajnerov, určite budete hľadať spôsoby, ako to robiť čo najlepšie. Na internete nájdete obrovské množstvo videí a iných zdrojov, ktoré sa vám budú snažiť ponúkať tie najlepšie best practices. My sa v tomto kroku pozrieme na niekoľko z nich.
Task
Zabezpečte, aby sa aplikácia v kontajneri spustila pod právami
používateľa pythonista.
Používateľa treba v obraze najprv vytvoriť. To je možné napr.
nasledovným rozšírením príkazu RUN v súbore
Dockerfile:
RUN groupadd --gid 1000 pythonista \
&& useradd --uid 1000 --gid 1000 --no-create-home pythonista \
&& pip install --no-cache-dir --requirement requirements.txt \
&& rm requirements.txtPo poslednom príkaze RUN použíjeme príkaz
USER s uvedením mena používateľa, pod ktorým sa spustí
aplikácia v kontajneri. Výsledný súbor Dockerfile bude
vyzerať nasledovne:
FROM python:3.14-slim
WORKDIR /app
COPY requirements.txt .
RUN groupadd --gid 1000 pythonista \
&& useradd --uid 1000 --gid 1000 --no-create-home pythonista \
&& pip install --no-cache-dir --requirement requirements.txt \
&& rm requirements.txt
COPY src/ .
USER maker
CMD [ "/usr/bin/env", "python3", "main.py" ]Task
Overte úspešnosť vykonaných zmien.
Do spusteného kontajnera sa môžete dostať spustením interpretera príkazov v ňom. To je možné opäť pomocou vývojového prostredia ako aj priamo z príkazového riadku príkazom:
$ docker container exec --it notifier bashMeno používateľa uvidíte rovno v prompte alebo si aktuálneho
používateľa spolu s jeho skupinou môžete zistiť spustením príkazu
id v kontajneri:
$ id
uid=1000(maker) gid=1000(maker) groups=1000(maker)Task
Vytvorte samostatný skript healthcheck.py, pomocou
ktorého zabezpečíte kontrolu stavu služby.
Healthcheck mechanizmus je veľmi dôležitý a umožní nám overiť, či služba naozaj funguje tak, ako má. V našom prípade spravíme jednoduché overenie, ktoré bude vyzerať asi takto:
Pripojíme sa na MQTT broker. Tým overíme aj to, či konfigurácia, ktorú pre službu máme, je správna.
Prihlásime sa na odber témy o stave našej služby. Po jej prijatí overíme, či služba stále pracuje a nedošlo náhodou k uviaznutiu v kóde, kedy proces zostal spustený, ale prestal komunikovať s MQTT brokerom. Netreba zabudnúť overiť situáciu, ak správa prijatá nebola.
Odpojíme sa.
Dôležité však bude nastaviť návratový kód (tzv. exit status) podľa výsledku kontroly. To znamená, že:
- ak kontrola prebehla neúspešne (nesprávna konfigurácia, nesprávna
správa v téme
/status, žiadna prijatá správa z témy/status, správaoffline), ukončite aplikáciu s kódom1 - ak kontrola prebehla úspešne, ukončite aplikáciu s kódom
0
Task
Overte správnosť svojej implementácie.
Skontrolujte stavový kód sputenej aplikácie pre všetky možné prípady.
Task
Pridajte do súboru Dockerfile kontrolu stavu zdravia
pomocou kľúčového slova HEALTHCHECK.
Kontrolu zdravia nastavte nasledovne:
- interval kontrol nastavte na každých
30sekúnd - interval
timeoutnastavte na10sekúnd - stav nezdravý vyhláste po
3pokusoch
Výsledná konfigurácia môže vyzerať takto:
HEALTHCHECK \
--interval=30s \
--timeout=10s \
--retries=3 \
CMD /usr/bin/env python3 /app/healthcheck.py || exit 1Task
Overte správnosť svojej konfigurácie.
Ďalšie úlohy
- Aktualizujte súbor
readme.mda spravte z neho podklad pre opis obrazu pre váš obraz na stránke hub.docker.com.
Ďalšie zdroje
- Dockerfile
reference - referenčná príručka pre súbor
Dockerfile - Dockerfile cheatsheet -
ťahák pre súbor
Dockerfile - Docker Hub - webové rozhranie repozitára Docker obrazov hub.docker.com
- Dockerfile Best Practices - Jeden zo zoznamov tzv. best practices pre tvorbu Docker obrazov.
- dockerdocs: Building best practices - Odporúčania na zostavovanie Docker obrazov priamo v dokumentácii Docker-a.
- hadolint - Dockerfile linter, validate inline bash, written in Haskell