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áydocker push IMAGE[:TAG]
: đẩy image lên registrydocker images ls
: liệt kê các image trên máydocker 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.param1
,param2
là các tham số cho lệnh. Ví dụ để chạy một app NodeJs, ta có thể sử dụngENTRYPOINT
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.