ducdev
DevOps / Bài viết

Docker Từ Số Không — Đóng Gói Ứng Dụng Python Trong 30 Phút

Docker đã thay đổi cách chúng ta deploy ứng dụng. Bài viết này hướng dẫn từng bước container hóa một ứng dụng Django, từ Dockerfile đến docker-compose.

a
admin
13/02/2026 · 3 phút đọc · 0 lượt xem
Chia sẻ

Câu chuyện cũ "Nó chạy được trên máy tôi" chính là lý do Docker ra đời. Container hóa ứng dụng giải quyết vấn đề môi trường không nhất quán và làm cho việc deploy trở nên có thể dự đoán được.

Docker Là Gì — Giải Thích Ngắn Gọn

Docker đóng gói ứng dụng cùng với tất cả dependencies (thư viện, runtime, config) vào một container — một môi trường cô lập, portable. Container khác với VM ở chỗ nhẹ hơn nhiều vì chia sẻ kernel của host OS.

  • Image: Blueprint, bản thiết kế (read-only)
  • Container: Instance đang chạy của image
  • Dockerfile: Script để build image
  • docker-compose: Quản lý nhiều container

Viết Dockerfile Cho Django App

# Dùng Python slim để giảm kích thước
FROM python:3.12-slim

# Tạo thư mục làm việc
WORKDIR /app

# Copy requirements trước để tận dụng layer cache
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy toàn bộ source code
COPY . .

# Collect static files
RUN python manage.py collectstatic --noinput

# Expose port
EXPOSE 8000

# Chạy gunicorn
CMD ["gunicorn", "blog.wsgi:application", "--bind", "0.0.0.0:8000"]

Thứ tự các lệnh trong Dockerfile rất quan trọng: Docker cache từng layer. Copy requirements.txt và install trước khi copy source code giúp build nhanh hơn khi chỉ thay đổi code.

File .dockerignore

Tương tự .gitignore, file này ngăn Docker copy những thứ không cần thiết:

.git
.env
__pycache__
*.pyc
*.pyo
venv/
.venv/
*.sqlite3
staticfiles/

Docker Compose Với PostgreSQL

Thực tế, Django app cần cả database. docker-compose giúp orchestrate nhiều container:

version: '3.9'

services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: blogdb
      POSTGRES_USER: bloguser
      POSTGRES_PASSWORD: blogpass
    volumes:
      - postgres_data:/var/lib/postgresql/data

  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      DATABASE_URL: postgres://bloguser:blogpass@db:5432/blogdb
      DEBUG: "False"
    depends_on:
      - db
    command: >
      sh -c "python manage.py migrate &&
             gunicorn blog.wsgi --bind 0.0.0.0:8000"

volumes:
  postgres_data:

Các Lệnh Cần Nhớ

# Build image
docker build -t blog-app .

# Chạy với compose
docker-compose up -d

# Xem logs
docker-compose logs -f web

# Chạy management command trong container
docker-compose exec web python manage.py createsuperuser

# Dừng và xóa containers
docker-compose down

Best Practices

  • Dùng multi-stage builds để giảm kích thước image production
  • Không bao giờ hardcode secrets trong Dockerfile — dùng env vars
  • Chạy process với user non-root trong container
  • Pin version cụ thể: python:3.12.9-slim thay vì python:latest
Khi bạn container hóa ứng dụng, bạn không chỉ giải quyết vấn đề deploy — bạn đang tạo ra sự nhất quán từ development đến production.

Kết Luận

Docker có learning curve ban đầu nhưng lợi ích dài hạn rất đáng. Bước tiếp theo sau khi nắm Dockerfile và docker-compose là tìm hiểu Kubernetes cho orchestration ở scale lớn hơn — nhưng với phần lớn dự án, docker-compose là đủ.

#Docker #Python #Django #DevOps #Container
a
Tác giả
admin

Lập trình viên, yêu thích chia sẻ kiến thức về công nghệ và phát triển phần mềm.

Bình luận

Chưa có bình luận. Hãy là người đầu tiên!

Để lại bình luận

Bình luận sẽ được duyệt trước khi hiển thị.