"Works on my machine" je 2026 izgovor koji nitko ne prihvaća. Docker rješava taj problem — svaki developer pokreće isto okruženje, deployovi reproducibilni, dependencies izolirani. Ovo je praktičan vodič što Docker je, kada ga koristit, i kako početi za PHP/Node/Laravel/Craft projekte.
Što je Docker
Docker = kontejnerizacija. Aplikacija + sve dependencies (OS biblioteke, runtime, config) pakovani u image. Image se pokreće kao container — isolated process na host serveru.
Kontejner nije VM. Dijeli kernel s host-om, ali file system, network, process space su izolirani.
Osnovne pojmove
- Image — template (npr.
php:8.2-fpm). Read-only. - Container — instanca image-a, running process.
- Dockerfile — instrukcije kako build-at image.
- docker-compose.yml — definira multi-container app (web + DB + Redis + queue).
- Volume — persistentni storage izvan containera.
- Network — virtualna mreža za container-to-container komunikaciju.
- Registry — gdje se images čuvaju (Docker Hub, GitHub Container Registry, self-host).
Zašto koristit Docker
- Reproducibilni dev environment — svi developeri pokreću identičnu PHP/Node/MySQL verziju. Nema "meni radi".
- Onboarding novih developera —
git clone && docker-compose up, gotovo. Ne treba 4h za setup XAMPP-a. - Više projekata, različite PHP verzije — projekt A na PHP 8.1, projekt B na PHP 8.3. Bez konflikta.
- Production parity — dev container isti kao production container. Manje surprise bugova.
- Microservices — svaki service u svom container-u, neovisan deploy.
- CI/CD — GitHub Actions, GitLab CI, Drone — sve native koristi Docker.
Praktičan setup — Laravel projekt
Dockerfile
FROM php:8.2-fpm-alpine
RUN apk add --no-cache \
libpng-dev libzip-dev mysql-client \
&& docker-php-ext-install pdo_mysql gd zip bcmath
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
COPY . .
RUN composer install --no-dev --optimize-autoloader
CMD ["php-fpm"]
docker-compose.yml
version: '3.8'
services:
app:
build: .
volumes:
- .:/var/www
depends_on: [db, redis]
environment:
DB_HOST: db
REDIS_HOST: redis
nginx:
image: nginx:alpine
ports: ['8080:80']
volumes:
- .:/var/www
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on: [app]
db:
image: mariadb:11
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: secret
volumes:
- dbdata:/var/lib/mysql
redis:
image: redis:alpine
volumes:
dbdata:
Pokretanje
docker-compose up -d
docker-compose exec app php artisan migrate
docker-compose exec app php artisan key:generate
Sajt na http://localhost:8080. Stop: docker-compose down.
Laravel Sail — Docker za lijene
Laravel Sail = service provider koji uključuje Docker u Laravel projekt s jednom komandom. Skripta ./vendor/bin/sail wraps docker-compose:
composer require laravel/sail --dev
php artisan sail:install
./vendor/bin/sail up -d
./vendor/bin/sail artisan migrate
Idealno za quick start novih projekata.
DDEV — Docker za Drupal/WP/Craft
DDEV je opinionated Docker wrapper za CMS development. Setup novog Craft projekta u 5 minuta:
ddev config --project-type=craftcms
ddev start
ddev composer install
ddev craft install
Plus: pre-konfigurirani PHP/MySQL/nginx, mkcert za HTTPS, mailhog za email testing, phpMyAdmin.
Volumes — persistentni podaci
- Bind mount (
.:/var/www) — direktorij na host-u mountan u container. Promjene odmah vidljive. Idealno za dev. - Named volume (
dbdata:) — Docker upravlja storage-om. Idealno za baze. - Anonymous volume — kreira se ad-hoc. Briše se kad container ode.
Networks
Containers u istom docker-compose dijele default network. Pristupaju se po service name (npr. db, redis) kao DNS.
Custom networks za isolation:
networks:
frontend:
backend:
services:
app:
networks: [frontend, backend]
db:
networks: [backend] # db nije dostupan iz frontend
Docker u produkciji
Dev container je jedna stvar, produkcija druga. Pitanja:
- Orchestration: single-server (docker-compose), Docker Swarm (basic), Kubernetes (full).
- Image registry: Docker Hub (public), GitHub Container Registry, GitLab Registry, self-hosted Harbor.
- Secrets management: Docker Secrets (Swarm) ili Vault.
- Logging: driver loki, json-file s rotation, Datadog agent.
- Monitoring: Prometheus exporter na containerima.
- Zero-downtime deploy: Swarm rolling update, K8s deployments, blue-green s nginx upstream switch.
Production-grade Dockerfile patterns
Multi-stage build
FROM node:20-alpine AS frontend-build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM php:8.2-fpm-alpine
WORKDIR /var/www
COPY composer.* ./
RUN composer install --no-dev
COPY . .
COPY --from=frontend-build /app/public/build ./public/build
Final image samo PHP runtime + built assets. Bez Node, bez source-a frontend buildovaog.
Non-root user
RUN addgroup -g 1000 app && adduser -G app -u 1000 -D app
USER app
Security: container ne radi kao root.
.dockerignore
.git
node_modules
vendor
storage/logs/*
.env
.env.example
Sprječava da local dev fajlovi završe u image-u.
Common pitfalls
- Image size: default PHP image je ~400MB. Alpine variant ~60MB. Multi-stage smanjuje još.
- File permissions: container UID vs host UID se ne slažu, write problemi. Postavi UID/GID match.
- Slow on macOS: bind mounts su sporiji na macOS-u. Koristi
:cachedili:delegated, ili dev v Mutagen. - Stale cache: kad mijenjaš Dockerfile, ali Docker koristi cache.
docker-compose build --no-cache. - Containers ne stop-aju:
docker-compose down -vza clean reset (briše i volumes). - Port konflikt: port 80 zauzet od Apache/MySQL na host-u. Map drugi port (
8080:80).
Docker Compose alternativa — Podman
Podman je rootless Docker alternativa od Red Hat-a. Compatible s docker CLI i compose. Sigurniji default, bolja izolacija. Za Linux production sve popularniji.
Kada NE koristit Docker
- Jednostavan statički sajt — overkill.
- Brzo razvijaš PHP skriptu lokalno bez DB-a — XAMPP/MAMP brži.
- Hosting koji ne podržava Docker (većina shared) — postavi production na bare metal.
- Tim koji ne zna Docker — learning curve troši vrijeme. Bolji direktan deploy ako tim je mali.
Docker hosting
- VPS s Docker-om: najjeftinije, full kontrola.
- Managed container hosting: AWS ECS, Google Cloud Run, Fly.io, Railway, Render.
- Kubernetes managed: GKE, EKS, DigitalOcean Kubernetes, OVH Managed.
- Self-hosted K8s: kompleksno, samo za ozbiljne use case.
WMD i Docker hosting
WMD nudi Docker-ready VPS i dedicated servere s pre-instaliranim Docker + Docker Compose. Postavljamo CI/CD pipeline (GitHub Actions ili Gitea Actions) da automatski build i deploy na server pri push-u. Image registry self-host (Harbor ili Gitea Container Registry). Backup volumes uključen u JetBackup. Za enterprise klijente s K8s potrebama, savjetujemo i konfiguriramo managed Kubernetes ili self-hosted (k3s, RKE2). Local DDEV ili Laravel Sail setup za novi WP/Craft/Laravel projekt uključen u onboarding.
FAQ
Docker ili Vagrant? Docker — moderniji, lakši, brži. Vagrant je manje popularno za novi projekt.
Docker Desktop alternativa za macOS/Windows? Rancher Desktop, OrbStack (macOS), Podman Desktop. Sve free i bolje od Docker Desktop u nekim aspektima.
Mogu li imat Docker container s GUI app? Tehnički da (X11 forwarding), praktički bolje nativni install.
Kubernetes je vrijedan za moj projekt? Ako imaš 50+ servisa ili masivnu skalu — da. Ako imaš jedan WP + DB + Redis — overkill.
Image size matter-a? Da — manji image = brži pull = brži deploy. Alpine + multi-stage = mali images.
Trebaš Docker setup za projekt ili production deploy? WMD postavlja Docker dev environment + CI/CD + production server. Javi se preko kontakt forme.