Docker - Dockerfile: Hướng dẫn dành cho người mới bắt đầu

Xin chào các nhà法师 Docker tương lai! Tôi rất vui mừng được làm hướng dẫn viên của bạn trong hành trình thú vị này vào thế giới của Dockerfiles. Như một ai đó đã dạy khoa học máy tính trong nhiều năm, tôi đã thấy biết bao nhiêu sinh viên ánh lên khi họ nắm bắt được sức mạnh của việc containerization. Vậy, hãy c rolled up our sleeves and dive in!

Docker - Dockerfile

Dockerfile là gì?

Trước khi chúng ta bắt đầu xây dựng, hãy hiểu rõ chúng ta đang làm việc với điều gì. Một Dockerfile giống như một công thức để tạo ra các hình ảnh Docker. Cũng như một đầu bếp theo một công thức để nấu một món ăn ngon, Docker sử dụng Dockerfile để nấu một hình ảnh tùy chỉnh. Hình ảnh này chứa mọi thứ cần thiết để ứng dụng của bạn chạy, được gói gọn trong một container di động.

Hướng dẫn quan trọng trong Dockerfile

Bây giờ, hãy xem xét các nguyên liệu chính trong công thức Dockerfile của chúng ta. Các hướng dẫn này là những khối xây dựng của hình ảnh của chúng ta.

Hướng dẫn Mô tả
FROM Xác định hình ảnh cơ sở
RUN Thực thi các lệnh trong một lớp mới
CMD Cung cấp mặc định cho một container đang chạy
EXPOSE Thông báo cho Docker rằng container lắng nghe trên các cổng mạng đã chỉ định
ENV Đặt các biến môi trường
ADD Sao chép các tệp, thư mục hoặc URL tệp 远程
COPY Sao chép các tệp hoặc thư mục mới
ENTRYPOINT Cấu hình một container sẽ chạy như một tệp thực thi
VOLUME Tạo một điểm mount cho các volume được mount từ bên ngoài
USER Đặt tên người dùng cho các lệnh RUN / CMD / ENTRYPOINT tiếp theo
WORKDIR Đặt thư mục làm việc
ARG Định nghĩa một biến mà người dùng có thể truyền tại thời điểm build
ONBUILD Thêm một hướng dẫn kích hoạt khi hình ảnh được sử dụng làm cơ sở cho một build khác

Hãy phân tích chúng với một số ví dụ:

FROM

FROM ubuntu:20.04

Dòng này告诉 Docker sử dụng hình ảnh Ubuntu 20.04 làm điểm khởi đầu. Nó giống như nói, "Tôi muốn xây dựng ngôi nhà của mình trên mảnh đất cụ thể này."

RUN

RUN apt-get update && apt-get install -y python3

Lệnh này cập nhật danh sách gói và cài đặt Python 3. Nó giống như đi đến cửa hàng công cụ và mua các công cụ bạn cần cho ngôi nhà.

CMD

CMD ["python3", "app.py"]

Điều này đặt lệnh mặc định để chạy khi container khởi động. Nó giống như 设置 up a welcome mat at your front door.

Practices tốt cho Dockerfile

Bây giờ chúng ta đã biết các nguyên liệu, hãy nói về cách sử dụng chúng hiệu quả:

  1. Giữ cho nó gọn nhẹ: Sử dụng các hình ảnh cơ sở tối thiểu khi có thể. Alpine Linux là một lựa chọn phổ biến nhờ kích thước nhỏ của nó.

  2. Lớp thông minh: Kết hợp các lệnh RUN để giảm lớp. Ví dụ:

RUN apt-get update && \
apt-get install -y python3 && \
apt-get clean
  1. Sử dụng .dockerignore: Giống như .gitignore, tệp này giúp bạn loại trừ các tệp không cần thiết khỏi ngữ cảnh build.

  2. Leverage build cache: Sắp xếp các hướng dẫn của bạn từ ít thay đổi nhất đến nhiều thay đổi nhất để tối ưu hóa thời gian build.

  3. Sử dụng các thẻ cụ thể: Thay vì FROM ubuntu, sử dụng FROM ubuntu:20.04 để đảm bảo tính nhất quán.

Ví dụ Dockerfile

Hãy kết hợp tất cả với một ứng dụng web Python đơn giản:

# Sử dụng một hình ảnh Python chính thức làm hình ảnh cha
FROM python:3.9-slim

# Đặt thư mục làm việc trong container
WORKDIR /app

# Sao chép nội dung thư mục hiện tại vào container tại /app
COPY . /app

# Cài đặt bất kỳ gói nào được chỉ định trong requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Làm cho cổng 80 khả dụng cho thế giới bên ngoài container này
EXPOSE 80

# Định nghĩa biến môi trường
ENV NAME World

# Chạy app.py khi container khởi động
CMD ["python", "app.py"]

Dockerfile này thiết lập một môi trường Python, sao chép ứng dụng của chúng ta vào container, cài đặt các phụ thuộc, expose một cổng, đặt một biến môi trường và chỉ định lệnh để chạy ứng dụng của chúng ta.

Làm thế nào để nó hoạt động?

Khi bạn chạy docker build, Docker đọc Dockerfile từng dòng, thực thi từng hướng dẫn theo thứ tự. Mỗi hướng dẫn tạo ra một lớp mới trong hình ảnh. Các lớp này được cache, có nghĩa là nếu bạn thay đổi ứng dụng của mình nhưng không thay đổi Dockerfile, Docker có thể sử dụng lại các lớp chưa thay đổi, tăng tốc quá trình build.

Nó giống như xây dựng một chiếc bánh layer cake. Mỗi hướng dẫn thêm một lớp mới, và nếu bạn không thay đổi các lớp dưới, bạn chỉ cần thêm các lớp mới trên đỉnh mà không cần làm lại toàn bộ bánh.

Kết luận

Chúc mừng! Bạn đã vừa bước những bước đầu tiên vào thế giới của Dockerfiles. Nhớ rằng, như bất kỳ kỹ năng nào, việc thành thạo Dockerfiles đòi hỏi sự thực hành. Đừng sợ hãi khi thử nghiệm và mắc lỗi - đó là cách chúng ta học hỏi!

Trong hành trình Docker của bạn, bạn sẽ khám phá rằng Dockerfiles là những công cụ vô cùng mạnh mẽ để tạo ra các môi trường và triển khai có thể reproduce. Chúng là bí quyết giúp Docker trở nên ngon lành cho cả các nhà phát triển và đội ngũ运维.

Câu hỏi thường gặp

Q: Tôi có thể sử dụng nhiều lệnh FROM trong một Dockerfile không?

A: Có, điều này được gọi là build đa giai đoạn. Nó rất hữu ích cho việc tạo ra các hình ảnh cuối cùng nhỏ hơn bằng cách để lại các phụ thuộc build phía sau.

Q: Sự khác biệt giữa CMD và ENTRYPOINT là gì?

A: CMD cung cấp các đối số mặc định có thể bị覆盖, trong khi ENTRYPOINT xác định lệnh chính của container mà khó bị覆盖 hơn.

Q: Tôi có thể tối ưu hóa Dockerfile của mình để build nhanh hơn không?

A: Sử dụng tệp .dockerignore, leverage build cache bằng cách sắp xếp các hướng dẫn một cách khôn ngoan, và kết hợp các lệnh RUN để giảm lớp.

Q: Tôi có thể sử dụng các biến môi trường trong Dockerfile không?

A: Chắc chắn rồi! Sử dụng lệnh ENV để đặt các biến môi trường sẽ khả dụng cho ứng dụng của bạn tại thời điểm chạy.

Tiếp tục khám phá, tiếp tục xây dựng, và quan trọng nhất, hãy vui vẻ với Docker! Nhớ rằng, mỗi người thợ giỏi đều từng là người mới bắt đầu. Chúc bạn vui vẻ với Docker!

Credits: Image by storyset