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
latestnie 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
slimczyalpinepotrafi 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.