TakéDocker container, Linux container, aplikační kontejnerPokročilý

Definice

Kontejner je izolované běhové prostředí pro aplikaci, které obsahuje její kód, knihovny a nastavení, ale obvykle sdílí jádro operačního systému hostitele. V praxi umožňuje spustit stejný software lokálně, na serveru i v cloudu s menším režijním zatížením než plnohodnotný virtuální stroj.

Kategorie: Cloud a DevOpsAktualizováno

Nezaměňujte: V tomto hesle jde o softwarový kontejner pro běh aplikací, ne o kontejner jako datovou strukturu ani prvek rozvržení UI.

Proč kontejner řeší rozdíly mezi počítači

Kontejner balí aplikaci spolu s tím, co potřebuje pro běh: spustitelné soubory, knihovny, proměnné prostředí, certifikáty nebo konfigurační soubory. Vývojář tím omezuje situaci, kdy program funguje na notebooku, ale selže na serveru kvůli jiné verzi knihovny nebo chybějícímu balíčku. Kontejner neodstraňuje všechny rozdíly, například síť, oprávnění a výkon úložiště zůstávají závislé na prostředí, ale výrazně zmenšuje prostor pro náhodné odchylky.

Izolace bez vlastního operačního systému

Kontejner se liší od virtuálního stroje tím, že obvykle nespouští vlastní jádro operačního systému. Linuxové kontejnery využívají mechanismy jádra, například namespaces pro oddělení procesů, sítě a souborového systému a cgroups pro omezení CPU, paměti nebo I/O. Proces uvnitř kontejneru proto vidí zjednodušený svět, jako by běžel samostatně, ale ve skutečnosti sdílí hostitelský kernel s ostatními procesy.

Nižší režie znamená rychlejší start a vyšší hustotu provozu než u plných virtuálních strojů. Sdílení jádra zároveň znamená slabší bezpečnostní hranici než u hardwarové virtualizace. Citlivé workloady proto často kombinují kontejnery s další izolací, pečlivým nastavením oprávnění, skenováním imagů a oddělenými uzly.

Image, kontejner a registr

Image je neměnný balíček se souborovým systémem a metadaty pro spuštění aplikace. Kontejner je běžící instance image, která může mít vlastní síťovou adresu, procesy, proměnné prostředí a dočasnou zapisovatelnou vrstvu. Registr je úložiště, odkud se image stahují a kam se po sestavení nahrávají, například pro CI/CD pipeline.

Rozdíl mezi image a kontejnerem je prakticky důležitý při ladění. Změna provedená ručně uvnitř běžícího kontejneru se po jeho smazání obvykle ztratí. Trvalá změna má být popsána v Dockerfile, sestavena do nového image a nasazena znovu, aby byl provoz opakovatelný.

Kde kontejner naráží na hranice

Kontejner není náhrada za návrh aplikace. Špatně napsaná služba bude v kontejneru stále špatně škálovat, pomalu startovat nebo ukládat stav na nevhodné místo. Kontejner také neřeší orchestraci: restart po pádu, plánování na uzly, rolling update, service discovery a práci s tajemstvími typicky zajišťuje platforma jako Kubernetes nebo jiný provozní systém nad kontejnery.

Provozní tým musí řešit i životní cyklus imagů. Zastaralý základní image může obsahovat zranitelné knihovny, příliš široká oprávnění mohou zvětšit dopad útoku a chybějící limity paměti mohou poškodit sousední služby na stejném hostiteli.

Příklady z praxe

  1. Node.js API bez ruční instalace runtime

    Tým zabalí malou HTTP službu do image a na serveru spustí jen kontejnerový runtime. Server nemusí mít ručně instalovanou správnou verzi Node.js ani všechny npm balíčky. Při nasazení se stáhne image a kontejner se spustí podobně jako na vývojářském notebooku.

    FROM node:22-alpine
    WORKDIR /app
    COPY package*.json ./
    RUN npm ci --omit=dev
    COPY . .
    CMD ["node", "server.js"]
  2. Lokální databáze s trvalým volume

    Vývojář spustí PostgreSQL pro lokální testy v kontejneru a data uloží do pojmenovaného volume. Kontejner lze smazat a vytvořit znovu, aniž by se ztratila databázová data. Tým tak získá rychle obnovitelné prostředí bez instalace databáze přímo do systému.

    services:
      db:
        image: postgres:16
        environment:
          POSTGRES_PASSWORD: example
        volumes:
          - pgdata:/var/lib/postgresql/data
    volumes:
      pgdata:

Časté omyly

MýtusKontejner je jen lehčí virtuální stroj.
Ve skutečnostiKontejner a virtuální stroj řeší podobný provozní problém, ale používají jinou izolační vrstvu. Kontejner sdílí jádro hostitele, zatímco virtuální stroj virtualizuje celý operační systém.
MýtusKdyž aplikace běží v kontejneru, je automaticky bezpečná.
Ve skutečnostiKontejner zmenšuje některé dopady chyb, ale bezpečnost závisí na image, oprávněních, konfiguraci runtime, síti a aktualizacích. Špatně nastavený kontejner může být velmi rizikový.

Časté dotazy

Proč kontejner nenahrazuje virtuální stroj ve všech případech?
Kontejner sdílí jádro hostitelského operačního systému, zatímco virtuální stroj má vlastní kernel a silnější izolační vrstvu. Virtuální stroj proto dává větší smysl pro odlišné operační systémy, velmi citlivé workloady nebo situace, kde je požadována tvrdší bezpečnostní hranice. Kontejner je obvykle výhodnější pro rychlé nasazování aplikací se stejným typem hostitelského jádra.
Co se stane s daty po smazání kontejneru?
Data uložená jen do zapisovatelné vrstvy kontejneru obvykle zmizí při smazání kontejneru. Trvalá data mají být uložena do volume, bind mountu, databáze nebo objektového úložiště mimo životní cyklus konkrétního kontejneru. Kontejner je dobré chápat jako nahraditelnou instanci aplikace, ne jako dlouhodobé úložiště stavu.
Proč může být kontejner nebezpečný, když běží jako root?
Kontejner spuštěný jako root může při chybné konfiguraci nebo zranitelnosti získat větší možnosti, než aplikace skutečně potřebuje. Bezpečnější provoz obvykle používá neprivilegovaného uživatele, omezené capabilities, read-only souborový systém tam, kde to jde, a přísnější pravidla pro přístup k hostitelským adresářům. Kontejnerová izolace není omluva pro příliš široká oprávnění.
Kdy má smysl dát databázi do kontejneru?
Databáze v kontejneru dává velký smysl pro lokální vývoj, integrační testy a dočasná prostředí, protože se snadno spouští a zahazuje. Produkční databáze v kontejneru vyžaduje promyšlené perzistentní úložiště, zálohování, monitoring, limity zdrojů a plán obnovy. Kontejner sám o sobě neřeší spolehlivost datové vrstvy.

Zdroje

  1. Docker Docs(otevře se v novém okně)Docker Inc.
  2. Containers(otevře se v novém okně)Kubernetes
  3. Control Group v2(otevře se v novém okně)The Linux Kernel documentation
  4. OS-level virtualization(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.