Znasz ten moment, kiedy wszystko działa idealni na Twoim komputerze… a potem udostępniasz projekt komuś innemu i nagle się okazuje, że nic nie działa?
Dzieje się tak dlatego, że aplikacja zależy od środowiska, a Twoje środowisko to często znacząco różni się od środowiska innych osób.
- Zainstalowałeś konkretną wersję Pythona dwa miesiące temu
- Posiadasz jakieś paczki, o których dawno zapomniałeś
- Kolega ma Windowsa, Ty macOS, produkcja stoi na Linuksie – u każdego jest inaczej
Więc kiedy ktoś inny próbuje uruchomić Twój projekt, to nie odpala tylko kodu – instaluje też cały zestaw zależności, bibliotek i wersji, które u Ciebie akurat się zgadzają a u tej osoby niekoniecznie.
Dlaczego tak się dzieje
Bo software to nie tylko kod. To kod plus:
- wersja runtime’u (Python/Node/Java itd.)
- biblioteki systemowe
- zmienne środowiskowe
- pliki konfiguracyjne
- zależności
Po lekturze tego artykułu poznasz kluczowe pojęcia związane z Dockerem oraz zrozumiesz, jak działa i w jaki sposób wspiera cały proces wytwarzania oprogramowania.
Czym jest Docker
Wyobraź sobie, że masz dwa projekty na komputerze
- Projekt A: działa na Node 16
- Projekt B: potrzebuje Node 20
Ze względu na różnice w zależnościach projekty te nie dogadują się ze sobą. Z Dockerem każdy projekt ma swój kontener, czyli własne “pudełko” z odpowiednimi wersjami i zależnościami. Wkładasz więc wszystkie zależności każdego projektu do osobnego pudełka. Projekt A wkładasz do jednego pudełka a projekt B do drugiego. W ten sposób nie projekty nie wchodzą sobie w drogę i nie wpływają na Twoje środowisko systemowe.
Przydatne jest to, że możesz zabrać te pudełka i przenosić je w różne miejsca, na przykład na komputer znajomego, a wszystkie zależności pozostaną w swoich pudełkach, niepomieszane z jego aplikacjami w systemie. W obrazowym skrócie na tym polega działanie dockera.
Docker to platforma konteneryzacyjna umożliwiająca pakowanie aplikacji wraz z ich zależnościami w pojedynczą jednostkę zwaną kontenerem. Docker został wprowadzony w 2013 roku przez Solomona Hykesa i szybko zyskał popularność dzięki możliwości uproszczenia wdrażania oprogramowania poprzez konteneryzację.
Kontener Dockera to lekki, samodzielny pakiet wykonywalny. W środku masz nie tylko sam kod, ale też środowisko uruchomieniowe (runtime), potrzebne biblioteki, narzędzia systemowe oraz zależności. Dzięki temu aplikacja działa w spójnych, odseparowanych warunkach, co znacząco ułatwia jej tworzenie, testowanie i wdrażanie w różnych środowiskach, od laptopów deweloperskich po serwery produkcyjne.
Czasy sprzed konteneryzacji
I tu dochodzimy do klasycznego problemu sprzed czasów kontenerów. Zespół programistów tworzył aplikację, która wymagała zainstalowania i ręcznego skonfigurowania dodatkowych usług bezpośrednio w systemie operacyjnym. Przykładowo przy aplikacji w Javie zwykle potrzebne były komponenty takie jak PostgreSQL czy Redis. Nagle każdy programista musiał osobno: pobrać pliki binarne, zainstalować, skonfigurować, ustawić odpowiednie porty i jeszcze upewnić się, że wszystko odpala się w odpowiedniej wersji. Problem polegał na tym, że na Windowsie, macOS i Linuksie instalacja oraz konfiguracja przebiegały inaczej, co prowadziło do rozbieżności między środowiskami i strat czasu.
Docker mocno to uprościł. Zamiast ręcznie składać środowisko na każdym komputerze, pakujesz wymagane usługi i zależności w kontenery a następnie uruchamiasz je gotowe na różnych komputerach, dzięki czemu wszyscy pracują w identycznych warunkach. Instalacja przestaje być projektem pobocznym, a uruchomienie środowiska sprowadza się do kilku komend. W efekcie praca stała się szybsza i wygodniejsza.
Skracają wszystko do absolutnego minimum, który musisz wiedzieć o dockerze.
Docker to sposób na spakowanie aplikacji razem z jej środowiskiem i uruchomienie tego gdziekolwiek.
Docker nie jest maszyną wirtualną
Docker często myli się z wirtualkami, ale różnica jest prosta:
- VM (maszyna wirtualna) uruchamia cały osobny system operacyjny (jest cięższa i startuje wolniej).
- Kontener Dockera uruchamia aplikację z jej zależnościami, korzystając z jądra systemu hosta (jest lżejszy i startuje szybciej).
Efekt? Kontenery startują szybko, zajmują mniej miejsca i świetnie nadają się do testowania, uruchamiania aplikacji.
Kluczowe pojęcia związane z Dockerem i konteneryzacją
Docker ma kilka słów-kluczy, które na początku brzmią jak zaklęcia z podręcznika DevOpsu. Spokojnie – po 5 minutach to zaczyna mieć sens.
Dockerfile
Plik Dockerfile to skrypt będący instrukcją dotyczącą tworzenia obrazu Dockera. Jest w nim wszystko krok po kroku opisujące co wziąć, co zainstalować, co skopiować i jak uruchomić. Poniżej masz przykład pliku dockerfile wraz wyjaśnieniem co oznaczają poszczególne komendy.
FROM node:16
WORKDIR /app
COPY . /app
RUN npm install
CMD ["node", "app.js"]
FROM: Użyj oficjalnego środowiska uruchomieniowego node jako obrazu nadrzędnego.WORKDIR: Ustaw katalog roboczy w kontenerze.COPY: Skopiuj bieżącą zawartość katalogu do kontenera w /app.RUN: Zainstaluj wszystkie niezbędne pakiety.CMD: Uruchom app.py po uruchomieniu kontenera.
Image (obraz)
Obraz Dockera to szablon stworzony z pliku dockerfile. Ma w sobie wszystko, co jest potrzebne do uruchomienia aplikacji, między innymi kod źródłowy, zależności, pliki konfiguracyjne. Jeszcze nie działa ale wszystko jest przygotowane i gotowe do użycia.
Container (kontener)
Kontener Dockera to działająca instancja obrazu Dockera. W kontenerze uruchomiona jest aplikacja, która ma własny system plików, ustawienia sieci i przestrzeń dyskową. Uruchamia się tak samo na każdym komputerze.
Docker Hub
To internetowy rejestr najczęściej używanych obrazów kontenerów dockera. To miejsce, gdzie możesz znaleźć, pobrać i udostępnić** obrazy Dockera. Najprościej: to taki „GitHub dla obrazów Docker”.
Docker Compose
Docker Compose to narzędzie do definiowania i uruchamiania aplikacji wielokontenerowych za pomocą jednego pliku YAML i kilku prostych komend, którymi uruchamiasz wszystkie aplikacje z pliku.
Jak wygląda workflow podczas pracy z dockerem

1) Pull
Potrzebujesz Postgresa, Redisa albo Nginxa? Najczęściej nie kombinujesz i nie budujesz tego sam. Po prostu pobierasz gotowy obraz z registry (np. Docker Hub) i odpalasz kontener. To jest jak instalacja aplikacji, tylko zamiast instalować w systemie dostajesz izolowane pudełko.
2) Build
Masz swój kod? To robisz własne pudełko. Opisujesz w Dockerfile wszystko co należy zainstalować, skonfigurować i uruchomić a następnie Docker na podstawie tego buduje obraz czyli gotową paczkę. Taki obraz odpala się na każdym komputerze tak samo.
3) Run
Obraz sam z siebie nie działa. Dopiero gdy go uruchomisz, powstaje kontener (czyli aplikacja faktycznie startuje.
Uruchamiając kontener, zwykle ustawiasz rzeczy takie jak:
- porty (żeby wejść przez przeglądarkę),
- zmienne środowiskowe,
- dane w volume (żeby nie znikały po restarcie).
4) Push
Gdy obraz jest gotowy, możesz go chcieć się nim podzielić. Możesz to zrobić wrzucając go do rejestru publicznego albo firmowego. Zamiast wysyłać komuś listę „zainstaluj to i tamto”, wysyłasz po prostu gotowy obraz.