Docker zrewolucjonizował sposób, w jaki deweloperzy i administratorzy systemów wdrażają aplikacje, dostarczając lekką platformę konteneryzacyjną, która zapewnia spójność między różnymi środowiskami.
Ten kompleksowy artykuł szczegółowo omawia instalację, konfigurację i praktyczne użycie Dockera na Ubuntu – od pierwszego uruchomienia po zaawansowane praktyki konteneryzacyjne. Obejmuje on instalację na Ubuntu 20.04 i Ubuntu 24.04 LTS, konfigurację uprawnień użytkownika, podstawowe pojęcia (obrazy i kontenery), tworzenie obrazów przez Dockerfile, Docker Compose do orkiestracji wielu kontenerów, konfigurację sieci, najlepsze praktyki bezpieczeństwa oraz rozwiązywanie typowych problemów.
Przygotowanie systemu i instalacja Dockera na Ubuntu
Przed rozpoczęciem instalacji Dockera właściwe przygotowanie systemu zapewnia płynne wdrożenie i optymalną wydajność. Upewnij się, że system jest aktualny, ma włączone repozytoria przez HTTPS oraz poprawnie skonfigurowane klucze GPG.
Wymagania systemowe i przygotowanie systemu
Poniżej zebrano minimalne wymagania oraz niezbędne warunki wstępne:
- architektura 64-bit,
- co najmniej 4 GB RAM,
- wystarczająca ilość przestrzeni dyskowej na obrazy i kontenery,
- kernel Ubuntu ≥ 3.10 (spełniają go współczesne wydania LTS),
- uprawnienia sudo do instalacji i konfiguracji.
Aby zaktualizować system i zainstalować pakiety wstępne, wykonaj kolejno:
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
Dodanie oficjalnego repozytorium Dockera
Dodanie repozytorium i klucza GPG zapewnia integralność oraz autentyczność pobieranych pakietów. Wykonaj następujące polecenia:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
Instalacja komponentów Docker Engine
Po dodaniu repozytorium zainstaluj silnik i zalecane wtyczki:
- docker-ce – silnik Docker (Docker Engine) dostarczający demona dockerd;
- docker-ce-cli – narzędzia wiersza poleceń do zarządzania Dockerem;
- containerd.io – runtime odpowiedzialny za uruchamianie kontenerów;
- docker-buildx-plugin – nowoczesny mechanizm budowania obrazów (BuildKit);
- docker-compose-plugin – wtyczka Docker Compose do orkiestracji wielu usług.
Wykonaj instalację oraz test „hello-world” potwierdzający poprawną komunikację klienta z demonem:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run --rm hello-world
Komunikat powitalny potwierdza, że klient komunikuje się z demonem, a środowisko Docker działa prawidłowo.
Konfiguracja uprawnień użytkownika
Domyślnie polecenia Dockera wymagają sudo. Możesz uprościć pracę, dodając użytkownika do grupy docker (pamiętaj o konsekwencjach bezpieczeństwa):
sudo usermod -aG docker $USER
# ponowne zalogowanie lub:
newgrp docker
# dodanie innego użytkownika (zastąp nazwą):
sudo usermod -aG docker nazwa_uzytkownika
Wygoda kontra bezpieczeństwo: członkostwo w grupie docker de facto daje uprawnienia roota na hoście (np. przez montowanie wolumenów). Wielu ekspertów rekomenduje pozostać przy sudo lub użyć trybu rootless.
Konfiguracja automatycznego uruchamiania
Aby Docker startował wraz z systemem i udostępniał kontenery po restarcie, użyj poleceń systemd:
systemctl is-enabled docker
sudo systemctl enable docker
sudo systemctl start docker
systemctl status docker
Fundamenty Dockera – obrazy, kontenery i architektura
Docker wykorzystuje mechanizmy jądra Linux – namespaces i cgroups – aby izolować procesy oraz limitować zużycie zasobów.
Obrazy Dockera i ich struktura
Obraz Dockera to niemodyfikowalny szablon z kodem, bibliotekami i konfiguracją. Warstwowa architektura poprawia wydajność i oszczędza miejsce dzięki współdzieleniu cache i baz.
Kontenery jako instancje obrazów
Kontener to działająca instancja obrazu z zapisywalną warstwą, która znika przy usunięciu kontenera, o ile dane nie są utrwalone w wolumenach.
Cykl życia kontenera i zarządzanie stanem
Najważniejsze stany i ich znaczenie:
- created – utworzono zasoby, ale nie uruchomiono procesu;
- running – działa proces PID 1, kontener przetwarza żądania;
- stopped – proces główny zakończony, kontener zatrzymany;
- paused – procesy wstrzymane bez ich zamykania;
- removed – zasoby kontenera zwolnione z hosta.
Polityki restartu, które warto znać:
- no – brak automatycznego restartu;
- always – wznawia kontener także po restarcie demona;
- unless-stopped – wznawia, o ile nie został ręcznie zatrzymany;
- on-failure – restartuje tylko przy kodzie wyjścia ≠ 0.
Budowanie obrazów Dockera za pomocą Dockerfile
Efektywny Dockerfile minimalizuje rozmiar, zwiększa bezpieczeństwo i przyspiesza wdrożenia. Poniżej zestawienie kluczowych instrukcji:
- FROM – wybiera obraz bazowy (np. Alpine, Ubuntu);
- RUN – wykonuje komendy podczas budowania (instalacje, konfiguracje);
- COPY/ADD – kopiuje pliki do obrazu (preferuj COPY);
- WORKDIR – ustawia katalog roboczy dla kolejnych kroków;
- ENV/ARG – zmienne środowiskowe i parametry budowania;
- EXPOSE – dokumentuje porty używane przez aplikację;
- ENTRYPOINT/CMD – definiuje proces startowy i argumenty;
- USER – określa użytkownika do uruchamiania procesu;
- LABEL – dodaje metadane (np. zgodne z OCI).
Optymalizacja obrazów i wieloetapowe budowanie
Wieloetapowe budowanie (multi-stage) pozwala kompilować w etapie builder i kopiować artefakty do minimalnego runtime (np. Alpine lub scratch), co znacząco redukuje rozmiar.
Dbaj o cache: kopiuj najpierw zależności (np. package.json) i instaluj je przed dodaniem reszty kodu, aby niepotrzebnie nie unieważniać wcześniejszych warstw. Korzystaj z .dockerignore, aby zredukować kontekst.
Najlepsze praktyki bezpieczeństwa w Dockerfile
Uruchamiaj procesy jako użytkownik nie-root (instrukcja USER) i używaj minimalnych baz. Nie umieszczaj sekretów w Dockerfile – przekaż je w runtime (secrets/ENV). Regularnie skanuj obrazy (np. Snyk) i aktualizuj zależności.
Zarządzanie kontenerami i podstawowe operacje
Poniższe polecenia przydadzą się w codziennej pracy z kontenerami:
- docker run – tworzy i startuje kontener (np. -d w tle, -it interaktywnie);
- docker ps – listuje działające kontenery (-a pokaże również zatrzymane, -q same ID);
- docker stop/kill – łagodnie lub natychmiast zatrzymuje proces;
- docker rm – usuwa kontenery (z -f w razie potrzeby);
- docker exec – uruchamia proces w działającym kontenerze (np. /bin/bash);
- docker logs – podgląd logów (-f śledzenie na żywo).
Dla szybkiego debugowania użyj powłoki w kontenerze:
docker run -it --rm --name debug --entrypoint /bin/sh alpine
# lub, dla obrazu z bash:
docker run -it --rm ubuntu /bin/bash
Zarządzanie wolumenami i przechowywaniem danych
Dane w kontenerze są efemeryczne – utrwalaj je w wolumenach lub bind mountach. Przydatne polecenia:
docker volume create data
docker volume ls
docker volume inspect data
# montowanie przy tworzeniu kontenera:
docker run -d -v data:/app/data --name app myimage:1.0.0
# bind mount (pełna ścieżka hosta):
docker run -d -v /home/user/app:/app --name dev-app myimage:dev
Docker Compose – orkiestracja aplikacji wielokontenerowych
Docker Compose upraszcza start wielu usług, definiując je w pliku YAML wraz z sieciami, wolumenami i zależnościami.
Struktura i składnia docker-compose.yml
Najczęściej używane pola w definicji usługi to:
- image/build – wskazuje obraz lub kroki budowania;
- ports – mapowanie portów w formacie HOST:KONTENER;
- environment/env_file – zmienne środowiskowe;
- volumes – wolumeny i bind mounty;
- restart – polityka restartu kontenera.
Compose automatycznie tworzy sieć bridge, a usługi komunikują się po nazwach (wbudowany DNS). Zmienne i argumenty builda możesz dostarczyć przez env_file i args.
Używanie Docker Compose do wdrażania aplikacji
Podstawowe polecenia do pracy z Compose:
# uruchomienie w trybie interaktywnym lub w tle:
docker compose up
docker compose up -d
# skalowanie poziome:
docker compose up --scale web=3 -d
# zatrzymanie i usunięcie zasobów:
docker compose down
docker compose down --volumes # ostrożnie – usuwa dane
# podgląd logów (na żywo):
docker compose logs -f
Konfiguracja sieci Dockera i komunikacja między kontenerami
Różne sterowniki sieci odpowiadają różnym scenariuszom izolacji, wydajności i łączności. Poniżej praktyczne porównanie:
| Sterownik | Izolacja | Wydajność | Typowe zastosowania |
|---|---|---|---|
| bridge | izolacja na hoście | wysoka | samodzielne aplikacje, lokalne usługi |
| host | brak izolacji sieciowej | najwyższa | monitoring, niskie opóźnienia, aplikacje sieciowe |
| none | pełna izolacja (brak sieci) | — | zadania offline, batch |
| overlay | między hostami | średnia | klastry (np. Docker Swarm) |
| macvlan/ipvlan | jak urządzenia w sieci LAN | wysoka | integracja z istniejącą infrastrukturą sieciową |
Publikacja i mapowanie portów
Aby wystawić usługę poza hosta, zmapuj porty kontenera na porty hosta:
# przykład: publikacja usługi HTTP na porcie 8080 hosta
docker run -d -p 8080:80 --name web nginx:stable
# EXPOSE dokumentuje porty w obrazie, ale ich nie publikuje:
# publikacja następuje zawsze explicite przez -p lub w Compose (ports)
Różnica między EXPOSE a -p: EXPOSE to dokumentacja w obrazie, a -p/[ports] faktycznie publikuje porty.
Bezpieczeństwo Dockera i najlepsze praktyki produkcyjne
Kieruj się zasadą najmniejszych uprawnień: minimalne obrazy, procesy bez roota, dostęp jedynie do niezbędnych zasobów.
Uprawnienia użytkownika i izolacja procesów
Procesy jako root w kontenerze zwiększają ryzyko. Twórz użytkownika nie-root (USER) i, gdy to możliwe, włącz user namespaces dla dodatkowej izolacji UID 0 od hosta.
Ograniczenia zasobów i zarządzanie wydajnością
Najważniejsze limity i ich rola:
- –memory/-m – twardy limit pamięci (przekroczenie skutkuje OOM);
- –memory-reservation – miękki limit preferencyjnego zużycia RAM;
- –cpus – ogranicza łączny czas CPU dla kontenera;
- –cpu-shares – względny priorytet CPU wobec innych kontenerów;
- –cpuset-cpus – przypisanie do wybranych rdzeni CPU.
Monitorowanie i logowanie
Domyślny sterownik logów to json-file. Kontroluj rotację logów, aby uniknąć zapełnienia dysku, oraz rozważ alternatywy (syslog, Fluentd, chmura). Przydatne polecenia:
docker logs -f --tail=200 NAZWA_KONTENERA
docker stats
# przykładowa konfiguracja rotacji (uruchomienie):
docker run -d --log-driver=json-file --log-opt max-size=10m --log-opt max-file=5 myimage
Zaawansowane zarządzanie obrazami i rejestry
Konsekwentne tagowanie (np. semver) i praca z rejestrami upraszczają dystrybucję oraz rollbacki.
Znaczenie tagów vs. etykiet (labels)
Unikaj polegania na latest – taguj obrazy jawnie wersjami. Dodawaj LABEL, np. zgodne z OCI, aby utrwalić metadane obrazu.
Publikacja obrazów i zarządzanie rejestrami
Aby opublikować obraz do Docker Hub lub prywatnego rejestru, zaloguj się i wypchnij obraz:
docker login
docker tag myimage:1.2.3 myrepo/myimage:1.2.3
docker push myrepo/myimage:1.2.3
Wybieraj bazy z rodziny Docker Official Images lub obrazy utwardzone – regularnie łatane i skanowane.
Oczyszczanie nieużywanych obrazów i zasobów
Docker nie usuwa nieużywanych zasobów automatycznie. Poniższe polecenia pomogą utrzymać porządek:
# całościowe sprzątanie (bez wolumenów):
docker system prune -f
# włącznie z wolumenami (nieodwracalne):
docker system prune -a --volumes -f
# selektywnie:
docker image prune -a -f
docker container prune -f
docker volume prune -f
docker network prune -f
# z filtrami czasu:
docker image prune -a --filter "until=24h"
Rozwiązywanie problemów i debugowanie
Szybka diagnoza i właściwa interpretacja błędów skracają czas naprawy i minimalizują przestoje.
Typowe błędy instalacji i konfiguracji
Komunikat o braku połączenia z demonem Dockera oznacza najczęściej, że usługa nie działa lub są problemy z uprawnieniami:
Cannot connect to the Docker daemon
sudo systemctl restart docker
systemctl status docker
journalctl -u docker --no-pager -n 200
Odmowa dostępu bez sudo zwykle wskazuje na brak członkostwa w grupie docker lub konieczność odświeżenia sesji:
Permission denied
groups
newgrp docker # lub wyloguj/zaloguj ponownie
Diagnostyka problemów z kontenerami
Do analizy niedziałających usług użyj logów i inspekcji konfiguracji:
docker logs -f NAZWA_KONTENERA
docker inspect NAZWA_KONTENERA | less
Konflikt portów wykryjesz poleceniem sieciowym, a następnie zmienisz mapowanie:
# sprawdź, kto używa portu:
sudo ss -tulpen | grep :8080
# zmień mapowanie na wolny port:
docker run -d -p 8081:80 --name web nginx
Braki pamięci (OOM) rozwiąż, zwiększając limity lub optymalizując aplikację:
docker stats
docker run -d --memory=512m --cpus=1 myimage
Najlepsze praktyki debugowania
W codziennej diagnostyce pomogą poniższe techniki:
- interaktywny dostęp – docker exec -it NAZWA_KONTENERA /bin/bash;
- porównanie stanu – docker diff (zmiany w systemie plików względem obrazu);
- inspekcja konfiguracji – docker inspect (montowania, ENV, limity zasobów);
- reprodukcja warunków – uruchamiaj z identycznymi zmiennymi, limitami i wolumenami.








