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
- Name
- Thanh Pham
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ề /app
vì WORKDIR
đã thiết lập thư mục làm việc 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 .
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.