Docker je orodje, ki je revolucioniralo način, kako razvijalci gradijo, pakirajo in zaganjajo aplikacije. Namesto da bi skrbeli za to, ali bo aplikacija delovala na enem ali drugem računalniku, Docker zagotovi, da deluje povsod enako - v "zabojniku" (container), ki vsebuje vse potrebno: kodo, knjižnice, odvisnosti in konfiguracijo.
Kaj je Docker?
Docker je platforma za razvoj, transport in zagon aplikacij v zabojnikih (containers). Zabojnik je lahka, samostojna izvršljiva enota, ki vsebuje vse, kar aplikacija potrebuje za delovanje. Za razliko od tradicionalnih virtualnih strojev (VM), zabojniki ne potrebujejo lastnega operacijskega sistema - delijo jedro (kernel) z gostiteljskim sistemom, kar jih naredi veliko lažje in hitrejše.
Virtualni stroj vs. zabojnik
To je ključno vprašanje, na katerega moramo odgovoriti, da razumemo, zakaj je Docker tako priljubljen:
| Lastnost | Virtualni stroj (VM) | Docker zabojnik |
|---|---|---|
| Operacijski sistem | Lastni OS (gostujoči) | Deli jedro z gostiteljem |
| Velikost | Več GB | Več MB |
| Čas zagona | Minute | Sekunde |
| Poraba virov | Visoka | Nizka |
| Izolacija | Popolna (lasten OS) | Procesna izolacija |
Ključni pojmi Docker-a
- Image (slika): Predloga, ki vsebuje aplikacijo in vse odvisnosti - nespremenljiva, samo za branje
- Container (zabojnik): Tekoči primerek slike - aplikacija, ki dejansko teče
- Dockerfile: Besedilna datoteka z navodili za izgradnjo slike
- Registry: Spletno skladišče slik (Docker Hub, GitHub Container Registry)
- Volume: Trajno shranjevanje podatkov zunaj zabojnika
- Network: Omrežje, ki povezuje zabojnike med seboj
Primer Dockerfile-a
Najboljši način, da razumete Docker, je primer. Recimo, da imamo preprosto Node.js aplikacijo:
# Dockerfile za Node.js aplikacijo # 1. Uporabi uradno Node.js sliko kot osnovo FROM node:20-alpine # 2. Nastavi delovni direktorij znotraj zabojnika WORKDIR /app # 3. Kopiraj package.json in package-lock.json COPY package*.json ./ # 4. Namesti odvisnosti RUN npm install # 5. Kopiraj preostalo kodo aplikacije COPY . . # 6. Določi privzeti ukaz za zagon CMD ["node", "server.js"]
Zelo pomembno je, da imamo v mapi še datoteko .dockerignore, ki preprečuje kopiranje nepotrebnih datotek v zabojnik:
# .dockerignore node_modules npm-debug.log .git .env *.md
Osnovna povelja
Tukaj je pregled najpogosteje uporabljenih Docker povelj:
| Povelje | Opis | Primer |
|---|---|---|
| docker build | Izgradi sliko iz Dockerfile-a | docker build -t moja-aplikacija . |
| docker run | Zažene zabojnik iz slike | docker run -p 3000:3000 moja-aplikacija |
| docker ps | Prikaže tekoče zabojnike | docker ps -a |
| docker stop | Ustavi tekoči zabojnik | docker stop <container_id> |
| docker rm | Odstrani zabojnik | docker rm <container_id> |
| docker images | Prikaže lokalne slike | docker images |
| docker logs | Prikaže dnevnike zabojnika | docker logs <container_id> |
Docker Compose
Ko aplikacija raste in potrebuje več storitev (npr. aplikacija + baza podatkov + cache), postane poganjanje posameznih zabojnikov zamudno. Tu pride v poštev Docker Compose, ki omogoča opredelitev vseh storitev v eni datoteki:
# docker-compose.yml
version: "3.8"
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- database
environment:
- DB_HOST=database
- DB_PORT=5432
database:
image: postgres:16-alpine
ports:
- "5432:5432"
volumes:
- db_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=secret123
- POSTGRES_DB=myapp
volumes:
db_data:
Zagon celotnega okolja je potem enostavno:
# Zagon vseh storitev docker compose up -d # Ustavi in odstrani vse docker compose down # Pregled dnevnikov docker compose logs -f
Prednosti in slabosti
| Prednosti | Slabosti |
|---|---|
| "Deluje na mojem računalniku" - in tudi drugje | Dodatna plast kompleksnosti |
| Hitri začetki in ustavljanja (sekunde) | Učna krivulja za začetnike |
| Dosledno okolje: razvoj = produkcija | Shranjevanje podatkov zahteva dodatno planiranje (volumes) |
| Enostavno skaliranje in razširjanje | Varnostni pomislebki pri delitvi jedra |
| Bogat ekosistem slik (Docker Hub) | Omejitve na Windows in macOS (zahteva WSL2/HyperKit) |
Zakaj uporabljati Docker?
Če ste razvijalec, ki dela na različnih projektih z različnimi tehnologijami - Node.js, PHP, Python, Arduino SDK - vam Docker omogoča, da imate vsako okolje ločeno in čisto. Ni več konfliktov med različicami knjižnic, ni več "na mojem računalniku deluje".
Za lastne strežnike in samostojne projekte je Docker še posebej uporaben - namesto da nameščate Node.js, PHP, PostgreSQL in Nginx direktno na sistem, lahko vsako storitev zaženete v svojem zabojniku. To pomeni čist sistem, enostavno posodabljanje in varnostno izolacijo med storitvami.
Začetek je preprost - namestite Docker, napišite prvi Dockerfile in zaženite aplikacijo. Vse ostalo pride s prakso.