Docker_257_Inno

Link

1. Mở đầu: Vấn đề "Kinh điển" (3 phút)

2. Giải pháp diệu kỳ: Docker là gì? (7 phút)

- Slide 4: Các khái niệm cốt lõi (Giải thích đơn giản)

Lợi ích chính (5 phút)

Slide 5: Tối ưu quá trình Build ⚡️ (4 phút)

- Layer Caching (Bộ đệm lớp):

docker compose up --build -d
docker compose down -v
docker system prune -a

- Multi-stage Builds (Build đa giai đoạn) 🏗️:


cách cấu trúc dự án Docker theo kiểu tách biệt và các kiểu cấu trúc khác.

Chắc chắn rồi, đây là cách cấu trúc dự án Docker theo kiểu tách biệt và các kiểu cấu trúc khác.

Cách bạn mô tả — tách mỗi dịch vụ ra một thư mục riêng với Dockerfile của nó, và dùng một file docker-compose.yml ở thư mục gốc để điều phối — là cách làm phổ biến, hiệu quả và được khuyên dùng nhất cho hầu hết các dự án.


## Kiểu 1: Cấu trúc Microservices với Docker Compose (Phổ biến nhất)

Đây chính là cấu trúc bạn đã đề cập. Nó cực kỳ phù hợp cho các dự án có nhiều thành phần (ví dụ: frontend, backend, database).

Cấu trúc thư mục:

my-project/
├── docker-compose.yml
├── backend/
│   ├── Dockerfile
│   ├── main.py
│   └── requirements.txt
├── frontend/
│   ├── Dockerfile
│   ├── src/
│   └── package.json
└── nginx/
    └── nginx.conf

Cách hoạt động:

File docker-compose.yml ở thư mục gốc sẽ định nghĩa các services và chỉ định nơi để "build" image cho từng service đó.

docker-compose.yml ví dụ:

version: '3.8'

services:
  backend:
    build:
      context: ./backend  # Trỏ đến thư mục chứa Dockerfile của backend
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    volumes:
      - ./backend:/app

  frontend:
    build:
      context: ./frontend # Trỏ đến thư mục chứa Dockerfile của frontend
    ports:
      - "3000:3000"

  # ... các services khác như database, redis ...

## Các kiểu cấu trúc khác

Ngoài cách trên, còn có một vài kiểu cấu trúc khác, mỗi kiểu phù hợp với các trường hợp sử dụng khác nhau.

## Kiểu 2: Monolithic Dockerfile (Dùng Multi-stage builds)

Kiểu này gộp tất cả các bước build của nhiều thành phần vào một Dockerfile duy nhất đặt ở thư mục gốc, sử dụng kỹ thuật multi-stage builds.

Cấu trúc thư mục:

my-project/
├── Dockerfile          # Dockerfile duy nhất
├── docker-compose.yml
├── backend/
│   ├── main.py
│   └── requirements.txt
└── frontend/
    ├── src/
    └── package.json

Cách hoạt động:

Dockerfile sẽ có nhiều giai đoạn (stage), ví dụ: một stage để build frontend, một stage để cài đặt backend, và stage cuối cùng để tổng hợp kết quả.

Dockerfile (Multi-stage) ví dụ:

# Stage 1: Build frontend
FROM node:18 AS frontend-builder
WORKDIR /app
COPY frontend/package.json .
RUN npm install
COPY frontend/ .
RUN npm run build

# Stage 2: Build backend
FROM python:3.9-slim AS final-image
WORKDIR /app
COPY --from=frontend-builder /app/build /app/static # Copy kết quả build frontend
COPY backend/requirements.txt .
RUN pip install -r requirements.txt
COPY backend/ .
CMD ["python", "main.py"]

docker-compose.yml lúc này sẽ rất đơn giản:

services:
  app:
    build: . # Build từ Dockerfile ở thư mục hiện tại
    ports:
      - "8000:8000"

## Kiểu 3: Sử dụng Image Registry (Cho Production & CI/CD)

Đây là một biến thể nâng cao của kiểu 1, thường được dùng trong môi trường chuyên nghiệp với CI/CD (Tích hợp/Triển khai liên tục).

Cách hoạt động:

  1. Mỗi service (frontend, backend) vẫn có Dockerfile riêng trong thư mục của nó.
  2. Thay vì docker-compose tự build, một hệ thống CI/CD (như GitLab CI, GitHub Actions) sẽ tự động build image cho mỗi service khi có code mới được đẩy lên.
  3. Các image sau khi build xong sẽ được đẩy lên một kho lưu trữ image (Image Registry) như Docker Hub, GitLab Container Registry, hoặc AWS ECR.
  4. File docker-compose.yml sẽ không dùng build nữa, mà dùng image để kéo các image đã được build sẵn từ registry về.

docker-compose.yml ví dụ:

version: '3.8'

services:
  backend:
    image: my-registry/my-project/backend:1.2.0 # Kéo image từ registry
    ports:
      - "8000:8000"

  frontend:
    image: my-registry/my-project/frontend:2.5.1 # Kéo image đã được build sẵn
    ports:
      - "3000:3000"
Tiêu chí Kiểu 1: Microservices (Khuyên dùng) Kiểu 2: Monolithic Dockerfile Kiểu 3: Image Registry (Production)
Độ phức tạp Trung bình Thấp (ban đầu), Cao (khi lớn) Cao (thiết lập ban đầu)
Bảo trì Tốt Kém Rất tốt
Khả năng mở rộng Rất tốt Kém Rất tốt
Tốc độ triển khai Trung bình (cần build) Chậm (build phức tạp) Nhanh (chỉ kéo image)
Phù hợp nhất cho Hầu hết các dự án Dự án nhỏ, đơn giản Môi trường Production, CI/CD

Lỗi mình mắc phải

QUestion

docker engine ---