(Docker P.3) Xây dựng Image từ Dockerfile

3 min read

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à tùy chọn để đặt tên cho Docker Image.
  • <image-name> là tên của Docker 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 push IMAGE[:TAG]: đẩy image lên registry
  • docker images ls: liệt kê các image trên máy
  • docker rmi IMAGE[:TAG]: xóa image trên máy

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:18

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ẽ in ra /app vì thư mục làm việc hiện tại đã được thiết lập là /app.

COPY và ADD

COPY và ADD 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 .

EXPOSE

Lệnh 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ủ.

docker run -p 3000:3000 <image-name>

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 khi chạy container. Cú pháp của ENTRYPOINT:

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

Trong đó:

  • executable là lệnh cần chạy.
  • param1param2 là các tham số cho lệnh. Ví dụ để chạy một app NodeJs, ta có thể sử dụng ENTRYPOINT như sau:
ENTRYPOINT ["node", "app.js"]

CMD

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

Cú pháp của CMD:

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

Ví dụ:

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

Xây dựng một Image đầu tiê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:18

WORKDIR /app

COPY . .

RUN npm install

EXPOSE 3000

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

Để xây dựng 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.

Tài liệu tham khảo

Dockerfile reference | Docker Docs

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *