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-slimthay 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à đủ.
Chưa có bình luận. Hãy là người đầu tiên!