🐳 Dockerfile Là Gì? Cẩm Nang Toàn Tập Từ Trắng Giấy Đến Làm Chủ Hệ Thống
Nếu bạn đã từng mệt mỏi với điệp khúc "Code chạy ngon trên máy em, nhưng lên server lại lỗi", thì Docker chính là vị cứu tinh. Và để giao tiếp được với vị cứu tinh đó, bạn cần một ngôn ngữ chung. Ngôn ngữ đó chính là Dockerfile.
1. Dockerfile thực chất là gì?
Nói một cách dễ hiểu nhất, Dockerfile là một kịch bản (script) dạng text chứa một chuỗi các câu lệnh. Khi Docker đọc file này, nó sẽ thực thi tuần tự từng dòng lệnh để đóng gói toàn bộ source code, thư viện, môi trường và cấu hình của bạn thành một khối thống nhất gọi là Docker Image.
Hãy tưởng tượng bạn đang nướng một chiếc bánh:
-
Dockerfile: Chính là tờ công thức nấu ăn (ghi rõ cần bột gì, bao nhiêu đường, nướng bao nhiêu độ).
-
Docker Image: Là chiếc bánh đã nướng xong và được đóng gói, có thể mang đi bất cứ đâu.
-
Docker Container: Là lúc bạn cắt chiếc bánh đó ra và thưởng thức (chạy ứng dụng trên môi trường thực tế).
2. Giải mã các "Từ khóa" (Instructions) quyền lực trong Dockerfile
Một Dockerfile được xây dựng dựa trên các từ khóa viết hoa. Dưới đây là những "câu thần chú" cốt lõi nhất bạn cần nắm vững:
-
FROM: Luôn là câu lệnh mở đầu. Nó chỉ định "Base Image" (hình ảnh gốc) mà bạn muốn sử dụng. Ví dụ:FROM node:20-alpine(bắt đầu với môi trường Node.js 20 bản gọn nhẹ). -
WORKDIR: Thiết lập thư mục làm việc bên trong container. Mọi câu lệnhRUN,CMD,COPYsau đó sẽ được thực thi tại thư mục này. -
COPY: Copy file/thư mục từ máy tính của bạn (máy host) vào bên trong image. -
RUN: Thực thi các lệnh terminal trong quá trình build image (thường dùng để cài đặt các package/dependencies). -
EXPOSE: Khai báo cổng (port) mà container sẽ lắng nghe khi chạy. (Lưu ý: Đây chỉ là tính chất tài liệu, bạn vẫn cần map port khi chạy container). -
CMD: Lệnh mặc định sẽ được thực thi khi container bắt đầu chạy. Chỉ có một lệnhCMDcó tác dụng trong một Dockerfile. -
ENV: Thiết lập các biến môi trường (Environment Variables).
3. Ví dụ thực chiến: Viết Dockerfile cho một ứng dụng Backend
Hãy cùng viết một Dockerfile tiêu chuẩn cho một ứng dụng backend Node.js cơ bản.
Dockerfile
# 1. Chọn base image siêu nhẹ để tối ưu dung lượng
FROM node:20-alpine
# 2. Tạo và chỉ định thư mục làm việc trong container
WORKDIR /app
# 3. Copy file package.json và package-lock.json vào trước
# Việc này giúp tận dụng Docker Cache. Nếu dependencies không đổi, bước npm install sẽ cực nhanh.
COPY package*.json ./
# 4. Cài đặt các thư viện cần thiết (chỉ dùng cho production)
RUN npm ci --only=production
# 5. Copy toàn bộ source code còn lại vào container
COPY . .
# 6. Khai báo port mà app Node.js đang sử dụng (ví dụ 3000)
EXPOSE 3000
# 7. Khởi chạy ứng dụng
CMD ["node", "server.js"]
4. Bí kíp tối ưu Dockerfile của các chuyên gia (Best Practices)
Để viết một Dockerfile chạy được thì dễ, nhưng viết sao cho nhỏ - gọn - bảo mật thì cần áp dụng các quy tắc sau:
-
Luôn sử dụng
.dockerignore: Giống như.gitignore, file này giúp Docker bỏ qua các thư mục không cần thiết (nhưnode_modules,vendor,.env,.git). Điều này giúp giảm đáng kể thời gian build và dung lượng image. -
Sử dụng Base Image dung lượng nhỏ: Ưu tiên dùng các bản
alpine(ví dụnode:alpine,golang:alpine) thay vì các bản full. Image nhỏ hơn đồng nghĩa với việc deploy nhanh hơn và ít lỗ hổng bảo mật hơn. -
Tận dụng Layer Caching: Docker build image theo từng lớp (layer). Hãy gom các lệnh ít thay đổi lên trên (như copy file cấu hình thư viện) và đặt các lệnh hay thay đổi xuống dưới (như copy source code).
-
Multi-stage Builds (Build nhiều giai đoạn): Đây là kỹ thuật đỉnh cao. Bạn dùng một image nặng chứa đầy đủ công cụ để build/compile code (rất hữu ích cho các ngôn ngữ như Go hay C++), sau đó chỉ copy file thực thi cuối cùng sang một image siêu nhẹ khác để chạy production.
Với Dockerfile, bạn đã nắm trong tay quyền năng kiểm soát hoàn toàn môi trường chạy của ứng dụng, đảm bảo tính đồng nhất tuyệt đối từ máy tính cá nhân cho đến hệ thống máy chủ thật.
All rights reserved