Docker za početnike: Praktičan vodič kroz kontejnerizaciju
Docker je postao industrija standard za deployment aplikacija, ali mnogi developeri odgađaju učenje jer kontejnerizacija zvuči složeno i apstraktno. Ovaj vodič objašnjava Docker za početnike kroz konkretan pristup — što Docker zapravo rješava, kako funkcionira, i kako ga početi koristiti bez prethodnog iskustva s DevOps alatima.
Razumijevanje Dockera nije samo tehnička vještina — to je praktično znanje koje omogućava brži development, pouzdaniji deployment i jednostavnije održavanje aplikacija. Bilo da radite na osobnim projektima, freelance poslovima ili u timu, Docker eliminira klasičan problem “kod mene radi” i omogućava vam da fokusirate vrijeme na development umjesto na okolinska podešavanja.
Sadržaj
Što je Docker i zašto ga developeri koriste?
Docker je platforma za razvoj, pakiranje i pokretanje aplikacija unutar izoliranih okruženja zvanih kontejneri. Kontejner je lagan, prenosiv paket koji sadrži vašu aplikaciju i sve što joj treba za rad: kod, runtime, sistemske biblioteke, ovisnosti.
Problem koji Docker rješava:
Prije Dockera, development je često uključivao frustrirajuće situacije: kod radi na vašem računalu, ali ne na serveru. Radi na serveru, ali ne na računalu kolege. Production okolina ima drugu verziju Node.js-a ili Pythona, i aplikacija pada bez jasnog razloga.
Docker eliminira ove probleme pakiranjem aplikacije i njenog okruženja u standardiziran kontejner koji radi identično svugdje — na vašem laptopu, na serveru, u cloudu.
Zašto Docker, a ne virtualne mašine?
Kontejneri dijele kernel operativnog sustava hosta, što ih čini puno lakšima i bržima od virtualnih mašina. VM mora pokrenuti čitav operativni sustav (uključujući kernel), što troši memoriju i CPU. Kontejner koristi host kernel i pokreće samo aplikaciju.
Rezultat: možete pokrenuti desetke kontejnera na istom serveru bez značajnog opterećenja, dok bi isti broj VM-ova bio neizvediv.
Ključni Docker koncepti koje morate razumjeti
Prije nego što počnete raditi s Dockerom, morate razumjeti nekoliko osnovnih koncepata. Ovo nisu apstraktni termini — svaki ima konkretnu svrhu u vašem workflow-u.
Docker Image:
Image je blueprint za kontejner. To je read-only predložak koji sadrži sve potrebno za pokretanje aplikacije: operativni sustav (obično lightweight Linux distro), runtime (Node.js, Python, PHP), ovisnosti (npm paketi, pip biblioteke), i vaš kod.
Image se ne mijenja. Svaki put kada pokrenete kontejner iz imagea, dobivate istu konzistentnu okolinu.
Docker Container:
Kontejner je pokrenuta instanca imagea. Dok je image statičan blueprint, kontejner je živo okruženje gdje se vaša aplikacija izvršava. Možete imati jedan image i pokrenuti više kontejnera iz njega.
Kontejneri su izolirani: svaki ima svoj filesystem, mrežu i procese. Mogu međusobno komunicirati preko mreže, ali ne mogu direktno pristupiti filesystemu drugih kontejnera.
Dockerfile:
Dockerfile je tekstualna datoteka s uputama za kreiranje Docker imagea. Definira što ide u image: base OS, instalaciju ovisnosti, kopiranje koda, konfiguraciju porta, i naredbu za pokretanje aplikacije.
Dockerfile je kao recept — jasno opisuje sve korake potrebne da se od nule napravi funkcionalno okruženje.
Docker Hub:
Docker Hub je javni registry gdje se pohranjuju i dijele Docker image-i. Možete preuzeti službene image-e za Node.js, PostgreSQL, Nginx, Redis i tisuće drugih alata, ili uploadati svoje custom image-e.
Ovo je kao npm ili pip, ali za čitava okruženja umjesto paketa.
Docker Compose:
Docker Compose omogućava definiranje i pokretanje aplikacija s više kontejnera pomoću jedne YAML datoteke. Ako vaša aplikacija treba Node.js backend, PostgreSQL bazu i Redis cache, Compose omogućava pokretanje svih triju kontejnera jednom naredbom.
Instalacija Dockera: Prvi koraci
Instalacija Dockera je prilično direktna, ali razlikuje se ovisno o operativnom sustavu.
Docker Desktop za Windows i macOS:
Docker Desktop je službena aplikacija koja uključuje Docker Engine, CLI alate i grafičko sučelje. Preuzima se s docker.com, instalira kao obična aplikacija, i pruža kompletan Docker stack.
Nakon instalacije, otvorite terminal i provjerite instalaciju:
docker --version
Ako se ispiše verzija Dockera, instalacija je uspješna.
Docker na Linux sustavima:
Na Linuxu se Docker instalira kroz paket menadžer. Za Ubuntu/Debian:
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
Za Fedora/RHEL:
sudo dnf install docker
sudo systemctl start docker
sudo systemctl enable docker
Nakon instalacije dodajte svog korisnika u docker grupu kako ne biste morali koristiti sudo za svaku naredbu:
sudo usermod -aG docker $USER
Odjavite se i ponovno se prijavite kako bi promjena stupila na snagu.
Vaš prvi Docker kontejner: Hello World primjer
Najbolji način učenja Dockera je praktičan rad. Počinjemo s jednostavnim primjerom koji pokreće službeni test image.
Pokretanje Hello World kontejnera:
docker run hello-world
Ova naredba:
- Provjerava imate li
hello-worldimage lokalno - Ako ga nema, preuzima ga s Docker Huba
- Kreira kontejner iz imagea
- Pokreće kontejner, ispisuje poruku, i zaustavlja se
Output pokazuje kako Docker funkcionira: preuzimanje imagea, kreiranje kontejnera, izvršavanje.
Pokretanje interaktivnog Linux kontejnera:
docker run -it ubuntu bash
Opcije:
-it: Kombinacija-i(interaktivni) i-t(terminal) omogućava interakciju s kontejneromubuntu: Image koji koristimobash: Naredba koja se pokreće unutar kontejnera
Sada ste unutar Ubuntu kontejnera. Možete pokretati Linux naredbe:
ls
pwd
apt update
Za izlaz iz kontejnera: exit
Kreiranje vlastitog Docker imagea
Ovdje počinje praktična primjena. Kreirat ćemo jednostavnu Node.js aplikaciju, paketirati je u Docker image i pokrenuti kao kontejner.
Kreiranje Node.js aplikacije:
Napravite direktorij za projekt i unutra kreirajte app.js:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello Docker!');
});
app.listen(port, () => {
console.log(`App running on port ${port}`);
});
Kreirajte package.json:
{
"name": "docker-example",
"version": "1.0.0",
"main": "app.js",
"dependencies": {
"express": "^4.18.0"
}
}
Kreiranje Dockerfile-a:
U istom direktoriju kreirajte datoteku Dockerfile (bez ekstenzije):
# Base image s Node.js
FROM node:18-alpine
# Postavljanje radnog direktorija
WORKDIR /app
# Kopiranje package.json i instalacija ovisnosti
COPY package*.json ./
RUN npm install
# Kopiranje aplikacijskog koda
COPY . .
# Expose porta
EXPOSE 3000
# Naredba za pokretanje aplikacije
CMD ["node", "app.js"]
Objašnjenje Dockerfile uputa:
FROM: Definira base image (Node.js verzija 18 na Alpine Linuxu, lightweight distro)WORKDIR: Postavlja radni direktorij unutar kontejneraCOPY: Kopira datoteke s hosta u kontejnerRUN: Izvršava naredbu tijekom buildanja imagea (instalacija ovisnosti)EXPOSE: Dokumentira koji port aplikacija koristiCMD: Definira zadanu naredbu koja se pokreće kada kontejner startuje
Buildanje Docker imagea:
docker build -t moja-node-app .
Opcije:
build: Naredba za kreiranje imagea-t moja-node-app: Tag (ime) imagea.: Kontekst (trenutni direktorij gdje je Dockerfile)
Build proces prolazi kroz sve upute u Dockerfile-u i kreira image.
Pokretanje kontejnera iz imagea:
docker run -p 3000:3000 moja-node-app
Opcije:
-p 3000:3000: Port mapping (host port:container port)moja-node-app: Ime imagea
Aplikacija je sada dostupna na http://localhost:3000
Najčešće Docker naredbe koje trebate znati
Docker CLI ima mnogo naredbi, ali za svakodnevni rad trebate nekoliko osnovnih.
Rad s containerima:
# Pokretanje kontejnera
docker run [opcije] image
# Popis pokrenutih kontejnera
docker ps
# Popis svih kontejnera (uključujući zaustavljene)
docker ps -a
# Zaustavljanje kontejnera
docker stop container_id
# Brisanje kontejnera
docker rm container_id
# Pokretanje kontejnera u pozadini (detached mode)
docker run -d image
# Pregled logova kontejnera
docker logs container_id
# Izvršavanje naredbe unutar pokrenutog kontejnera
docker exec -it container_id bash
Rad s imageima:
# Popis lokalnih imagea
docker images
# Preuzimanje imagea s Docker Huba
docker pull image_name
# Brisanje imagea
docker rmi image_id
# Buildanje imagea
docker build -t tag_name .
# Tagiranje imagea
docker tag local_image:tag registry/image:tag
Čišćenje sistema:
# Brisanje svih zaustavljenih kontejnera
docker container prune
# Brisanje neiskorištenih imagea
docker image prune
# Brisanje svega (kontejneri, image, volumeni, mreže)
docker system prune -a
Docker Compose: Pokretanje višestrukih kontejnera
Realne aplikacije rijetko koriste jedan kontejner. Obično trebate aplikaciju, bazu podataka, cache, možda reverse proxy. Docker Compose omogućava upravljanje svim tim kontejnerima kroz jednu konfiguraciju.
Instalacija Docker Compose:
Docker Desktop već uključuje Docker Compose. Na Linuxu se instalira zasebno:
sudo apt install docker-compose
Primjer: Node.js aplikacija s PostgreSQL bazom:
Kreirajte docker-compose.yml:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Pokretanje multi-container aplikacije:
# Pokretanje svih servisa
docker-compose up
# Pokretanje u pozadini
docker-compose up -d
# Zaustavljanje servisa
docker-compose down
# Rebuild i pokretanje
docker-compose up --build
Docker Compose automatski kreira mrežu gdje kontejneri mogu komunicirati međusobno po imenu servisa (db, app).
Docker Volumes: Perzistencija podataka
Kontejneri su po defaultu efemerni — kada ih zaustavite i obrišete, svi podaci unutra nestaju. Za perzistenciju podataka koristite volume-e.
Što su Docker volumes:
Volume je mehanizam za pohranjivanje podataka izvan kontejnera. Omogućava da podaci prežive brisanje kontejnera i mogu biti dijeljeni između više kontejnera.
Kreiranje i korištenje volumea:
# Kreiranje volumea
docker volume create my_data
# Pokretanje kontejnera s volumeom
docker run -v my_data:/app/data image_name
# Popis volumena
docker volume ls
# Brisanje volumea
docker volume rm my_data
Bind mounts vs volumes:
Bind mount povezuje direktorij s hosta direktno u kontejner. Koristan je za development jer omogućava live reload:
docker run -v $(pwd):/app node:18 npm start
Volumes su preferiran pristup za production jer ih Docker upravlja i nude bolje performanse.
Best practice za Docker za početnike
Kada počinjete koristiti Docker, ovih nekoliko principa će vam pomoći izbjegavati česte greške i graditi kvalitetnije image-e.
Koristite lightweight base image-e:
Umjesto pune Ubuntu ili Debian distribucije, koristite Alpine verzije. Node.js image s Alpine Linuxom je 10x manji od verzije s punim Debian OS-om:
# Loše: 900MB
FROM node:18
# Dobro: 120MB
FROM node:18-alpine
Manji image-i znače brži download, manje zauzeća diska i brži build.
Optimizirajte redoslijed Dockerfile uputa:
Docker cachira svaki layer. Ako ništa nije promijenjeno u nekom koraku, Docker ponovo koristi cached layer umjesto rebuild-a. Stavljajte operacije koje se rijetko mijenjaju na početak:
# Dobro: Ovisnosti se ne mijenjaju često
COPY package*.json ./
RUN npm install
# Kod se mijenja često
COPY . .
Ovaj redoslijed znači da Docker ne mora ponovno instalirati npm pakete svaki put kada promijenite kod.
Koristite .dockerignore:
Kao .gitignore, .dockerignore definira što ne treba biti kopirano u image:
node_modules
.git
.env
*.log
Ovo smanjuje veličinu build konteksta i ubrzava proces.
Ne pokrećete aplikacije kao root:
Docker kontejneri po defaultu pokreću procese kao root korisnik, što je sigurnosni rizik. Kreirajte non-root korisnika:
RUN addgroup -g 1001 appuser && \
adduser -D -u 1001 -G appuser appuser
USER appuser
Koristite multi-stage builds za production:
Multi-stage build omogućava da build ovisnosti ostanu u build stageu, dok finalni image sadrži samo runtime:
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Production stage
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
CMD ["node", "dist/index.js"]
Finalni image je puno manji jer ne sadrži development ovisnosti i build alate.
Najčešće greške koje početnci rade s Dockerom
Greška 1: Pokretanje previše procesa u jednom kontejneru
Docker kontejneri su dizajnirani za jedan proces. Ne pokrećite Node.js aplikaciju, Nginx i Redis u istom kontejneru — podijelite ih u zasebne kontejnere i spojite ih s Docker Compose.
Greška 2: Ignoriranje security best practices
Ne koristite latest tag u production jer se može promijeniti. Uvijek specificirajte verziju:
# Loše
FROM node:latest
# Dobro
FROM node:18.17.0-alpine
Greška 3: Postavljanje senzitivnih podataka u Dockerfile
Nikada ne hardkodirajte lozinke, API ključeve ili tokene u Dockerfile. Koristite environment varijable:
docker run -e DATABASE_PASSWORD=secret app
Ili Docker secrets u production okruženju.
Greška 4: Zanemarivanje veličine imagea
Veliki image-i usporavaju deployment i zauzimaju prostor. Redovno provjeravajte veličinu:
docker images
Koristite multi-stage build i Alpine base image-e gdje je moguće.
Greška 5: Ne čišćenje neiskorištenih resursa
Docker nakuplja zaustavljene kontejnere, neiskorištene image-e i volume-e. Redovno čistite:
docker system prune -a
Docker u realnom development workflowu
Docker nije samo deployment alat — to je moćan dio development procesa koji omogućava konzistentnost kroz cijeli tim.
Local development setup:
Umjesto instaliranja Node.js, PostgreSQL, Redis, MongoDB i ostalih ovisnosti direktno na vaš laptop, pokrenite sve kao Docker kontejnere. Vaš laptop ostaje čist, a setup projekta postaje jednostavan:
git clone repo
docker-compose up
Novi član tima može pokrenuti kompletan projekt u par minuta bez instaliranja desetaka ovisnosti.
Testing okruženje:
Docker omogućava kreiranje identičnog okruženja za testiranje. CI/CD pipeline pokreće testove u istom kontejneru gdje će aplikacija kasnije raditi u productionu.
Deployment na server:
Kada deployate aplikaciju, ne morate brinuti o verzijama Node.js-a, Python bibliotekama ili sistemskim ovisnostima na serveru. Deployate Docker image koji već sadrži sve potrebno.
Sljedeći koraci u učenju Dockera
Kada savladate osnove, ovi koncepti omogućavaju složenije use case-ove:
Docker networking: Razumijevanje kako kontejneri komuniciraju međusobno kroz bridge, host i overlay mreže.
Docker orchestration: Alati poput Kubernetes i Docker Swarm za upravljanje stotinama kontejnera kroz više servera.
CI/CD integracija: Automatizacija build procesa i deployment-a s Docker image-ima kroz GitHub Actions, GitLab CI ili Jenkins.
Security hardening: Skeniranje vulnerabilitya u image-ima, implementacija secrets managementa, i network segmentacija.
Monitoring i logging: Prikupljanje logova iz kontejnera, praćenje performansi i resource consumption-a.
Često postavljana pitanja
Je li Docker besplatan?
Docker Engine je open-source i besplatan za sve use case-ove. Docker Desktop je besplatan za individualne developere, edukaciju i male tvrtke. Veće organizacije mogu trebati plaćenu licencu za Docker Desktop, ali mogu koristiti Docker Engine na Linux serverima bez troškova.
Mogu li koristiti Docker na Windowsima?
Da. Docker Desktop funkcionira na Windows 10/11 Pro, Enterprise ili Education s WSL 2 (Windows Subsystem for Linux). Windows Home također može pokretati Docker Desktop s WSL 2. Performanse su dobre, ali Linux ostaje najoptimalnija platforma za Docker.
Trebam li Docker ako koristim cloud platforme?
Mnoge cloud platforme (AWS ECS/Fargate, Google Cloud Run, Azure Container Instances, DigitalOcean App Platform) baziraju se na Docker kontejnerima. Razumijevanje Dockera omogućava vam učinkovitije korištenje tih servisa. Čak i sa serverless pristupom, Docker ostaje koristan za local development.
Koliko memorije i CPU-a kontejneri troše?
Kontejneri troše minimalne resurse. Prazan Alpine Linux kontejner zauzima ~5MB memorije i gotovo nikakav CPU. Resurs consumption ovisi o vašoj aplikaciji, ne o Dockeru. Docker overhead je zanemariv u usporedbi s virtualnim mašinama.
Može li Docker zamijeniti virtualne mašine?
Za većinu aplikacija, da. Kontejneri su lakši, brži i jednostavniji za upravljanje. Međutim, VM-ovi su još uvijek potrebni za potpunu izolaciju OS-a, za pokretanje različitih kernela, ili za legacy aplikacije koje zahtijevaju specifične OS konfiguracije.
Što ako moja aplikacija pada unutar kontejnera?
Docker pruža logove koji pokazuju što se dogodilo:
docker logs container_id
Za debugging, možete pokrenuti bash unutar pokrenutog kontejnera:
docker exec -it container_id bash
Ili pokrenuti kontejner interaktivno kako biste testirali naredbe:
docker run -it image_name bash
Završna misao: Docker za početnike je lakši nego što mislite
Docker za početnike ne mora biti zastrašujuć. Osnove — image, kontejner, Dockerfile, Compose — možete svladati za vikend praktičnog rada. Ono što izgleda kompleksno s distance postaje intuitivno kada vidite kako Docker eliminira probleme s kojima se inače svakodnevno susrećete.
Počnite s jednostavnim projektom: pakirajte Node.js aplikaciju u Docker image, pokrenite je kao kontejner, dodajte bazu podataka kroz Docker Compose. Ovaj praktičan rad gradi razumijevanje brže nego čitanje dokumentacije.
Docker nije samo trend — to je standard kako moderne aplikacije rade u developmentu i productionu. Investiranje vremena u učenje Dockera sada štedi stotine sati debugging-a problema s okruženjima kasnije.
Trebate pomoć oko Docker setupa za vaš projekt ili deployment procesa?
MasteryMesh može postaviti Docker okruženje, Docker Compose konfiguracije i CI/CD pipeline koji omogućava pouzdan deployment. Kontaktirajte nas za konzultaciju.