Kontajnerizácia aplikácie

Kontajner

  • Bežiaci proces (alebo viac procesov) izolovaný od hostiteľa
  • Izolácia: namespaces (PID, NET, MNT, …) + limity cez cgroups
  • Má vlastný pohľad na súborový systém, sieť a procesy

Obraz kontajnera

Obraz

Obraz kontajnera

  • Nemenný (read-only) balík: vrstvy súborového systému + metadata
  • Typicky obsahuje aplikáciu, závislosti a používateľský priestor OS
  • Kontajner pri spustení pridá zapisovateteľnú vrstvu

Vytvorenie obrazu

Ako upraviť aplikáciu aby bežala na cloude?

  • Oddelenie aplikácie, dát, siete a konfigurácie.
  • Zapíšeme postup pre inštaláciu.

Analýza závislosti aplikácie

Každá aplikácia má svoje závislosti na nižších vrstvách:

  • na knižnici,
  • na OS,
  • na procesore.

Zmena HW, LIB alebo OS si vyžaduje zmenu aplikácie.

Ako vytvoriť obraz kontajnera

Obraz

Dockerfile

Dockerfile definuje, ako sa vytvorí obraz kontajnera.

Príklad:

FROM ubuntu:22.04
RUN apt-get update \
 && apt-get install -y --no-install-recommends nginx \
 && rm -rf /var/lib/apt/lists/*
CMD ["nginx", "-g", "daemon off;"]

Každý príkaz v Dockerfile je nová vrstva

FROM ubuntu:22.04
+------------------+
| ubuntu:22.04     |
+------------------+
RUN apt-get update && apt-get install -y nginx
+------------------+
| nginx            |
+------------------+
CMD ["nginx", "-g", "daemon off;"]
+------------------+
| nginx            |
+------------------+

Obraz kontajnera sa skladá z vrstiev

  • Vrstvy sú nemenné.
  • Vrstvy sa dajú zdieľať medzi obrazmi.
  • Nový zápis znamená novú vrstvu.
  • Persistenciu a výmenu dát riešime bind mount alebo volume (prekryjú cestu v kontajneri).

Príklad vrstiev

  1. Základné Ubuntu 22.04 LTS
  2. Inštalácia NGINX
  3. Zmena pracovného adresára
  4. Nastavenie príkazu na spustenie

Príklad Dockerfile

Dockerfile sú inštrukcie ako zostaviť obraz.

Príklad:

FROM ubuntu:22.04
RUN apt-get update \
 && apt-get install -y --no-install-recommends nginx \
 && rm -rf /var/lib/apt/lists/* \
 && echo "\ndaemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]

Meno obrazu

Má v sebe zakódované

  • názov registra
  • názov obrazu
  • tag

Zostavenie obrazu

docker build . -t myregistry.tuke.sk/mynginx:0.1

                  |-----------------|-------|---|
                      registry        image  tag

Zdieľanie obrazu

Centrálny repozitár Dockerhub alebo vlastný register

  • Databáza vrstiev
  • Databáza obrazov
  • Databáza tagov

Možné problémy pri vytváraní obrazu

  • Závislosť na Docker Hub / dostupnosti registru
  • Časté využívanie neoverených obrazov
  • latest je nepredvídateľný (radšej konkrétne verzie/tagy alebo digest)
  • Docker démon beží ako root (práva, prístup k socketu)

Bezpečnosť v skratke

  • Používaj minimálne a dôveryhodné base images
  • Skenuj zraniteľnosti (napr. Trivy) a pravidelne aktualizuj
  • Bež ako non-root (USER) a dávaj len potrebné capabilities
  • Zváž rootless režim / alternatívy (Podman)

Spustenie kontajnera

# vpredu (zaberie terminál)
docker run --rm nginx

# na pozadí (detached)
docker run -d --name web nginx

Interaktívne spustenie

# shell v kontajneri (užitočné na debug)
docker run -it --rm ubuntu:22.04 bash

Základné príkazy (debug)

docker ps
docker logs web
docker exec -it web sh
docker stop web
   +----------+
   | Registry |
   +----------+
       |  Pull
       v
   +--------+
   | Image  |
   +--------+
       |  Run
       v
  +-----------+
  | Container |
  +-----------+

Kontajner beží vo virtuálnom prostredí

Vidí virtuálne zariadenia

  • Procesor
  • Sieť
  • Súborový systém
mapping

Virtuálna sieť

Kontajner vidí "svoju" sieť.

Spustenie s mapovaním portov

docker run -it --rm -p 8000:80 nginx
                        ^   ^
                        |   |
                hostiteľ      kontajner

Základné druhy siete v Docker

  • Host - kontajner priamo využíva hostiteľský stack
  • Bridge - virtuálna sieť v rámci hostiteľa
  • Overlay - virtuálna sieť medzi viacerými hostiteľmi
  • None - žiadny prístup ku sieti

User-defined bridge (odporúčané)

  • Default bridge má obmedzené DNS; pre viac kontajnerov používaj vlastnú sieť
docker network create mynet
docker run -d --name web --network mynet nginx
docker run -it --rm --network mynet ubuntu:22.04 bash
# v shelli: curl http://web

DNS v Docker

  • DNS mená fungujú najmä v rámci rovnakej user-defined siete
  • --name musí byť unikátne (nemôžeš mať dva kontajnery s rovnakým menom)
  • Orchestrátory/Compose vedia poskytovať „service name“ pre viac replík

Virtuálny súborový systém

  • Kontajner vidí svoj vlastný súborový systém ktorý sa skladá z vrstiev.
  • Vrstvenie je implementované pomocou špeciálneho súborového systému.
  • OverlayFS

Spustenie s mapovaním siete a zväzkov

docker run -p 80:80 -v /var/www:/var/www nginx

Mapovanie medzi reálnym a virtuálnym adresárom.

Vrstvy virtuálneho súborového systému

   +-----------------+
   | Operačný systém |
   +-----------------+
       | build
  +-----------+
  | Aplikácia |-----------+------------------+
  +-----------+           |                  |
       |  OverlayFS       | Config           | Volume
+----------------+  +---------------+  +----------------+
| Dočasné súbory |  | Konfigurácia  |  | Stav aplikácie |
+----------------+  +---------------+  +----------------+

Oddelenie dát od aplikácie

  • Aplikácia nemá svoj stav.
  • Dáta môžu byť uložené kdekoľvek.

Práca so súborovým systémom v systéme Docker

  • Súborový systém je virtuálny (vrstvy + writable layer)
  • Po odstránení kontajnera sa writable layer stratí (--rm)
  • Perzistentné dáta dávame do volume alebo bind mount

Čo je to stav kontajnera?

Časť súborového systému ktorá sa mení a ktorá je podstatná aj po reštarte, napr. databáza

Mapovanie adresárov

Vieme pripojiť existujúcu lokálnu zložku do nového kontajnera

Pripojenie aktuálneho adresára:

docker run -it --rm -v "$(pwd)":/home/user ubuntu:22.04 bash

Bind mount vs Volume

  • Bind mount: mapuje konkrétnu cestu z hostiteľa (typicky dev)
  • Named volume: spravuje Docker, vhodné na dáta aplikácie (runtime)
Vlastnosť Bind mount Named volume
Viazanosť na host path áno nie
Prenositeľnosť nižšia vyššia
Typické použitie zdrojáky, konfigurácia DB dáta, stav aplikácie

Docker pomenovaný zväzok

  • Docker dokáže čiastočne "manažovať" diskový priestor.
  • Špeciálna zložka pod kontrolou Dockera.
docker volume create myvolume
docker run -it --rm -v myvolume:/myvolume ubuntu:22.04 bash

Záver - Docker...

  • Je sada nástrojov nad vlastnosťami Linux jadra (namespaces, cgroups, FS vrstvy).
  • Umožňuje ľahko baliť a spúšťať aplikácie (lokálne aj v cloude).
  • Zjednodušuje distribúciu a nasadenie (image, registry, tagy).
  • Existuje viac kompatibilných runtime/nástrojov: Podman, containerd, CRI-O.
  • Orchestrácia viacerých kontajnerov: Kubernetes, Docker Swarm/Compose.
Reload?