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
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}
-
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
-
ENV
tồn tại cả trong lúc build và 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 | có | có |
Dùng lúc run | không | có |
Truyền từ CLI | có --build-arg
|
có -e
|
Có trong image | không | có |
3. CMD vs ENTRYPOINT – khác nhau?
CMD
CMD ["node", "app.js"]
- Là lệnh mặc định, có thể ghi đè khi
docker run
.
ENTRYPOINT
ENTRYPOINT ["node"]
CMD ["app.js"]
-
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 | có | không (phải dùng --entrypoint ) |
Dùng mặc định | có | có |
Ưu tiên hơn | không | có |
4. Cách dùng docker build và docker run
Build image:
docker build -t myapp:latest .
-
-t
đặt tên image. -
.
là thư mục chứaDockerfile
.
Truyền ARG
:
docker build --build-arg NODE_VERSION=20 -t myapp:node20 .
Run container:
docker run -d -p 3000:3000 --name myapp myapp:latest
-
-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
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)