
Grzegorz Kalmus
Autor
Docker zmienił sposób, w jaki programiści tworzą, testują i wdrażają aplikacje. Jeśli słyszałeś już hasło konteneryzacja, ale nie wiesz, jak zacząć – ten artykuł jest dla Ciebie. Wyjaśnimy, czym jest Docker, dlaczego web developerzy go pokochali i jak go używać w codziennej pracy przy tworzeniu stron internetowych.
Co to jest Docker i konteneryzacja?
Docker to platforma do uruchamiania aplikacji w izolowanych środowiskach zwanych kontenerami. Kontener to lekka, przenośna jednostka, która zawiera aplikację oraz wszystkie jej zależności – biblioteki, runtime, konfiguracje – spakowane razem.
Kluczowa różnica między kontenerem a maszyną wirtualną (VM):
- Maszyna wirtualna: emuluje cały sprzęt i własny system operacyjny, zużywa gigabajty RAM, uruchamia się minutami
- Kontener Docker: współdzieli jądro systemu operacyjnego hosta, waży megabajty, startuje w sekundy
Wyobraź sobie kontener jak standardowy kontener frachtowy na statku – niezależnie od tego, co jest w środku, pasuje do każdego portu i każdego statku. Twoja aplikacja w kontenerze działa tak samo na laptopie dewelopera, serwerze CI/CD i maszynie produkcyjnej.
Pełna dokumentacja platformy dostępna jest na docs.docker.com.
Dlaczego web developerzy używają Dockera?
Każdy programista zna ten scenariusz: aplikacja działa doskonale na Twoim laptopie, ale na serwerze lub komputerze kolegi się sypie. „Works on my machine” to klasyczny, bolesny problem w świecie programowania. Docker eliminuje ten problem całkowicie.
Inne powody, dla których Docker jest popularny wśród web developerów:
- Izolacja projektów: każdy projekt ma własne wersje PHP, Node.js, MySQL – bez konfliktów
- Łatwy onboarding: nowy developer klonuje repo i uruchamia docker-compose up – gotowe
- Parytet środowisk: dev, staging i produkcja działają identycznie
- Szybkie czyszczenie: nie brudzisz systemu globalnie instalowanymi pakietami
- Współpraca: cały zespół korzysta z tych samych wersji narzędzi
Kluczowe pojęcia Dockera
Image (obraz)
Image to szablon, z którego tworzone są kontenery. Jest niezmienna – po stworzeniu nie zmienia się. Możesz pobrać gotowe obrazy z Docker Hub lub zbudować własny za pomocą Dockerfile. Przykłady popularnych obrazów: nginx, node:20, php:8.3-fpm, mysql:8.0, wordpress.
Container (kontener)
Kontener to uruchomiona instancja obrazu. Możesz uruchomić wiele kontenerów z jednego obrazu. Kontenery są izolowane od siebie i od hosta, ale mogą komunikować się przez zdefiniowane porty i wolumeny.
Dockerfile
Dockerfile to plik tekstowy z instrukcjami budowania własnego obrazu Docker. Każda instrukcja tworzy nową warstwę obrazu:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["node", "server.js"]
Docker Compose
Docker Compose to narzędzie do definiowania i uruchamiania wielokontenerowych aplikacji. Konfiguracja w pliku docker-compose.yml definiuje wszystkie usługi, sieci i wolumeny naraz.
Praktyczny przykład: WordPress z docker-compose
To jeden z najpopularniejszych przypadków użycia Dockera dla web developerów. Zamiast instalować PHP, MySQL i konfigurować serwer lokalnie – uruchamiasz wszystko jedną komendą.
Plik docker-compose.yml dla WordPressa:
version: "3.8"
services:
db:
image: mysql:8.0
container_name: wp_db
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_pass_secure
MYSQL_ROOT_PASSWORD: root_pass_secure
volumes:
- db_data:/var/lib/mysql
networks:
- wp_network
wordpress:
image: wordpress:6.4-php8.2-apache
container_name: wp_app
restart: unless-stopped
depends_on:
- db
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: wp_pass_secure
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DEBUG: "1"
volumes:
- wp_data:/var/www/html
- ./wp-content:/var/www/html/wp-content
networks:
- wp_network
phpmyadmin:
image: phpmyadmin:latest
container_name: wp_phpmyadmin
restart: unless-stopped
depends_on:
- db
ports:
- "8081:80"
environment:
PMA_HOST: db
networks:
- wp_network
volumes:
db_data:
wp_data:
networks:
wp_network:
driver: bridge
Uruchomienie: docker-compose up -d
Po chwili masz działającego WordPressa pod adresem http://localhost:8080 i phpMyAdmin pod http://localhost:8081. Koniec z instalowaniem XAMPP czy WAMP.
Kontener Node.js i Next.js
Przy tworzeniu stron internetowych opartych o Next.js, Docker pozwala zreplikować środowisko produkcyjne lokalnie. Oto Dockerfile dla aplikacji Next.js z multi-stage build:
# Etap 1: instalacja zaleznosci
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci
# Etap 2: budowanie aplikacji
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# Etap 3: minimalny obraz produkcyjny
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
Multi-stage build pozwala zbudować aplikację w pełnym środowisku, a do produkcji wysłać tylko minimalny obraz – bez narzędzi deweloperskich, kodu źródłowego ani zbędnych zależności. Finalny obraz może ważyć kilkukrotnie mniej niż naiwnie zbudowany.
Uruchamianie wielu projektów bez konfliktów
Jeden z największych problemów lokalnego developmentu: projekt A wymaga Node.js 16 i MySQL 5.7, projekt B – Node.js 20 i MySQL 8.0, projekt C – PHP 7.4 i PostgreSQL. Bez Dockera zarządzanie tym to koszmar.
Z Dockerem każdy projekt ma własny docker-compose.yml i działa całkowicie niezależnie. Możesz uruchomić je jednocześnie na różnych portach albo zatrzymywać i uruchamiać wedle potrzeb:
# Uruchom projekt A
cd projekt-a && docker-compose up -d
# Uruchom projekt B (inne wersje narzedzi - brak konfliktu)
cd projekt-b && docker-compose up -d
# Zatrzymaj projekt A gdy nie uzywasz
cd projekt-a && docker-compose down
Docker Hub – repozytorium obrazów
Docker Hub to publiczne repozytorium obrazów Docker. Znajdziesz tam oficjalne obrazy dla praktycznie każdego narzędzia: bazy danych (MySQL, PostgreSQL, MongoDB, Redis), serwery WWW (Nginx, Apache), języki programowania (Node.js, PHP, Python, Go), CMS-y (WordPress, Ghost) i setki tysięcy obrazów społeczności.
Możesz też przechowywać własne prywatne obrazy – przydatne w projektach komercyjnych, gdzie kod nie powinien być publiczny.
Docker i CI/CD – automatyzacja z GitHub Actions
Docker świetnie integruje się z potokami CI/CD. Oto przykład GitHub Actions, który buduje obraz Docker i wdraża aplikację:
name: Deploy to Production
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: myuser/myapp:latest
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
docker pull myuser/myapp:latest
docker-compose up -d
Taki pipeline automatycznie buduje i wdraża aplikację po każdym pushu do gałęzi main. Więcej przykładów znajdziesz w oficjalnym repozytorium Docker na GitHubie.
Docker Desktop vs alternatywy dla macOS
Na macOS Docker nie działa natywnie i wymaga warstwy wirtualizacji. Masz kilka opcji:
- Docker Desktop: Oficjalny klient z GUI. Prosty w instalacji i obsłudze. Bezpłatny dla osobistego użytku i małych firm (do 250 pracowników). Duże firmy muszą płacić.
- Colima: Open-source alternatywa dla Docker Desktop. Działa w terminalu, lżejszy i szybszy. Polecany dla doświadczonych deweloperów.
- Podman Desktop: Alternatywa od Red Hat, kompatybilna z Docker CLI, działa bez stałego daemona w tle.
- OrbStack: Płatna alternatywa (ok. 8 USD/miesiąc), znana z najlepszej wydajności na Apple Silicon.
Tips wydajnościowe dla macOS
Docker na macOS bywa wolniejszy niż na Linuksie przez warstwę wirtualizacji. Kilka sposobów na przyspieszenie:
- Używaj named volumes zamiast bind mounts: named volumes są obsługiwane wewnątrz VM, bind mounts wymagają synchronizacji
- VirtioFS: Nowoczesny system plików w Docker Desktop, znacznie szybszy niż poprzednie rozwiązania
- Ogranicz RAM dla Docker: w ustawieniach Docker Desktop ustaw rozsądny limit, np. 4-6 GB
- Wyłączaj nieużywane kontenery: docker-compose down dla projektów, na których aktualnie nie pracujesz
- Czyść stare obrazy regularnie: docker system prune -a usuwa nieużywane zasoby
Przydatne komendy Docker – ściągawka
# Uruchom kontener w tle
docker run -d -p 8080:80 nginx
# Listuj uruchomione kontenery
docker ps
# Listuj dostepne obrazy
docker images
# Wejdz do powloki kontenera
docker exec -it nazwa_kontenera bash
# Pokazuj logi na zywo
docker logs -f nazwa_kontenera
# Zatrzymaj kontener
docker stop nazwa_kontenera
# Buduj wlasny obraz
docker build -t moja-aplikacja:latest .
# Wyczysc nieuzywane zasoby
docker system prune -a
Kiedy Docker to zły wybór?
Docker nie jest rozwiązaniem na wszystko. Są sytuacje, gdy dodaje zbędną złożoność:
- Proste strony statyczne: HTML, CSS, JavaScript bez backendu nie potrzebują Dockera
- Gdy używasz managed services: jeśli baza danych to Planetscale lub Supabase, a hosting to Vercel – Docker może być zbędny
- Małe projekty jednej osoby: overhead konfiguracji może nie być opłacalny
- Gdy zespół nie zna Dockera: nauka wymaga czasu, a błędy w konfiguracji potrafią frustrować
- Bardzo ograniczone zasoby serwera: Docker sam w sobie zużywa trochę RAM i CPU
Podsumowanie
Docker to narzędzie, które po raz pierwszy w karierze sprawia, że „działa u mnie” oznacza też „działa wszędzie”. Dla web developerów największe korzyści to:
- Izolacja projektów – koniec z konfliktami wersji
- Łatwy lokalny WordPress i inne CMS-y bez instalowania stosu LAMP
- Parytet środowisk – dev = staging = produkcja
- Automatyzacja wdrożeń przez CI/CD
- Szybki onboarding nowych deweloperów
Zaczynaj od docker-compose dla lokalnego developmentu, a gdy poczujesz się komfortowo – przejdź do wieloetapowych buildów i integracji z GitHub Actions.
Planujesz projekt webowy i zależy Ci na nowoczesnym stosie technologicznym? Skontaktuj się z nami – tworzymy strony i aplikacje z użyciem aktualnych najlepszych praktyk deweloperskich.

