Trong thế giới DevOps và Automation, một trong những kỹ năng “sống còn” chính là xây dựng Docker image sao cho ổn định, có thể lặp lại, và dễ bảo trì. Và chìa khóa nằm ở Dockerfile – nơi định nghĩa toàn bộ quá trình build container một cách có cấu trúc.
Khi bạn dùng Dockerfile, không chỉ Developer mà cả Ops đều có thể:
👉 Sau khi build xong, image trở thành artifact có thể đưa lên Docker Image Registry (Docker Hub, GitLab, ECR, v.v). Tại đây, image được gắn version/tag, quản lý vòng đời, và thậm chí trở thành golden image chuẩn của tổ chức.
🧩 Cấu trúc cơ bản của một Dockerfile
Một Dockerfile bao gồm các instruction (luôn viết hoa để dễ phân biệt) và arguments (tham số). Quá trình build diễn ra từ trên xuống dưới.
🔑 Các lệnh thường gặp:
📌 Khác biệt CMD vs ENTRYPOINT:
📦 Ví dụ Dockerfile thực tế
FROM registry.git.lab/cisco-devops/containers/python37:latest # metadata LABEL description="Net inventory flask app" LABEL maintainer="Cisco <noreply@cisco.com>" LABEL version="0.1" # copy code COPY ./ /net_inventory WORKDIR /net_inventory/ # install packages RUN apt install -y git vim RUN pip install -r ./requirements.txt # set env ENV ENV=DEVELOPMENT # tài liệu hóa port EXPOSE 5000/tcp # chạy app ENTRYPOINT python run.py
🎯 Kết luận
Sử dụng Dockerfile giúp:
Trong CI/CD pipelines, Dockerfile là trung tâm để biến code thành artifact chạy được ở bất kỳ môi trường nào – từ laptop dev, staging cho tới production.
Anh em DevOps/Automation engineer, khi viết Dockerfile, bạn có đang dùng CMD hay ENTRYPOINT cho ứng dụng chính? Hay kết hợp cả hai để tận dụng linh hoạt? 👇
Khi bạn dùng Dockerfile, không chỉ Developer mà cả Ops đều có thể:
- Hiểu rõ cách container được build.
- Biết chính xác những gì đang chạy bên trong container.
- Có tài liệu rõ ràng về các tác vụ chính.
👉 Sau khi build xong, image trở thành artifact có thể đưa lên Docker Image Registry (Docker Hub, GitLab, ECR, v.v). Tại đây, image được gắn version/tag, quản lý vòng đời, và thậm chí trở thành golden image chuẩn của tổ chức.
🧩 Cấu trúc cơ bản của một Dockerfile
Một Dockerfile bao gồm các instruction (luôn viết hoa để dễ phân biệt) và arguments (tham số). Quá trình build diễn ra từ trên xuống dưới.
🔑 Các lệnh thường gặp:
- FROM: chọn base image (bắt buộc phải có).
- LABEL: thêm metadata (tác giả, version, mô tả).
- COPY / ADD: copy file/thư mục vào container. (ADD hỗ trợ URL và auto extract .tar).
- WORKDIR: đổi thư mục làm việc (tương tự cd).
- RUN: chạy lệnh bên trong container (vd: apt install, pip install).
- ENV: set biến môi trường (ví dụ: ENV=DEVELOPMENT).
- EXPOSE: tài liệu hóa cổng sẽ dùng (không tự mở port).
- CMD: lệnh mặc định khi container chạy (có thể bị override khi docker run ...).
- ENTRYPOINT: lệnh cố định sẽ chạy khi container start.
📌 Khác biệt CMD vs ENTRYPOINT:
- CMD: chỉ chạy nếu docker run không chỉ định lệnh. Có thể bị ghi đè.
- ENTRYPOINT: luôn chạy, đảm bảo container thực thi đúng mục đích.
📦 Ví dụ Dockerfile thực tế
FROM registry.git.lab/cisco-devops/containers/python37:latest # metadata LABEL description="Net inventory flask app" LABEL maintainer="Cisco <noreply@cisco.com>" LABEL version="0.1" # copy code COPY ./ /net_inventory WORKDIR /net_inventory/ # install packages RUN apt install -y git vim RUN pip install -r ./requirements.txt # set env ENV ENV=DEVELOPMENT # tài liệu hóa port EXPOSE 5000/tcp # chạy app ENTRYPOINT python run.py
🎯 Kết luận
Sử dụng Dockerfile giúp:
- Đảm bảo tính nhất quán (build ở đâu cũng ra kết quả như nhau).
- Tự động hóa build container image.
- Quản lý version và phân phối ứng dụng dễ dàng hơn.
Trong CI/CD pipelines, Dockerfile là trung tâm để biến code thành artifact chạy được ở bất kỳ môi trường nào – từ laptop dev, staging cho tới production.
Anh em DevOps/Automation engineer, khi viết Dockerfile, bạn có đang dùng CMD hay ENTRYPOINT cho ứng dụng chính? Hay kết hợp cả hai để tận dụng linh hoạt? 👇