DEV Community

duytruong09
duytruong09

Posted on

🚀 Docker Phần 2: Hiểu về Layer, ENV, ARG, CMD, ENTRYPOINT và cách build/run Docker

Hiểu về Layer, ENV, ARG, CMD, ENTRYPOINT và cách build/run Docker

Bài viết này dành cho người mới học Docker hoặc cần hiểu rõ hơn về cách hoạt động của Dockerfile.


1. Layer trong Docker là gì?

Khi bạn build một Docker image từ Dockerfile, Docker sẽ tạo ra các lớp (layer) tương ứng với mỗi dòng lệnh trong file.

Mỗi layer là một lớp bất biến (immutable) — nếu dòng lệnh không thay đổi, Docker có thể cache lại layer đó, giúp build nhanh hơn và tiết kiệm dung lượng.

Câu lệnh tạo layer mới:

Các chỉ thị trong Dockerfile tạo ra layer mới gồm:

FROM: # Bắt đầu một image base mới
RUN: # dùng để chạy lệnh trong lúc build, ví dụ: # RUN apt-get install ...
COPY: # copy file từ máy host vào image
ADD: # giống COPY nhưng thông minh hơn (có thể giải nén) 
CMD: # chỉ định lệnh mặc định khi container chạy
ENTRYPOINT: # giống CMD nhưng bắt buôc hơn
ENV: # thiết lập biến môi trường cho image
ARG: # thiết lập biến môi trường khi build
WORKDIR: # thiết lập thư mục làm việc
EXPOSE: # Mô tả cổng mở ra ngoài (chỉ làm tài ENVliệu)
LABEL: # Thêm metadata
USER, VOLUMN: # các chỉ thị khác cũng tạo layer
Enter fullscreen mode Exit fullscreen mode

Lưu ý: Việc sắp xếp và gom các lệnh RUN cũng giúp giảm số lượng layer (ví dụ: dùng && để nối nhiều lệnh).


2. ENV vs ARG – khác nhau thế nào?

ARG – Dùng trong lúc build

ARG NODE_VERSION=18
FROM node:${NODE_VERSION}
Enter fullscreen mode Exit fullscreen mode
  • ARG chỉ dùng trong quá trình build, không tồn tại khi container chạy.
  • Có thể truyền giá trị với --build-arg.

ENV – Dùng khi container chạy

ENV NODE_ENV=production
Enter fullscreen mode Exit fullscreen mode
  • ENV tồn tại cả trong lúc build khi container chạy.
  • Có thể ghi đè bằng docker run -e.

Tóm lại:

Đặc điểm ARG ENV
Dùng lúc build
Dùng lúc run không
Truyền từ CLI --build-arg -e
Có trong image không

3. CMD vs ENTRYPOINT – khác nhau?

CMD

CMD ["node", "app.js"]
Enter fullscreen mode Exit fullscreen mode
  • lệnh mặc định, có thể ghi đè khi docker run.

ENTRYPOINT

ENTRYPOINT ["node"]
CMD ["app.js"]
Enter fullscreen mode Exit fullscreen mode
  • ENTRYPOINT giống như "lệnh bắt buộc", không dễ ghi đè.
  • Thường kết hợp CMD để truyền thêm args.

So sánh nhanh:

Đặc điểm CMD ENTRYPOINT
Ghi đè bằng CLI không (phải dùng --entrypoint)
Dùng mặc định
Ưu tiên hơn không

4. Cách dùng docker build và docker run

Build image:

docker build -t myapp:latest .
Enter fullscreen mode Exit fullscreen mode
  • -t đặt tên image.
  • . là thư mục chứa Dockerfile.

Truyền ARG:

docker build --build-arg NODE_VERSION=20 -t myapp:node20 .
Enter fullscreen mode Exit fullscreen mode

Run container:

docker run -d -p 3000:3000 --name myapp myapp:latest
Enter fullscreen mode Exit fullscreen mode
  • -d: chạy nền.
  • -p: ánh xạ cổng.
  • --name: đặt tên container.

Truyền ENV khi run:

docker run -e NODE_ENV=production myapp
Enter fullscreen mode Exit fullscreen mode

Kết luận

  • Hiểu rõ cách Docker tạo layer sẽ giúp bạn viết Dockerfile tối ưu.
  • Sử dụng đúng ENV, ARG, CMD, ENTRYPOINT giúp container linh hoạt và dễ tái sử dụng.

Top comments (0)