2.1 Các khái niệm cơ bản về Dockerfile
Dockerfile — là một file văn bản
, chứa một chuỗi các lệnh mà Docker sử dụng để tạo image. Nó hoạt động như một "công thức", mô tả cách xây dựng image từ lớp cơ bản đến trạng thái cuối cùng. Hiểu cấu trúc và quy trình tạo Dockerfile là rất quan trọng để sử dụng Docker hiệu quả.
Các khái niệm cơ bản của Dockerfile:
- Idempotency: các lệnh trong Dockerfile cần phải idempotent — thực thi lặp lại sẽ cho ra cùng một kết quả.
- Trình tự: các lệnh được thực thi theo thứ tự từ trên xuống dưới. Thứ tự rất quan trọng vì mỗi lệnh tạo một lớp mới trong image.
- Cấu trúc theo lớp: gần như mỗi chỉ thị đều thêm một lớp mới vào image. Những lớp này được cache, giúp tối ưu hóa quá trình build.
Cấu trúc của Dockerfile:
Dockerfile bao gồm các chỉ thị, mỗi chỉ thị thực hiện một chức năng cụ thể. Đây là một số chỉ thị chính:
- FROM: xác định image cơ bản sẽ được sử dụng để tạo image mới.
- MAINTAINER: xác định tác giả của Dockerfile (đã lỗi thời nhưng vẫn hữu ích để tham khảo).
- RUN: thực thi các lệnh trong container và tạo một lớp mới.
- COPY: sao chép file và thư mục từ context build vào file system của container.
- ADD: sao chép file và thư mục, hỗ trợ giải nén archive và tải file qua URL.
- WORKDIR: đặt thư mục làm việc cho các lệnh tiếp theo.
- ENV: đặt biến môi trường.
- CMD: xác định lệnh mặc định sẽ được thực thi khi container khởi động.
- ENTRYPOINT: xác định lệnh được thực thi khi container khởi động, có thể truyền tham số.
- EXPOSE: chỉ định các port mà container sử dụng.
- VOLUME: tạo điểm mount cho các volume bên ngoài.
2.2 Tạo Dockerfile
Ví dụ tạo Dockerfile
Hãy xem ví dụ đơn giản về tạo Dockerfile cho ứng dụng web bằng Node.js.
Bước 1: Tạo Dockerfile cơ bản
Tạo file với tên Dockerfile
trong thư mục gốc của dự án và thêm các dòng sau:
# Sử dụng image cơ bản Node.js
FROM node:14
# Đặt thư mục làm việc
WORKDIR /app
# Sao chép package.json và package-lock.json
COPY package*.json ./
# Cài đặt dependencies
RUN npm install
# Sao chép toàn bộ file dự án
COPY . .
# Chỉ định port mà ứng dụng sẽ sử dụng
EXPOSE 3000
# Xác định lệnh để khởi chạy ứng dụng
CMD ["node", "app.js"]
Dockerfile này thực hiện các thao tác sau:
- FROM node:14: sử dụng image chính thức
Node.js
phiên bản 14 làm cơ bản. - WORKDIR /app: đặt thư mục làm việc cho các lệnh tiếp theo.
- COPY package*.json ./: sao chép các file
package.json
vàpackage-lock.json
vào thư mục làm việc. - RUN npm install: cài đặt dependencies từ
package.json
. - COPY . .: sao chép toàn bộ file dự án vào thư mục làm việc của container.
- EXPOSE 3000: chỉ định rằng ứng dụng sẽ sử dụng port 3000.
- CMD ["node", "app.js"]: xác định lệnh để khởi chạy ứng dụng.
Bước 2: Build image
Sau khi tạo Dockerfile, build image bằng lệnh docker build
:
docker build -t my-node-app .
Lệnh này sẽ tạo ra image với tên my-node-app
, sử dụng Dockerfile từ thư mục hiện tại.
Bước 3: Chạy container
Chạy container dựa trên image vừa tạo bằng lệnh docker run
:
docker run -d -p 3000:3000 my-node-app
Ví dụ này chạy container dưới chế độ nền, ánh xạ port 3000 của container tới port 3000 của máy chủ. Bây giờ bạn có thể truy cập ứng dụng thông qua http://localhost:3000
.
2.3 Các lệnh bổ sung của Dockerfile
1. Cài đặt biến môi trường
Bạn có thể đặt các biến môi trường, sẽ có sẵn trong container, bằng cách sử dụng lệnh ENV
.
ENV NODE_ENV=production
2. Sử dụng nhiều lệnh RUN
Đôi khi nên kết hợp nhiều lệnh trong một lệnh RUN
, để giảm số lượng lớp, giảm kích thước image và tăng tốc quá trình build.
RUN apt-get update && apt-get install -y \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
Hữu ích! Nếu lệnh không thể nằm gọn trong một dòng, bạn có thể sử dụng ký tự \
để tiếp tục trên dòng tiếp theo. Điều này sẽ được coi như một lệnh duy nhất.
Hữu ích! Để viết nhiều lệnh trong một dòng, bạn có thể sử dụng &&
: command1 && command2 && command3
. Điều này cho phép thực hiện nhiều lệnh liên tiếp.
Tối ưu hóa thứ tự các lệnh
Để sử dụng cache Docker hiệu quả, hãy sao chép các file ít thay đổi nhất trước (ví dụ, package.json
) và cài đặt các dependency trước khi thêm các file khác của dự án.
Ví dụ Dockerfile nâng cao
Trong các dự án phức tạp hơn, có thể cần một Dockerfile mở rộng với các thiết lập bổ sung.
# Sử dụng image Node.js cơ bản nhỏ gọn nhất
FROM node:14-alpine
# Thiết lập thư mục làm việc
WORKDIR /usr/src/app
# Sao chép package.json và cài đặt các dependency
COPY package*.json ./
RUN npm install --only=production
# Sao chép mã nguồn
COPY . .
# Chỉ định port sử dụng
EXPOSE 8080
# Thiết lập biến môi trường
ENV NODE_ENV=production
# Chạy ứng dụng
CMD ["node", "server.js"]
GO TO FULL VERSION