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

Dockerfile là một tệp chứa các chỉ dẫn để xây dựng một Docker Image. Mỗi chỉ dẫn sẽ được viết trên một dòng riêng biệt và bắt đầu bằng một từ khóa. Phần lớn các Image mà chúng ta tạo ra đều dựa trên một Image đã có từ trước.

Authors
  • avatar
    Name
    Thanh Pham
    Github
    @thanhtpham
    Reading time
    4 min read
    Published on
Xây dựng một Docker Image từ Dockerfile

Nhắc lại kiến thức

Như tôi đã đề cập ở phần trước, Docker Image là một file cần thiết để chạy một container hay một ứng dụng. Nó được tạo ra từ Dockerfile. Để build một Docker Image từ Dockerfile, chúng ta sử dụng lệnh:

docker build -t <image-name> <path-to-dockerfile>

Trong đó:

  • -t là một option để đặt tên cho Image.
  • <image-name> là tên của Image.
  • <path-to-dockerfile> là đường dẫn đến Dockerfile.

Ngoài ra, còn 1 số câu lệnh thường hay sử dụng để thao tác với Image:

  • docker pull IMAGE[:TAG|@DIGEST]: Tải image từ registry về máy.
  • docker build -t IMAGE[:TAG] PATH: Tạo image từ Dockerfile.
  • 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 image.

Dockerfile

Dockerfile là một tệp chứa các chỉ dẫn để xây dựng một Docker Image. Mỗi chỉ dẫn sẽ được viết trên một dòng riêng biệt và bắt đầu bằng một từ khóa. Phần lớn các Image mà chúng ta tạo ra đều dựa trên một Image đã có sẵn, các ứng dụng dựa trên một nền tảng cụ thể thường có base image sẵn có trên Docker Hub do nhà cung cấp phát hành. Nói một cách ngắn gọn, quan điểm khi xây dựng một image có thể chạy được ứng dụng của bạn là nó phải dựa trên một image phù hợp với ứng dụng đó.

FROM

FROM là chỉ dẫn đầu tiên trong Dockerfile, nó xác định image cơ sở mà image mới sẽ dựa trên. Một Dockerfile phải bắt đầu bằng một chỉ dẫn FROM. Ví dụ:

FROM node:20

WORKDIR

WORKDIR là chỉ dẫn để thiết lập thư mục làm việc cho các chỉ dẫn tiếp theo trong Dockerfile. Ví dụ:

WORKDIR /app

RUN pwd

Khi chạy lệnh RUN pwd, nó sẽ trả về /appWORKDIR đã thiết lập thư mục làm việc là /app.

COPY và ADD

COPYADD là 2 chỉ dẫn giúp chúng ta sao chép các file từ máy host vào container. Hầu hết bạn luôn cần một trong 2 lệnh này, vì phải copy source code vào thì mới có cái để chạy chứ. Điểm khác biệt giữa COPY và ADD là ADD hỗ trợ nén file và URL. Ví dụ:

COPY package.json .
ADD https://example.com/file.txt .

EXPOSE

EXPOSE trong Docker hoạt động như một loại tài liệu, nó không thực sự mở cổng trên container. Nó chỉ đơn giản là một cách để thông báo cho người dùng biết rằng container này sẽ lắng nghe trên cổng nào. Ví dụ:

EXPOSE 3000

Khi chạy container, tôi có thể biết được container này đang hoạt động ở cổng 3000 và tôi có thể ánh xạ cổng 3000 của container với cổng 3000 của máy chủ.

Entrypoint

ENTRYPOINT là chỉ dẫn để thiết lập lệnh mặc định mà container sẽ chạy khi khởi động. Bạn không thể ghi đè lệnh này khi chạy container trừ khi bạn sử dụng tùy chọn --entrypoint.

Cú pháp:

ENTRYPOINT ["executable", "param1", "param2"]

Trong đó:

  • executable là lệnh mà bạn muốn chạy.
  • param1, param2 là các tham số cho lệnh.

Ví dụ:

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

CMD

CMD là chỉ dẫn để thiết lập các tham số mặc định mà bạn muốn container chạy khi nó được khởi động. Lệnh này chỉ được thực thi khi không có lệnh khác được truyền vào khi chạy container.

CMD ["executable","param1","param2"]

# Ví dụ
CMD ["node", "app.js"]

Xây dựng Docker Image đơn giản

Từ những kiến thức trên, chúng ta sẽ xây dựng một Docker Image đơn giản để chạy một ứng dụng NodeJs.

FROM node:20

WORKDIR /app

COPY . .

RUN npm install

EXPOSE 3000

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

Để build Docker Image từ Dockerfile trên, chúng ta sử dụng lệnh:

docker build -t node-app .

Sau khi build xong, chúng ta có thể chạy container từ Image vừa tạo ra bằng lệnh:

docker run -p 3000:3000 node-app

Kết luận

Như vậy, chúng ta đã tìm hiểu cách xây dựng một Docker Image từ Dockerfile. Trong phần tiếp theo, chúng ta sẽ tìm hiểu sâu hơn về nó và cách sử dụng Dockerfile hiệu quả hơn. Cảm ơn các bạn đã theo dõi bài viết này.

Tham khảo