Docker hóa Jarvis - "Đóng gói" để Deploy mọi nơi

AI Hunter

Member
Anh em có thấy mệt khi mỗi lần khởi động Jarvis là phải mở 3-4 cái cửa sổ Terminal không?
  1. Chạy Qdrant.
  2. Chạy Ollama.
  3. Chạy FastAPI.
  4. Chạy Chainlit.

Chưa kể hôm nào đẹp trời cài lại Win, cài lại Python là lỗi tùm lum.
Hôm nay, chúng ta sẽ dùng Docker để gói tất cả lại thành một "cục". Chỉ cần gõ 1 lệnh duy nhất là hệ thống tự chạy.

Docker hóa Jarvis - Đóng gói để Deploy mọi nơi .jpg

1. Chuẩn bị: Sắp xếp lại nhà cửa​


Để đóng gói gọn gàng, chúng ta cần chia code thành các thư mục rõ ràng.
Hãy tạo cấu trúc thư mục dự án như sau:

Mã:
my_jarvis/
├── backend/                # Chứa code FastAPI
│   ├── Dockerfile          # <--- File mới
│   ├── requirements.txt    # Các thư viện cho Backend
│   └── server.py           # File server.py cũ của bạn
├── frontend/               # Chứa code Chainlit
│   ├── Dockerfile          # <--- File mới
│   ├── requirements.txt    # Các thư viện cho Frontend
│   ├── chainlit.md
│   └── app.py              # File app.py cũ của bạn
└── docker-compose.yml      # <--- File "Nhạc trưởng" điều khiển tất cả

Lưu ý: Hãy tách file requirements.txt gốc ra làm 2 file nhỏ cho backend và frontend tương ứng để tối ưu dung lượng ảnh Docker.

2. Bước 1: Viết Dockerfile cho Backend​


Tạo file backend/Dockerfile (không có đuôi file):

Mã:
# Sử dụng Python 3.10 siêu nhẹ
FROM python:3.10-slim

# Thiết lập thư mục làm việc
WORKDIR /app

# Copy file thư viện vào trước để tận dụng Cache
COPY requirements.txt .

# Cài đặt thư viện
RUN pip install --no-cache-dir -r requirements.txt

# Copy toàn bộ code vào
COPY . .

# Mở cổng 8000
EXPOSE 8000

# Lệnh chạy server
CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8000"]

3. Bước 2: Viết Dockerfile cho Frontend​


Tạo file frontend/Dockerfile:

Mã:
FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# Chainlit mặc định chạy port 8000, ta sẽ map nó ra port khác sau
EXPOSE 8000

# Lệnh chạy Chainlit
CMD ["chainlit", "run", "app.py", "--host", "0.0.0.0", "--port", "8000"]

4. Bước 3: Viết docker-compose.yml (Nhạc trưởng)​


Đây là file quan trọng nhất. Nó sẽ định nghĩa toàn bộ hệ thống Jarvis của bạn.
Tạo file docker-compose.yml ngay thư mục gốc:

Mã:
version: '3.8'

services:
  # 1. Database Vector (Qdrant)
  qdrant:
    image: qdrant/qdrant
    ports:
      - "6333:6333"
    volumes:
      - ./qdrant_data:/qdrant/storage # Lưu dữ liệu ra ngoài để không bị mất khi tắt container

  # 2. Brain (FastAPI Backend)
  backend:
    build: ./backend # Build từ thư mục backend
    ports:
      - "8000:8000"
    environment:
      - OPENAI_API_KEY=ollama # Hoặc key thật nếu dùng OpenAI
      - QDRANT_URL=http://qdrant:6333 # Gọi nhau bằng tên service
      - OLLAMA_URL=http://host.docker.internal:11434/v1 # Kết nối với Ollama chạy trên máy thật
    depends_on:
      - qdrant
    extra_hosts:
      - "host.docker.internal:host-gateway" # Để container nhìn thấy Ollama ở máy thật

  # 3. Face (Chainlit Frontend)
  frontend:
    build: ./frontend # Build từ thư mục frontend
    ports:
      - "8501:8000" # Map port 8000 trong container ra port 8501 máy thật
    environment:
      - API_URL=http://backend:8000/chat # Gọi Backend bằng tên service
    depends_on:
      - backend

# Mạng nội bộ để các container nói chuyện với nhau
networks:
  default:
    driver: bridge

5. Chạy hệ thống​


Bây giờ là giây phút của sự thật.
Mở Terminal tại thư mục gốc my_jarvis/ và gõ:

Mã:
docker-compose up --build

Điều gì sẽ xảy ra?
  1. Docker sẽ tự động tải Qdrant về.
  2. Tự động build file ảnh cho Backend và Frontend.
  3. Tự động kết nối mạng giữa 3 thằng này.
  4. Bạn chỉ cần ngồi rung đùi đợi dòng chữ xanh lá hiện lên.

Sau khi chạy xong, truy cập:

Tổng kết​


Chúc mừng! Bạn đã chính thức "Docker hóa" thành công Jarvis.
Bây giờ, nếu muốn chia sẻ Jarvis cho bạn bè, bạn chỉ cần nén thư mục my_jarvis lại và gửi cho họ. Họ chỉ cần cài Docker và gõ 1 lệnh là xong. Không cần quan tâm Python phiên bản bao nhiêu, thư viện gì.
 
Back
Top