Obraz kontenera

Niezmienialny szablon zawierający aplikację, biblioteki i instrukcje uruchomienia. Z obrazu tworzone są działające instancje kontenerów.

Obraz kontenera (container image) to niezmienialny, gotowy do uruchomienia pakiet, który zawiera kod aplikacji, jej biblioteki, zależności, pliki konfiguracyjne oraz instrukcję, co ma się uruchomić po starcie. Możesz o nim myśleć jak o „zamrożonej” migawce systemu plików aplikacji plus metadanych. Sam obraz nic nie robi i nie zużywa CPU — to dopiero szablon. Gdy go uruchomisz, silnik kontenerowy tworzy z niego działającą instancję, czyli kontener. Z jednego obrazu możesz odpalić jeden kontener albo tysiąc, i każdy będzie identyczny.

Najważniejsza cecha to niezmienialność (immutability). Raz zbudowany obraz się nie zmienia — jeśli chcesz nowszą wersję aplikacji, budujesz nowy obraz i nadajesz mu nowy tag. Dzięki temu masz powtarzalność: ten sam obraz, który przeszedł testy na Twoim laptopie, pojedzie na CI i na produkcji bez niespodzianek typu „u mnie działało”.

Obrazy są zbudowane warstwowo. Każda instrukcja w przepisie na obraz tworzy osobną warstwę (layer), a warstwy są współdzielone między obrazami i cache’owane. Jeśli dziesięć Twoich obrazów bazuje na tym samym alpine, ta warstwa leży na dysku raz. To dlatego rebuild po drobnej zmianie w kodzie trwa sekundy, a nie minuty.

Przykład z praktyki

W Dockerze obraz opisujesz w pliku Dockerfile, a budujesz go poleceniem docker build -t moja-apka:1.0 .. Potem uruchamiasz instancję: docker run moja-apka:1.0. Gotowe obrazy trzymasz w rejestrze (registry), np. Docker Hub czy GitHub Container Registry, skąd pobierasz je przez docker pull. Standard formatu obrazów i runtime’u opisuje OCI (Open Container Initiative), dlatego obraz zbudowany Dockerem uruchomisz też w Podmanie albo na Kubernetesie — nie jesteś przywiązany do jednego narzędzia.

Częste błędy i mity

  • Mit: obraz to to samo co kontener. Nie. Obraz to szablon (jak klasa), kontener to działająca instancja (jak obiekt).
  • Tag latest nie znaczy „najnowszy”. To zwykła etykieta, którą można nadpisać. Na produkcji przypinaj konkretne wersje, a jeszcze lepiej digest (@sha256:...).
  • Wrzucanie sekretów do obrazu. Hasła i klucze API zostają w warstwach na zawsze, nawet jeśli „usuniesz” je w kolejnej instrukcji. Hasła podawaj jako zmienne środowiskowe lub przez mechanizm secretów.
  • Puchnące obrazy. Bazowanie na pełnym systemie zamiast na obrazie typu slim czy alpine potrafi rozdmuchać obraz do gigabajtów. Mniejszy obraz = szybszy deploy i mniejsza powierzchnia ataku.

Pojęcia powiązane: kontener, Dockerfile, warstwa (layer), rejestr obrazów (registry), tag i digest, OCI, Docker, Podman, Kubernetes, konteneryzacja, wirtualizacja.