Kontejnerizacija i orkestracija su transformisale način na koji se softver razvija, deployuje i upravlja. Kontejneri, poput Dockera, omogućavaju pakovanje aplikacija i svih njihovih zavisnosti u izolovanu jedinicu, obezbeđujući konzistentno okruženje od razvoja do produkcije. Orkestracioni alati, kao što je Kubernetes, automatizuju upravljanje kontejnerizovanim aplikacijama na velikoj skali, uključujući deployment, skaliranje, mrežu i monitoring. Za DevOps inženjera, duboko razumevanje ovih tehnologija je neophodno za izgradnju modernih, skalabilnih i otpornih sistema. Ovaj tutorijal će vas provesti kroz ključne koncepte Dockera i Kubernetes-a, sa praktičnim primerima.
Docker je najpopularnija platforma za kontejnerizaciju. Omogućava vam da gradite, pokrećete i delite kontejnerizovane aplikacije.
Dockerfile-a.docker build -t ime_slike .: Izgradnja Docker slike iz Dockerfile-a u trenutnom direktorijumu. bash docker build -t my-web-app .docker run -p 80:80 ime_slike: Pokretanje kontejnera iz slike, mapirajući port 80 hosta na port 80 kontejnera. bash docker run -p 80:80 my-web-appdocker ps: Prikazuje listu pokrenutih kontejnera. bash docker psdocker ps -a: Prikazuje sve kontejnera (pokrenute i zaustavljene). bash docker ps -adocker stop <ID_kontejnera>: Zaustavlja pokrenuti kontejner. bash docker stop abc123def456docker rm <ID_kontejnera>: Briše zaustavljeni kontejner. bash docker rm abc123def456docker rmi <ID_slike>: Briše Docker sliku. bash docker rmi my-web-appdocker images: Prikazuje listu Docker slika. bash docker imagesdocker pull <ime_slike>: Preuzima sliku sa Docker Hub-a. bash docker pull nginxPretpostavimo da imamo jednostavnu Node.js aplikaciju (app.js):
const http = require("http");
const hostname = "0.0.0.0";
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
res.end("Hello from Docker!\n");
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});I package.json:
{
"name": "my-node-app",
"version": "1.0.0",
"description": "A simple Node.js web app",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"author": "",
"license": "ISC"
}Dockerfile:
# Koristi zvaničnu Node.js sliku kao baznu sliku
FROM node:18-alpine
# Postavi radni direktorijum unutar kontejnera
WORKDIR /app
# Kopiraj package.json i package-lock.json u radni direktorijum
COPY package*.json ./
# Instaliraj zavisnosti
RUN npm install
# Kopiraj ostatak koda aplikacije u radni direktorijum
COPY . .
# Izloži port na kojem aplikacija sluša
EXPOSE 3000
# Komanda za pokretanje aplikacije kada se kontejner pokrene
CMD ["npm", "start"]Koraci za izgradnju i pokretanje:
bash docker build -t my-node-app .bash docker run -p 80:3000 my-node-app Sada možete pristupiti aplikaciji putem http://localhost u vašem pretraživaču.Docker Compose je alat za definisanje i pokretanje multi-kontejnerskih Docker aplikacija. Koristi YAML fajl za konfiguraciju servisa aplikacije, što omogućava pokretanje celog stack-a jednom komandom.
docker-compose.yml: YAML fajl koji definiše servise, mreže i volumene za vašu aplikaciju.docker-compose.yml predstavlja jedan kontejner (ili grupu kontejnera istog tipa).docker-compose up: Izgrađuje, kreira, pokreće i attachuje se na kontejnere za servis.
docker-compose up -d: Pokreće kontejnere u detached modu (u pozadini).docker-compose up -ddocker-compose down: Zaustavlja i briše kontejnere, mreže i volumene definisane u docker-compose.yml. bash docker-compose downdocker-compose ps: Prikazuje status servisa. bash docker-compose psdocker-compose logs: Prikazuje logove servisa. bash docker-compose logs -fdocker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "80:3000"
depends_on:
- db
environment:
MONGO_URI: mongodb://db:27017/mydb
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
volumes:
mongo-data:app.js (primer sa MongoDB konekcijom):
const http = require("http");
const MongoClient = require('mongodb').MongoClient;
const hostname = "0.0.0.0";
const port = 3000;
const mongoUri = process.env.MONGO_URI || 'mongodb://localhost:27017/mydb';
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
MongoClient.connect(mongoUri, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) {
console.error("Failed to connect to MongoDB", err);
res.end("Hello from Docker! Failed to connect to DB.\n");
return;
}
const db = client.db();
db.collection('messages').insertOne({ text: 'Hello from Node.js' }, (err, result) => {
if (err) {
console.error("Failed to insert message", err);
res.end("Hello from Docker! Failed to insert message.\n");
client.close();
return;
}
res.end("Hello from Docker! Message inserted into DB.\n");
client.close();
});
});
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});package.json (dodajte mongodb zavisnost):
{
"name": "my-node-app",
"version": "1.0.0",
"description": "A simple Node.js web app",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"mongodb": "^4.0.0"
}
}Koraci za pokretanje:
Dockerfile, app.js i package.json u direktorijumu web/.docker-compose.yml u roditeljskom direktorijumu web/.bash docker-compose up -d Sada imate web aplikaciju i MongoDB bazu podataka pokrenute u odvojenim kontejnerima, povezanih putem Docker Compose-a.Kubernetes je open-source sistem za automatizaciju deploymenta, skaliranja i upravljanja kontejnerizovanim aplikacijama. Postao je de facto standard za orkestraciju kontejnera u produkcionim okruženjima.
kube-apiserver, etcd, kube-scheduler, kube-controller-manager.kubelet (agent koji komunicira sa Masterom) i kube-proxy (mrežni proxy).kubectl get pods: Prikazuje listu Podova. bash kubectl get podskubectl get deployments: Prikazuje listu Deploymenta. bash kubectl get deploymentskubectl get services: Prikazuje listu Servisa. bash kubectl get serviceskubectl describe pod <ime_poda>: Prikazuje detaljne informacije o Podu. bash kubectl describe pod my-app-pod-xyz12kubectl logs <ime_poda>: Prikazuje logove kontejnera u Podu. bash kubectl logs my-app-pod-xyz12kubectl apply -f <fajl.yaml>: Kreira ili ažurira resurse definisane u YAML fajlu. bash kubectl apply -f my-app-deployment.yamlkubectl delete -f <fajl.yaml>: Briše resurse definisane u YAML fajlu. bash kubectl delete -f my-app-deployment.yamlkubectl scale deployment <ime_deploymenta> --replicas=<broj>: Skalira broj replika Deploymenta. bash kubectl scale deployment my-app-deployment --replicas=5Koristićemo istu Node.js aplikaciju kao ranije, ali ćemo je deployovati na Kubernetes.
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-node-app-deployment
labels:
app: my-node-app
spec:
replicas: 3
selector:
matchLabels:
app: my-node-app
template:
metadata:
labels:
app: my-node-app
spec:
containers:
- name: my-node-app-container
image: your_docker_username/my-node-app:latest # Koristite vašu Docker sliku
ports:
- containerPort: 3000service.yaml:
apiVersion: v1
kind: Service
metadata:
name: my-node-app-service
spec:
selector:
app: my-node-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer # Koristite LoadBalancer za eksterni pristup u cloudu, ili NodePort za lokalni klasterKoraci za deployment:
bash docker build -t your_docker_username/my-node-app:latest . docker push your_docker_username/my-node-app:latestbash kubectl apply -f deployment.yaml kubectl apply -f service.yamlbash kubectl get pods kubectl get servicesHelm je menadžer paketa za Kubernetes. Omogućava vam da definišete, instalirate i nadogradite čak i najkompleksnije Kubernetes aplikacije koristeći Helm Charts.
helm create my-chart: Kreira novi Helm Chart sa osnovnom strukturom. bash helm create my-charthelm install <ime_izdanja> <putanja_do_chart-a>: Instalira Chart na klaster. bash helm install my-release ./my-charthelm upgrade <ime_izdanja> <putanja_do_chart-a>: Nadograđuje postojeće izdanje. bash helm upgrade my-release ./my-charthelm uninstall <ime_izdanja>: Briše izdanje i sve njegove resurse sa klastera. bash helm uninstall my-releasehelm list: Prikazuje listu instaliranih izdanja. bash helm listbash helm create my-node-app-chartmy-node-app-chart/values.yaml da konfigurišete sliku i port: yaml image: repository: your_docker_username/my-node-app tag: latest service: type: LoadBalancer port: 80 targetPort: 3000my-node-app-chart/templates/deployment.yaml i my-node-app-chart/templates/service.yaml da koriste ove vrednosti.bash helm install my-node-app-release ./my-node-app-chartKontejnerizacija sa Dockerom i orkestracija sa Kubernetesom su postale nezaobilazne tehnologije u modernom DevOps pejzažu. One omogućavaju timovima da grade, deployuju i upravljaju aplikacijama na efikasan, skalabilan i pouzdan način. Ovladavanje ovim alatima će vas pozicionirati kao ključnog igrača u svakom DevOps timu. Kontinuirano eksperimentisanje sa ovim tehnologijama i praćenje novih trendova je ključno za vaš dalji razvoj.
Autor: Manus AI Datum: 27. jul 2025.