Spis treści 13 sekcji
  1. Czym jest Docker i dlaczego wszyscy o nim mówią?
  2. Kontener vs maszyna wirtualna
  3. Podstawowe pojęcia
  4. Instalacja Docker
  5. Pierwszy kontener - od zera do działającej aplikacji
  6. Dockerfile - budowanie własnego obrazu
  7. Docker Compose - multi-container applications
  8. Best practices Dockerfile
  9. Docker na AWS
  10. Docker w codziennej pracy Cloud Engineera
  11. Najczęstsze błędy początkujących
  12. Najczęściej zadawane pytania (FAQ)
  13. Następny krok
TL;DR
  • Kontener Docker to izolowany proces z wszystkimi zależnościami - działa identycznie na każdym środowisku
  • Dockerfile to przepis na obraz - definiujesz system, biblioteki i aplikację krok po kroku
  • Docker Compose pozwala uruchamiać wiele kontenerów jednym poleceniem (np. app + baza + Redis)
  • Na AWS kontenery wdrażasz przez ECR + ECS Fargate lub EKS
  • Każdy Cloud Engineer musi znać Dockera - to standard w 2026

Czym jest Docker i dlaczego wszyscy o nim mówią?

Docker to platforma do konteneryzacji aplikacji. Kontener to lekkie, izolowane środowisko, które zawiera aplikację i WSZYSTKIE jej zależności - system operacyjny, biblioteki, runtime, konfigurację. Dzięki temu aplikacja działa identycznie na Twoim laptopie, serwerze testowym i produkcji.

Słynne "u mnie działa" przestaje istnieć. Jeśli kontener działa na Twoim komputerze - zadziała wszędzie.

Docker to must-have w CV Cloud Engineera. W 2026 praktycznie każda oferta pracy DevOps/Cloud wymaga znajomości Dockera. Z mojego doświadczenia - nie wyobrażam sobie dnia pracy bez Dockera. Używam go do lokalnego developmentu, testowania infrastruktury i pakowania aplikacji na AWS. W tym artykule nauczysz się podstaw - od instalacji po stworzenie własnego kontenera.

Kontener vs maszyna wirtualna

Kontenery są często porównywane do VM (Virtual Machines), ale to fundamentalnie różne technologie:

CechaKontener (Docker)VM (EC2, VirtualBox)
RozmiarMegabajty (10-500 MB)Gigabajty (1-20 GB)
Czas startuSekundyMinuty
IzolacjaWspółdzieli kernel hostaPełna izolacja (własny kernel)
WydajnośćBliska natywnejOverhead hiperwizora
GęstośćSetki na hościeKilka-kilkanaście na hoście
OSTylko Linux (na Linuxie)Dowolny

Kontener to nie "lżejsza VM". Kontener to izolowany proces, który współdzieli kernel z hostem. Dlatego jest tak szybki i lekki.

Podstawowe pojęcia

  • Image (obraz) - szablon/przepis na kontener. Zawiera OS, biblioteki, aplikację. Immutable (nie zmienia się)
  • Container (kontener) - uruchomiona instancja image. Można go startować, stopować, usuwać
  • Dockerfile - plik tekstowy z instrukcjami budowy image. Przepis krok po kroku
  • Docker Hub - publiczne repozytorium gotowych obrazów (nginx, python, node, postgres)
  • Registry - miejsce przechowywania obrazów (Docker Hub, AWS ECR, GitHub Container Registry)
  • Volume - trwały storage dla danych kontenera (dane przeżywają restart)

Instalacja Docker

# Linux (Ubuntu/Debian)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Wyloguj się i zaloguj ponownie

# Sprawdź instalację
docker --version
docker run hello-world

Na Windows/Mac - zainstaluj Docker Desktop z oficjalnej strony Docker.

Pierwszy kontener - od zera do działającej aplikacji

# Uruchom serwer Nginx
docker run -d -p 80:80 nginx

# Co się stało:
# 1. Docker pobrał obraz "nginx" z Docker Hub
# 2. Stworzył kontener z tego obrazu
# 3. Uruchomił go w tle (-d = detached)
# 4. Zmapował port 80 kontenera na port 80 hosta (-p 80:80)

Otwórz przeglądarkę na http://localhost - widzisz stronę Nginx! Jeden command i masz serwer web.

Podstawowe komendy Docker

# Lista działających kontenerów
docker ps

# Lista WSZYSTKICH kontenerów (włącznie z zatrzymanymi)
docker ps -a

# Zatrzymanie kontenera
docker stop CONTAINER_ID

# Usunięcie kontenera
docker rm CONTAINER_ID

# Lista pobranych obrazów
docker images

# Usunięcie obrazu
docker rmi IMAGE_ID

# Logi kontenera
docker logs CONTAINER_ID

# Wejście do kontenera (interaktywny shell)
docker exec -it CONTAINER_ID /bin/bash

Dockerfile - budowanie własnego obrazu

Dockerfile to przepis na obraz Docker. Przykład dla prostej aplikacji Python:

# Dockerfile
FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["python", "app.py"]

Każda linia Dockerfile to warstwa (layer). Docker cache'uje warstwy - jeśli `requirements.txt` się nie zmienił, Docker nie instaluje ponownie zależności. Dlatego kopiujemy requirements PRZED kodem aplikacji.

Budowanie i uruchamianie

# Budowanie obrazu
docker build -t my-app:1.0 .

# Uruchomienie
docker run -d -p 8000:8000 my-app:1.0

# Tagowanie i push do registry
docker tag my-app:1.0 123456789012.dkr.ecr.eu-central-1.amazonaws.com/my-app:1.0
docker push 123456789012.dkr.ecr.eu-central-1.amazonaws.com/my-app:1.0

Docker Compose - multi-container applications

Realne aplikacje to więcej niż jeden kontener. Docker Compose pozwala zdefiniować całe środowisko w jednym pliku:

# docker-compose.yml
services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      - db
      - redis

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:
# Uruchomienie całego stacku
docker compose up -d

# Zatrzymanie
docker compose down

# Przebudowanie po zmianach kodu
docker compose up -d --build

Jedno polecenie i masz aplikację webową + bazę danych + Redis. Idealny workflow do developmentu. W projektach, które prowadziłem, Docker Compose to pierwszy plik, który tworzymy - dzięki niemu każdy nowy developer w zespole ma działające środowisko w 5 minut.

Best practices Dockerfile

Pro tip: Te 6 zasad to fundament profesjonalnych Dockerfile. W praktyce widzę, że większość problemów z kontenerami na produkcji wynika z ignorowania tych reguł.
  1. Używaj slim/alpine images - `python:3.12-slim` zamiast `python:3.12` (100 MB vs 900 MB)
  2. Multi-stage builds - buduj w jednym kontenerze, uruchamiaj w drugim (mniejszy obraz końcowy)
  3. Nie uruchamiaj jako root - dodaj `USER` w Dockerfile (użytkownika najpierw utwórz, np. `RUN adduser -D appuser`)
  4. .dockerignore - wyklucz .git, node_modules, __pycache__, .env
  5. Kopiuj zależności przed kodem - lepsze cache'owanie warstw
  6. Jeden proces per kontener - nie pakuj web servera i bazy do jednego kontenera
# Multi-stage build example (Go)
FROM golang:1.26 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o server .

FROM alpine:3.22
RUN adduser -D -u 10001 nonroot
COPY --from=builder /app/server /server
USER nonroot
CMD ["/server"]
# Obraz końcowy: ~15 MB zamiast ~1 GB

Docker na AWS

Docker to fundament konteneryzacji na AWS. Oto główne usługi:

UsługaCo robiKiedy użyć
ECRDocker registry na AWSPrzechowywanie Twoich obrazów
ECSOrchestracja kontenerów (AWS-native)Proste deploymenenty kontenerów
EKSZarządzany KubernetesDuże, złożone deploymenty
FargateServerless containersKontenery bez zarządzania serwerami
App RunnerNajprostszy deploymentSzybki start, zero konfiguracji
Info: Jeśli dopiero zaczynasz z kontenerami na AWS, zacznij od ECS Fargate - nie musisz zarządzać serwerami. EKS (Kubernetes) zostaw na później, gdy potrzebujesz większej kontroli.

Typowy flow: budujesz obraz Docker -> pushjesz do ECR -> uruchamiasz na ECS Fargate lub EKS.

# Push image do AWS ECR
# Jednorazowo: utwórz repozytorium
aws ecr create-repository --repository-name my-app --region eu-central-1

aws ecr get-login-password --region eu-central-1 | \
  docker login --username AWS --password-stdin 123456789012.dkr.ecr.eu-central-1.amazonaws.com

docker build -t my-app .
docker tag my-app:latest 123456789012.dkr.ecr.eu-central-1.amazonaws.com/my-app:latest
docker push 123456789012.dkr.ecr.eu-central-1.amazonaws.com/my-app:latest

Docker w codziennej pracy Cloud Engineera

Docker to nie tylko "uruchamianie aplikacji". Jako Cloud Engineer używasz go do:

  • Local development - docker compose daje każdemu w zespole identyczne środowisko
  • CI/CD - budowanie i testowanie w kontenerach (GitHub Actions, CodeBuild)
  • Packaging - pakowanie aplikacji do deploymentu na AWS (ECS, EKS)
  • Narzędzia - uruchamianie narzędzi DevOps w kontenerach (terraform, aws-cli, ansible)
  • Testowanie - testcontainers do integration testów z prawdziwą bazą/Redis

Najczęstsze błędy początkujących

Uwaga: Te błędy widuję regularnie nawet u doświadczonych developerów. Unikaj ich od samego początku:
  • Używanie :latest tag - zawsze taguj wersje jawnie (my-app:1.2.3). :latest jest nieprzewidywalny
  • Kopiowanie .env do obrazu - nigdy! Użyj environment variables lub secrets manager
  • Duże obrazy - używaj slim/alpine, multi-stage builds, .dockerignore
  • Running as root - dodaj USER w Dockerfile
  • Dane w kontenerze - kontener jest efemeryczny. Dane trzymaj w volumes lub zewnętrznym storage (S3, RDS)

Najczęściej zadawane pytania (FAQ)

Czy Docker jest potrzebny, jeśli używam Lambda/serverless?

Tak, Docker jest przydatny nawet w architekturze serverless. Lambda obsługuje obrazy kontenerowe, więc możesz deployować funkcje jako kontenery Docker. Ponadto Docker jest niezbędny do lokalnego developmentu (docker compose), testowania (testcontainers), CI/CD pipelines i uruchamiania narzędzi DevOps. W praktyce Docker to uniwersalne narzędzie niezależne od architektury docelowej.

Docker vs maszyna wirtualna - kiedy co wybrać?

Docker (kontenery) wybierz, gdy chcesz szybki start, lekkie izolowane środowiska i efektywne wykorzystanie zasobów. Maszyny wirtualne wybierz, gdy potrzebujesz pełnej izolacji kernela, uruchamiasz różne systemy operacyjne (np. Windows na Linuxie) lub masz wymogi compliance dotyczące izolacji. W chmurze AWS kontenery (ECS/EKS) działają na maszynach wirtualnych (EC2) - te technologie się uzupełniają.

Jak debugować problemy z kontenerami Docker?

Podstawowe narzędzia to: docker logs CONTAINER_ID (logi aplikacji), docker exec -it CONTAINER_ID /bin/bash (wejście do kontenera), docker inspect CONTAINER_ID (szczegóły konfiguracji), docker stats (zużycie CPU/RAM w czasie rzeczywistym). Przy problemach z siecią sprawdź docker network ls i docker port. Przy problemach z buildem używaj docker build z flagą --no-cache.

Czy Docker jest bezpieczny na produkcji?

Docker jest bezpieczny, gdy stosujesz best practices: nie uruchamiaj kontenerów jako root (USER w Dockerfile), używaj oficjalnych slim/alpine obrazów, skanuj obrazy pod kątem podatności (docker scout, Trivy), nie kopiuj sekretów do obrazu (użyj secrets managera), aktualizuj bazowe obrazy regularnie. Na AWS usługi zarządzane (ECS Fargate) dodają dodatkowe warstwy bezpieczeństwa.

Następny krok

Podstawy Linuxa przydadzą Ci się przy pracy z kontenerami - sprawdź 20 komend Linux dla Cloud Engineera.

Docker to pierwszy krok. Następny to Kubernetes (orchestracja kontenerów w skali) i usługi AWS (ECS, EKS, Fargate). Jeśli chcesz zobaczyć, jak Docker wpisuje się w szerszą ścieżkę kariery - przeczytaj Jak zostać Cloud Engineerem - roadmapa 2026. A jeśli interesuje Cię automatyzacja infrastruktury, w której Docker odgrywa kluczową rolę, sprawdź Terraform - Infrastructure as Code od podstaw.

Zacznij od praktyki - skonteneryzuj swój projekt i wdróż go na AWS. To najlepszy sposób na naukę.

Emil Kowalczyk

Pasjonat chmury i twórca CloudManiak.pl. Na co dzień MSP Engineer w amerykańskiej firmie ClearScale (AWS Premier Tier Partner). Pomagam osobom wchodzącym do świata chmury zdobywać wiedzę i certyfikaty.