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?

Container yalnız bunları izolə 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)
Amma:
  • Kernel paylaşılır — host-un kernel-ini istifadə edir
  • Tam ayrı OS yoxdur



Kernel nedir?

Kernel — əliyyat sisteminin ən əsas hissəsidir. Hardware ilə proqramlar arasında kör rolunu oynayır.

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

Qısa:
  • 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 varbash əlavə edilir)
  • procps = pstop 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
  • 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
  • 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:

Fiziki server (1 maşın)
HİPERVİZOR (proqram)
├── VM 1 (öz OS: Linux) → App A
├── VM 2 (öz OS: Windows) → App B
└── VM 3 (öz OS: Linux) → App C


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.








Комментарии

Популярные сообщения из этого блога

Interview questions

Lesson1: JDK, JVM, JRE

Lesson_2: Operations in Java