A Docker megvaltoztatta, hogyan epitjuk, szallitjuk es futtatjuk a szoftvert. A "az en gepemen mukodik" helyett a Docker garantalja, hogy az alkalmazasod mindenhol ugyanugy fut - a laptopopdon, egy kollega gepen, CI/CD-ben es produkcioban. Ebben az utmutatoban a nullarol indulunk egy valos alkalmazas deploy-jaig.
Mi a Docker?
A Docker egy platform, amely az alkalmazasodat es annak osszes fuggoseget egy szabvanyos egysegbe csomagolja, amit kontenernek hivunk. A kontener egy izolalt, konnyusulyu folyamat, amely megosztja a gazda OS kernelet, de sajat fajlrendszerrel, halozattal es folyamatterrel rendelkezik.
Kontenerek vs Virtualis Gepek
| Szempont | Kontenerek | Virtualis Gepek |
|---|---|---|
| Inditas | Masodpercek | Percek |
| Meret | MB | GB |
| OS | Megosztja a gazda kernelet | Teljes vendeg OS |
| Izolacio | Folyamat szintu | Hardver szintu |
| Teljesitmeny | Kozel nativ | Hypervisor tulterheltseg |
| Suruseg | Szazak gazdanként | Tizek gazdankent |
Docker Telepitese
# macOS brew install --cask docker # Ubuntu/Debian curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # Verify installation docker --version docker run hello-world
Alapfogalmak
Image-ek
Az image egy csak olvasható sablon utasitasokkal egy kontener letrehozasahoz. Gondolj ra ugy, mint az alkalmazasod es kornyezetenek pillanatfelvetele.
# Pull an image from Docker Hub docker pull node:20-alpine # List local images docker images # Remove an image docker rmi node:20-alpine
Kontenerek
A kontener egy image futo peldanya. Kontenereket letrehozhatsz, elindithatod, leallithatod es torolheted.
# Run a container docker run -d --name my-app -p 3000:3000 node:20-alpine # List running containers docker ps # List all containers (including stopped) docker ps -a # Stop a container docker stop my-app # Remove a container docker rm my-app # View logs docker logs my-app # Execute a command inside a running container docker exec -it my-app sh
Dockerfile Irasa
A Dockerfile egy szoveges fajl utasitasokkal egy image epitsehez. Minden utasitas egy reteget hoz letre.
Alap Dockerfile egy Node.js Alkalmazashoz
# Use an official Node.js runtime as base image FROM node:20-alpine # Set working directory WORKDIR /app # Copy package files first (better caching) COPY package.json package-lock.json ./ # Install dependencies RUN npm ci --only=production # Copy application code COPY . . # Expose the port the app runs on EXPOSE 3000 # Command to run the application CMD ["node", "server.js"]
Epites es Futtatás
# Build the image docker build -t my-node-app . # Run the container docker run -d -p 3000:3000 my-node-app # Visit http://localhost:3000
Tobblepcsoszeru Buildek
A tobblepcsoszeru buildek kicsin tartjak a produkcio image-eket azaltal, hogy elvalasztjak a build kornyezetet a futtatokornyezettol.
# Stage 1: Build FROM node:20-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build # Stage 2: Production FROM node:20-alpine AS runner WORKDIR /app COPY /app/dist ./dist COPY /app/node_modules ./node_modules COPY /app/package.json ./ EXPOSE 3000 CMD ["node", "dist/server.js"]
Ez egy image-et allit elo, amely csak a leforditott kimenetet es a produkcio fuggosegeket tartalmazza - nincs forraskod, nincsenek fejlesztoi fuggosegek, nincsenek build eszkozok.
Next.js Tobblepcsoszeru Pelda
FROM node:20-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci FROM node:20-alpine AS builder WORKDIR /app COPY /app/node_modules ./node_modules COPY . . RUN npm run build FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production COPY /app/public ./public COPY /app/.next/standalone ./ COPY /app/.next/static ./.next/static EXPOSE 3000 CMD ["node", "server.js"]
Kotetek: Allo Adatok
Alapertelmezetten a kontener belsejeben levo adatok elvesznek, amikor a kontenert eltavolitjak. A kotetek megoldjak ezt.
# Create a named volume docker volume create my-data # Run with a volume docker run -d -v my-data:/app/data my-app # Bind mount (map host directory to container) docker run -d -v $(pwd)/data:/app/data my-app # List volumes docker volume ls
Halozat
A Docker izolalt halozatokat hoz letre a kontenerek kommunikaciojara.
# Create a custom network docker network create my-network # Run containers on the same network docker run -d --name api --network my-network my-api docker run -d --name db --network my-network postgres:16 # Containers can reach each other by name # From "api" container: postgres://db:5432
Docker Compose
A Docker Compose lehetove teszi tobbkonteneres alkalmazasok definialast es futtatasat egyetlen YAML fajllal.
docker-compose.yml
services: api: build: ./api ports: - "3000:3000" environment: - DATABASE_URL=postgres://user:pass@db:5432/mydb depends_on: - db db: image: postgres:16-alpine environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=pass - POSTGRES_DB=mydb volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" redis: image: redis:7-alpine ports: - "6379:6379" volumes: pgdata:
Parancsok
# Start all services docker compose up -d # View logs docker compose logs -f # Stop all services docker compose down # Rebuild and restart docker compose up -d --build # Scale a service docker compose up -d --scale api=3
.dockerignore
A .gitignore-hoz hasonloan ez a fajl megakadalyozza, hogy szuksegtelen fajlok keruljenek az image-be.
node_modules .git .env *.md .next dist coverage
Produkcio Legjobb Gyakorlatai
1. Hasznalj Kis Alapimage-eket
# Bad: 1GB+ FROM node:20 # Good: ~180MB FROM node:20-alpine
2. Ne Futtasd Root-kent
FROM node:20-alpine RUN addgroup -S app && adduser -S app -G app USER app WORKDIR /home/app COPY . .
3. Hasznalj Specifikus Image Tageket
# Bad: can change unexpectedly FROM node:latest # Good: pinned version FROM node:20.11-alpine3.19
4. Hasznald ki a Build Cache-t
Rendezd a Dockerfile utasitasaidat a legkevesbetol a leggyakrabban valtozokig:
FROM node:20-alpine WORKDIR /app # These change rarely - cached COPY package.json package-lock.json ./ RUN npm ci --only=production # This changes often - not cached COPY . .
5. Egeszseg-ellenorzesek
HEALTHCHECK \ CMD wget -qO- http://localhost:3000/health || exit 1
6. Hasznalj Kornyezeti Valtozokat
ENV NODE_ENV=production ENV PORT=3000
Gyakori Docker Parancsok Puskalap
# Images docker build -t name:tag . # Build image docker images # List images docker rmi image_name # Remove image docker image prune # Remove unused images # Containers docker run -d -p 3000:3000 image # Run detached docker ps # List running docker stop container_name # Stop docker rm container_name # Remove docker logs -f container_name # Follow logs docker exec -it container sh # Shell into container # Compose docker compose up -d # Start services docker compose down # Stop services docker compose logs -f # Follow all logs docker compose ps # List services # Cleanup docker system prune -a # Remove everything unused
Dockertol Kubernetes-ig
A Docker egyedi kontenereket kezel. Amikor szazak kontenereket kell orkesztralnia tobb szerveren, Kubernetes-re van szukseged. A Docker es a Kubernetes kiegeszitik egymast:
- Docker: kontenereket epit es futtat
- Kubernetes: kontenereket orkesztral nagy lepton (utemezés, skalazas, ongyogyitas)
Ha erdekel a kovetkezo lepes, nezd meg a cikkemet a Kubernetes Bevezetesrol.
Osszefoglalas
A Docker alapveto keszseg a modern fejlesztok szamara. Megszunteti a kornyezeti kovetkezetlensegeket, egyszerusiti a deploy-t, es az alapja a kontener-orkesztraciora a Kubernetes-szel. Kezdj egy egyszeru Dockerfile-lal, lepj tovabb a Docker Compose-ra tobbszolgaltatasos alkalmazasokhoz, es adoptald a tobblepcsoszeru buildeket es biztonsagi legjobb gyakorlatokat ahogy felodsz.
A Docker tanulasanak legjobb modja egy projekt kontenerizalasa, amin mar dolgozol. Kezdd el ma.