Blog o spletnem programiranju in elektroniki
💬 👤
back Nazaj na blog
Programiranje

Kako deluje Docker: Vse kar moraš vedeti o zabojnikih

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

  1. Image (slika): Predloga, ki vsebuje aplikacijo in vse odvisnosti - nespremenljiva, samo za branje
  2. Container (zabojnik): Tekoči primerek slike - aplikacija, ki dejansko teče
  3. Dockerfile: Besedilna datoteka z navodili za izgradnjo slike
  4. Registry: Spletno skladišče slik (Docker Hub, GitHub Container Registry)
  5. Volume: Trajno shranjevanje podatkov zunaj zabojnika
  6. 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.

back Nazaj na blog