Xây dựng một Docker Image từ Dockerfile

Xây dựng một Docker Image từ Dockerfile

Vấn đề

Trong các bài viết trước, chúng ta đã tìm hiểu Docker Image là thành phần quan trọng để chạy một container. Nhưng làm cách nào để tạo ra Docker Image? Đó là lúc chúng ta cần đến Dockerfile.

Dockerfile chứa các chỉ dẫn từng bước để xây dựng Docker Image. Hiểu rõ cách sử dụng Dockerfile sẽ giúp bạn tối ưu hóa quá trình đóng gói ứng dụng.

Câu lệnh cơ bản khi làm việc với Docker Image

Một số lệnh thường dùng

  • docker build -t IMAGE[:TAG] PATH: Xây dựng Docker Image từ Dockerfile.
  • docker pull IMAGE[:TAG|@DIGEST]: Tải Image từ registry về máy.
  • docker push IMAGE[:TAG]: Đẩy Image lên registry.
  • docker images: Liệt kê các Image trên máy.
  • docker rmi IMAGE[:TAG]: Xóa một Image.

Ví dụ:

docker build -t my-app .
docker run -p 3000:3000 my-app

Các thành phần cơ bản của Dockerfile

Dockerfile sử dụng các từ khóa để định nghĩa từng bước trong quá trình tạo Docker Image. Dưới đây là những chỉ dẫn phổ biến:

1. FROM

  • Ý nghĩa: Xác định Image cơ sở mà Docker Image của bạn sẽ dựa vào.

  • Cú pháp:

    FROM <base-image>:<tag>
  • Ví dụ:

    FROM node:20

2. WORKDIR

  • Ý nghĩa: Thiết lập thư mục làm việc mặc định cho các lệnh tiếp theo trong Dockerfile.

  • Cú pháp:

    WORKDIR /path/to/directory
  • Ví dụ:

    WORKDIR /app

3. COPYADD

  • COPY: Sao chép file từ máy host vào container.

  • ADD: Giống COPY, nhưng hỗ trợ giải nén file và tải file từ URL.

  • Cú pháp:

    COPY <source> <destination>
    ADD <source> <destination>
  • Ví dụ:

    COPY package.json .
    ADD https://example.com/config.tar.gz /app/config/

4. RUN

  • Ý nghĩa: Thực thi các lệnh trong quá trình build Image.

  • Cú pháp:

    RUN <command>
  • Ví dụ:

    RUN npm install

5. EXPOSE

  • Ý nghĩa: Ghi chú cổng mà container sẽ lắng nghe, không mở cổng thực sự.

  • Cú pháp:

    EXPOSE <port>
  • Ví dụ:

    EXPOSE 3000

6. ENTRYPOINTCMD

  • ENTRYPOINT: Xác định lệnh chính mà container sẽ chạy.

  • CMD: Cung cấp tham số mặc định cho ENTRYPOINT hoặc lệnh mặc định nếu ENTRYPOINT không được định nghĩa.

  • Cú pháp:

    ENTRYPOINT ["executable", "param1", "param2"]
    CMD ["param3", "param4"]
  • Ví dụ:

    ENTRYPOINT ["node"]
    CMD ["app.js"]

Khi container chạy, lệnh thực thi sẽ là:

node app.js

Tạo Docker Image từ Dockerfile

Dockerfile mẫu

Dưới đây là một Dockerfile để chạy ứng dụng Node.js:

# Chọn base image Node.js
FROM node:20

# Thiết lập thư mục làm việc
WORKDIR /app

# Copy source code và cài đặt dependencies
COPY . .
RUN npm install

# Ghi chú cổng ứng dụng
EXPOSE 3000

# Chỉ định lệnh chạy ứng dụng
CMD ["node", "app.js"]

Build và chạy Image

  • Build Docker Image:

    docker build -t node-app .
  • Chạy container từ Image:

    docker run -p 3000:3000 node-app

Kết luận

Dockerfile là công cụ mạnh mẽ giúp bạn tự động hóa quá trình tạo Docker Image. Hiểu rõ cách sử dụng các từ khóa trong Dockerfile sẽ giúp bạn xây dựng các Image tối ưu và triển khai ứng dụng dễ dàng hơn.

Bài viết tiếp theo sẽ tập trung vào các best practices khi viết Dockerfile và tối ưu hiệu suất container. Cảm ơn bạn đã theo dõi!

Tham khảo