AXV

Docker deploy

Docker tushunchalari, Dockerfile, .dockerignore, docker-compose (api + PostgreSQL), env va volume, deploy

10-sinfAdvanced Python Back-end6-hafta · 18-dars

Bugun nimalarni o'rganamiz?

Docker tushunchasi

Image va konteyner

build va run

Buyruqlar

docker-compose

API + baza

Takrorlash

.env fayli qayerga qo'shiladi (GitHub ga tushmasligi uchun)?

.env maxfiy, .gitignore da turadi.
01

Docker tushunchasi

Image va konteyner

Docker zanjiri

Dockerfile docker build Image docker run Retsept → quti → ishlayotgan konteyner

FastAPI uchun Dockerfile


FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
  
requirements.txt ni kodan oldin nusxalash qatlam keshidan foydalanishni ta'minlaydi: kod o'zgarsa kutubxonalar qayta o'rnatilmaydi. --host 0.0.0.0 bo'lmasa, konteyner tashqarisidan ulanib bo'lmaydi.

Mini-test

Image va konteyner farqi?

Image dan konteyner ishga tushadi.
02

build va run

Buyruqlar

Birinchi ishga tushirish

build run -p localhost:8000 docker logs Port ulanmasa sayt ochilmaydi

Asosiy buyruqlar


docker build -t book-api .
docker run -d --name api -p 8000:8000 --env-file .env book-api
docker ps
docker logs api
docker stop api
  
.dockerignore ga .env ni yozish xavfsizlik uchun muhim: aks holda parollar image ichida qoladi va image ni ulashsangiz ham sizib chiqadi.

Mini-test

-p 8000:8000 nima qiladi?

Tashqi port ichki portga yo'naltiriladi.
03

docker-compose

API + baza

Compose

compose.yml up --build api + db Swagger /docs Bir buyruq bilan butun tizim

docker-compose.yml


services:
  api:
    build: .
    ports: ["8000:8000"]
    env_file: .env
    environment:
      DATABASE_URL: postgresql+asyncpg://book:${DB_PASSWORD}@db:5432/books
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: book
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: books
    volumes: ["pgdata:/var/lib/postgresql/data"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U book -d books"]
      interval: 5s
      retries: 5
volumes:
  pgdata:
  
Migratsiya: docker compose exec api alembic upgrade head. To'xtatish: docker compose down (volume saqlanadi); down -v esa bazani ham o'chiradi.

Mini-test

Compose ichida API baza bilan qaysi host orqali bog'lanadi?

Konteynerda localhost — konteynerning o'zi.

Docker yo'q va bor

Docker yo'q

Har serverda qo'lda o'rnatish, versiya farqi
VS

Docker

Bir xil muhit, bir buyruq bilan ishga tushadi

«Mening kompyuterimda ishlagan» muammosi kamayadi.

Atamalar. Bosing

Image

bosing

Ilova va muhitning tayyor shabloni

Konteyner

bosing

Image ning ishlayotgan nusxasi

Volume

bosing

Konteynerdan tashqarida saqlanadigan ma'lumot

compose

bosing

Ko'p xizmatni bitta fayldan boshqarish

Deploy qadamlari

1. Dockerfile

Image retsepti.

2. compose

api va db.

3. Server

VPS yoki PaaS da ishga tushiring.

Docker buyruqlari

BuyruqNima qiladiMisol
buildimage yasaydidocker build -t book-api .
runkonteyner ishga tushiradidocker run -p 8000:8000 ...
psishlayotganlarni ko'rsatadidocker ps
compose upxizmatlarni ko'taradidocker compose up -d --build
compose downxizmatlarni to'xtatadidocker compose down

Pastga bosing: buyruqlar

Loyihani konteynerga solish

  1. Dockerfile va .dockerignore ni yozing.
  2. docker build -t book-api . ni ishga tushiring.
  3. docker run -p 8000:8000 --env-file .env book-api, so'ng localhost:8000/docs.

Baza hosti


DATABASE_URL: postgresql+asyncpg://book:pw@localhost:5432/books
  

Baza hosti


DATABASE_URL: postgresql+asyncpg://book:${DB_PASSWORD}@db:5432/books
  

Docker raqamlarda

0
ta xizmat: api va db
0
— API porti
0
— PostgreSQL porti

Compose bir buyruq bilan butun tizimni ko'taradi.

Amaliy topshiriq 20 daqiqa

OsonDockerfile: python:3.12-slim asosida FastAPI uchun Dockerfile yozing.
Oson.dockerignore: Image ga tushmasligi kerak bo'lgan 4 ta narsani yozing.
O'rtaBuild va run: Image yasang va 8000-portda ishga tushiring.
O'rtaDB hosti: Compose da DATABASE_URL hostini nima uchun db qilamiz?
QiyinVolume: PostgreSQL ma'lumoti o'chmasligi uchun volume qo'shing.
BonusMigratsiya: Compose ichida alembic migratsiyasini bajaring.

Dars xulosasi

Docker

Image (shablon) va konteyner (nusxa).

Fayllar

Dockerfile, .dockerignore, docker-compose.yml.

Deploy

compose up, volume, .env orqali parol.

Uyga vazifa: Dockerfile va docker-compose.

Keyingi dars: Real time (WebSocket)

FastAPI da real vaqtli ilova

7-hafta · 19-dars