MS Lesson7: Docker
Docker, VM deyil
- VM (Virtual Machine) → həqiqətən tam ayrı OS yaradır (öz kernel-i var)
- Docker container → OS yaratmır, host-un kernel-ini paylaşır
Docker nə edir?
- file system (öz faylları var)
- proseslər (digər container-lərin proseslərini görmür)
- network (öz virtual şəbəkəsi var)
- resurs limiti (CPU, RAM nə qədər istifadə edəcəyini məhdudlaşdırmaq olar)
- Kernel paylaşılır — host-un kernel-ini istifadə edir
- Tam ayrı OS yoxdur
Kernel nedir?
Nə edir?
- RAM idarə edir — hansı proqram nə qədər RAM istifadə edəcək
- CPU idarə edir — hansı proses nə vaxt işləyəcək
- Hardware ilə danışır — disk, şəbəkə kartı, USB və s.
- Prosesləri idarə edir — proqramları işə salır, dayandırır
- Təhlükəsizlik — proqramların bir-birinin yaddaşına girmişinin qarşısını alır
Linux-da
- Host-un öz Linux kernel-i var
- Docker birbaşa onu istifadə edir
- Əlavə heç nə lazım deyil
macOS-da (sənin halın)
- macOS-un Linux kernel-i yoxdur (Darwin kernel-i var)
- Docker Desktop quraşdıranda arxa planda kiçik bir Linux VM qaldırır
- Həmin VM-in Linux kernel-i var
- Docker konteynerləri həmin VM-in kernel-ini istifadə edir
Windows-da
- Eyni məntiq — Docker, WSL2 vasitəsilə Linux VM qaldırır
- Konteynerlar həmin Linux kernel-ini istifadə edir
- Linux: host kernel-i birbaşa
- macOS/Windows: Docker özü kiçik Linux VM qaldırır, onun kernel-ini verir
services:
postgres:
image: postgres:17
container_name: demo-postgres
environment:
POSTGRES_DB: demo-app
POSTGRES_USER: demo-app
POSTGRES_PASSWORD: demo-app
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
demo-network:
ipv4_address: 192.168.100.2
pgadmin:
image: dpage/pgadmin4
container_name: demo-pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: admin
PGADMIN_SERVER_JSON_FILE: /pgadmin4/servers.json
ports:
- "5050:80"
depends_on:
- postgres
volumes:
- ./pgadmin/servers.json:/pgadmin4/servers.json
networks:
demo-network:
ipv4_address: 192.168.100.3
networks:
demo-network:
ipam:
config:
- subnet: 192.168.100.0/24
volumes:
postgres_data:
{
"Servers": {
"1": {
"Name": "demo-postgres",
"Group": "Servers",
"Host": "192.168.100.2",
"Port": 5432,
"MaintenanceDB": "demo-app",
"Username": "demo-app",
"SSLMode": "prefer"
}
}
}
Docker image build etmek
1. Dockerfile yaratmaq
FROM amazoncorretto:21-alpine
RUN apk add --no-cache bash procps
COPY target/demo-app-0.0.1-SNAPSHOT.jar /app/
WORKDIR /app/
RUN mv /app/*.jar /app/app.jar
ENTRYPOINT ["java"]
CMD ["-jar", "app.jar"]
FROM amazoncorretto:21-alpine
- Base image seçilir: Amazon Corretto 21 + Alpine Linux
- Konteyner bu image üzərində qurulur
- Buradan sonrakı bütün əməliyyatlar bu mühitdə olur
RUN apk add --no-cache bash procps
- apk = Alpine-in paket meneceri (apt/yum kimi)
- bash = shell (Alpine-də default sh var, bash əlavə edilir)
- procps = ps, top kimi sistem alətləri (proses izləmək üçün)
- --no-cache = paket siyahısını cache-ə yazmır → image kiçik qalır
COPY target/demo-app-0.0.1-SNAPSHOT.jar /app/
- Host kompüterdəki target/ qovluğundakı JAR faylını
- Konteyner içindəki /app/ qovluğuna kopyalayır
WORKDIR /app/
- Bundan sonrakı əməliyyatlar üçün "cari qovluq" /app/ olur
- cd /app kimidir
RUN mv /app/*.jar /app/app.jar
- JAR faylının adını dəyişir
- demo-app-0.0.1-SNAPSHOT.jar → app.jar
- Məqsəd: sabit ad vermək (version dəyişəndə CMD dəyişməsin)
ENTRYPOINT ["java"]
- Konteyner başlayanda işə düşəcək əsas əmr: java
- Bu dəyişdirilə bilməz (override olmur)
CMD ["-jar", "app.jar"]
- ENTRYPOINT-ə əlavə edilən default arqumentlər
- Yəni tam əmr: java -jar app.jar
- CMD override edilə bilər (run zamanı başqa arqument vermək olar)
2. Terminalda
docker build . -t demo-app:v1
3. Image-i Docker Hub-a push etmek
3.1) docker tag demo-app:v3 parvin02/demo-app:v3
3.2) docker login
3.3) docker push parvin02/demo-app:v3
services:
postgres:
image: postgres:17
container_name: demo-postgres
environment:
POSTGRES_DB: demo-app
POSTGRES_USER: demo-app
POSTGRES_PASSWORD: demo-app
ports:
- "1111:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- demo-network
pgadmin:
image: dpage/pgadmin4
container_name: demo-pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: admin
ports:
- "5050:80"
depends_on:
- postgres
networks:
- demo-network
demo-app:
image: demo-app:v3
environment:
- DB_HOSTNAME=demo-postgres
- DB_PORT=5432
networks:
- demo-network
networks:
demo-network:
driver: bridge
volumes:
postgres_data:
bele de olar:
services:
postgres:
image: postgres:17
container_name: demo-postgres
environment:
POSTGRES_DB: demo-app
POSTGRES_USER: demo-app
POSTGRES_PASSWORD: demo-app
ports:
- "1111:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- demo-network
pgadmin:
image: dpage/pgadmin4
container_name: demo-pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: admin
ports:
- "5050:80"
depends_on:
- postgres
networks:
- demo-network
demo-app:
image: demo-app:v3
environment:
- DB_HOSTNAME=postgres
- DB_PORT=5432
networks:
- demo-network
networks:
demo-network:
driver: bridge
volumes:
postgres_data:
ve yekun docker-compose.yaml fayli bele gorunmelidir
services:
postgres:
image: postgres:17
container_name: demo-postgres
environment:
POSTGRES_DB: demo-app
POSTGRES_USER: demo-app
POSTGRES_PASSWORD: demo-app
ports:
- "1111:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- demo-network
pgadmin:
image: dpage/pgadmin4
container_name: demo-pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: admin
ports:
- "5050:80"
depends_on:
- postgres
networks:
- demo-network
demo-app:
image: parvin02/demo-app:v3
environment:
- DB_HOSTNAME=postgres
- DB_PORT=5432
ports:
- "9595:9595"
networks:
- demo-network
networks:
demo-network:
driver: bridge
volumes:
postgres_data:
Hipervisor (hypervisor) — fiziki maşında bir neçə virtual maşın (VM) işə salan və onları idarə edən proqramdır. Buna VMM (Virtual Machine Monitor) də deyilir.
Nə edir?
Fiziki serverin resurslarını (CPU, RAM, disk, şəbəkə) bölür və hər VM-ə öz “kompüter” illüziyası verir:
Hər VM öz əməliyyat sistemini (guest OS) işlədir; hipervisor onların hamısını eyni hardware üzərində təcrid edir.
Комментарии
Отправить комментарий