Spis treści 13 sekcji
- Czym jest Docker i dlaczego wszyscy o nim mówią?
- Kontener vs maszyna wirtualna
- Podstawowe pojęcia
- Instalacja Docker
- Pierwszy kontener - od zera do działającej aplikacji
- Dockerfile - budowanie własnego obrazu
- Docker Compose - multi-container applications
- Best practices Dockerfile
- Docker na AWS
- Docker w codziennej pracy Cloud Engineera
- Najczęstsze błędy początkujących
- Najczęściej zadawane pytania (FAQ)
- Następny krok
- 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:
| Cecha | Kontener (Docker) | VM (EC2, VirtualBox) |
|---|---|---|
| Rozmiar | Megabajty (10-500 MB) | Gigabajty (1-20 GB) |
| Czas startu | Sekundy | Minuty |
| Izolacja | Współdzieli kernel hosta | Pełna izolacja (własny kernel) |
| Wydajność | Bliska natywnej | Overhead hiperwizora |
| Gęstość | Setki na hoście | Kilka-kilkanaście na hoście |
| OS | Tylko 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
- Używaj slim/alpine images - `python:3.12-slim` zamiast `python:3.12` (100 MB vs 900 MB)
- Multi-stage builds - buduj w jednym kontenerze, uruchamiaj w drugim (mniejszy obraz końcowy)
- Nie uruchamiaj jako root - dodaj `USER` w Dockerfile (użytkownika najpierw utwórz, np. `RUN adduser -D appuser`)
- .dockerignore - wyklucz .git, node_modules, __pycache__, .env
- Kopiuj zależności przed kodem - lepsze cache'owanie warstw
- 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ługa | Co robi | Kiedy użyć |
|---|---|---|
| ECR | Docker registry na AWS | Przechowywanie Twoich obrazów |
| ECS | Orchestracja kontenerów (AWS-native) | Proste deploymenenty kontenerów |
| EKS | Zarządzany Kubernetes | Duże, złożone deploymenty |
| Fargate | Serverless containers | Kontenery bez zarządzania serwerami |
| App Runner | Najprostszy deployment | Szybki start, zero konfiguracji |
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
- 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ę.
