Hệ thống đa phương tiện docker xây dựng là gì?

Đa giai đoạn được xây dựng được đưa ra ở Docker 17.05 cho phép bạn sử dụng nhiều lời phát biểu trong một tập tin Docker duy nhất. Mỗi [FLT: 1] hướng dẫn bắt đầu một giai đoạn mới, có thể có ảnh cơ bản riêng, phụ thuộc và lệnh riêng. Các tác vụ có thể được sao chép chọn chọn trong một giai đoạn, trong khi ảnh cuối chỉ giữ những gì cần thiết cho ứng dụng đang chạy. Cách này loại bỏ các tập tin dây xích hoặc phụ thuộc vào tập tin cấu hình, và giảm đáng kể kích cỡ ảnh đã được biên dịch, và các thư viện, và tập tin môi trường phát triển.

Ý tưởng chính là tách môi trường xây dựng ra môi trường thời gian chạy. Trong một giai đoạn xây dựng điển hình, một nhà phát triển cài đặt tất cả các công cụ xây dựng (v. d., biên dịch, bộ quản lý gói, khung thử nghiệm) trong cùng một hình ảnh sẽ được dùng cho sản xuất. Trong đó, nó làm tăng bề mặt tấn công. Nhiều giai đoạn xây dựng nên giải pháp này bằng cách sử dụng một hình ảnh dày, phong phú để tính năng tính toán và sau đó chỉ sao chép các đồ tạo tác thành một hình ảnh chạy tối thiểu như[FL2] hoặc [L]. [F:].].

Lợi ích của việc xây dựng nhiều nền tảng

Lợi thế của việc chấp nhận nhiều giai đoạn xây dựng vượt xa những sự giảm thiểu kích thước đơn giản. chúng có ảnh hưởng sâu sắc đến an ninh, khả năng duy trì và tốc độ triển khai.

1. Cỡ ảnh giảm

Bằng cách hủy bỏ các quan hệ phụ thuộc có sẵn, nhiều giai đoạn thường thu nhỏ ảnh đến 50%. Lấy thí dụ, một ứng dụng Node.js xây dựng bằng cơ sở đầy đủ (hơn 300MB) có thể được cắt nhỏ xuống dưới 20MB bằng cách sao chép chỉ thư mục thành một [FLT: 6). Giá trị lưu trữ này được dịch trực tiếp để kéo nhanh hơn, ít băng thông, và chi phí đăng nhập thấp hơn.

2. cải thiện an ninh

Mỗi gói hoặc công cụ đã cài đặt trong ảnh công-ten là một khả năng dễ bị tổn thương. Nhiều giai đoạn xây dựng cho phép bạn gỡ bỏ các biên dịch, gỡ lỗi và phát triển các thư viện từ ảnh cuối cùng, giảm đáng kể bề mặt tấn công. Bạn thậm chí có thể sử dụng hình ảnh như hoặc cho thời gian chạy, mà chỉ chứa ít nhất để thực hiện nhị phân ứng dụng.

3. Tiến trình xây dựng dòng chảy

Tất cả các bước xây dựng được định nghĩa trong một tập tin Docker, làm cho tiến trình tự quản lý và dễ dàng phiên bản. Đường ống CI/CD được lợi ích từ một điểm nhập duy nhất: tập tin Docker. Không cần duy trì các bước cấu hình riêng lẻ hoặc làm sạch thủ công.

4. Tính nhẫn nại và tính nhất quán tăng lên

Vì toàn bộ cấu trúc được chụp trong một tập tin Docker, bất kỳ nhà phát triển hay hệ thống nào cũng có thể tái tạo các lớp giống nhau. sử dụng các thẻ phiên bản riêng biệt cho các ảnh cơ bản đảm bảo các việc xây dựng nhất quán trên môi trường.

Xây dựng tập tin đa hệ thống:

Chương trình này bao gồm việc tạo ra một sản phẩm của tập tin sản xuất đa giai đoạn docker dành cho ứng dụng nút.js. Nguyên tắc tương tự được áp dụng cho bất kỳ ngôn ngữ soạn thảo nào.

1.

Trước khi viết ra mã, hãy vẽ ra những giai đoạn cần thiết.

  • Giai đoạn – cài đặt mọi công cụ xây dựng, cài đặt quan hệ phụ thuộc, và chạy lệnh xây dựng.
  • Giai đoạn ) – chỉ sử dụng hình ảnh cơ bản tối thiểu, chỉ sao chép các hiện vật được xây dựng từ sân khấu xây dựng, và xác định hành vi chạy thời gian.

Đối với các dự án phức tạp, bạn có thể thêm các giai đoạn trung gian cho các bài kiểm tra, phân tích tĩnh, hoặc nén tài sản.

2. Hãy viết giai đoạn của người xây cất

Bắt đầu với ảnh cơ bản gồm các công cụ cần thiết. Hãy dùng [FLT: 0] giai đoạn với để tham khảo chúng sau này. Đối với Node.js:

FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

Điểm chính:

  • Dùng để cài đặt quan hệ phụ thuộc nhanh hơn, xác định và nhanh hơn.
  • Giữ lệnh là các lớp riêng biệt khi có thể để gây nhiễu đòn bẩy.
  • Cài đặt công cụ xây dựng (như TypeSQUM, webpack) chỉ trong giai đoạn này.

3. Thêm giai đoạn thử nghiệm liên tục (Thỉnh thoảng)

Để áp dụng chất lượng mã, hãy thêm một giai đoạn chạy thử. Giai đoạn này có thể sử dụng lại ảnh xây dựng hoặc cài đặt công cụ bổ sung. Vì nó không phải là giai đoạn cuối, nên không có lỗi thử ra trong ảnh cuối cùng.

FROM builder AS test
RUN npm run test

Bạn có thể chạy sân khấu này trong ống dẫn của bạn để bắt những thất bại sớm mà không cần phải xây dựng toàn bộ hình ảnh cuối cùng.

4 Xác định giai đoạn chạy

Đối với ứng dụng phản ứng, ảnh thời gian chạy có thể là máy phục vụ NIginx. Đối với hậu phương ADI, nó có thể là ảnh cơ sở không có tên, hoặc ảnh Alpine tối thiểu có chạy Node.js. Chỉ sao chép các đồ tạo tác cần thiết dùng .

FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Nếu bạn cần thời gian chạy Node, hãy tránh sao chép từ người xây dựng; thay vào đó cài đặt lại quan hệ phụ thuộc sản xuất trong giai đoạn chạy:

FROM node:14-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]

Xây dựng và thử ảnh

Xây dựng ảnh cuối cùng bằng lệnh chuẩn:

docker build -t myapp:latest .

Để xác minh kích cỡ, chạy và so sánh với một nhà chế tạo sân khấu đơn. Chạy container và xác nhận ứng dụng trả lời đúng:

docker run -d -p 8080:80 myapp:latest
curl http://localhost:8080

Những thực hành tốt nhất cho việc xây dựng đa nền tảng

  • Dùng thẻ ảnh căn cứ ) để tránh để tránh bất ngờ.
  • Trước khi mã nguồn được dùng để lớp ) có thể sao chép và trước khi mã nguồn còn lại để lớp [FLT] bị tắt khi quan hệ phụ thuộc thay đổi.
  • Leverage xây dựng Kit ) – cho phép xây dựng Kit với để xây dựng nhanh hơn, cắt đứt, và tương đương tốt hơn.
  • Hãy phân loại nhiều giai đoạn cuối cho môi trường ) — chẳng hạn, một giai đoạn phát triển với công cụ gỡ lỗi và một giai đoạn sản xuất với một hình ảnh thô.
  • Dùng để phát triển để xây dựng ) — trong phát triển bạn có thể dừng lại tại để tải trực tiếp bản đồ và mã nguồn, sau đó xây dựng lại với để sản xuất.
  • Hãy giữ bí mật ngoài ảnh ) — dùng cờ nếu cần để qua khi xây cất; đừng bao giờ đưa chúng vào ảnh cuối cùng.

Mẫu mực và cách xử dụng

Các ngôn ngữ được biên dịch (đi, Rust, C++)

Đối với nhị phân tĩnh, giai đoạn chạy có thể dùng . Chỉ có các nhị phân và có lẽ một tập tin cấu hình được sao chép. Ví dụ cho Go:

FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o myapp .

FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]

Ứng dụng Python

Dùng một giai đoạn xây dựng để cài đặt phụ thuộc và biên dịch bất kỳ phần mở rộng C nào, sau đó chỉ sao chép các gói đã cài đặt vào giai đoạn chạy:

FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
COPY . .

FROM python:3.11-slim
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]

Giao diện người dùng với máy chủ ADI

Xây dựng cả giao diện điều khiển lẫn hậu phương trong một tập tin Docker. Dùng các giai đoạn xây dựng riêng cho mỗi người, rồi sao chép cả hai hiện vật vào một ảnh thời gian chạy duy nhất:

FROM node:14-alpine AS frontend-builder
WORKDIR /app
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ .
RUN npm run build

FROM node:14-alpine AS api-builder
WORKDIR /app
COPY api/package*.json ./
RUN npm ci
COPY api/ .
RUN npm run build

FROM node:14-alpine
WORKDIR /app
COPY --from=frontend-builder /app/build ./public
COPY --from=api-builder /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]

Name

  • Lệnh cấm việc đóng gói () – bảo đảm có những quan hệ phụ thuộc trước mã nguồn. Hãy dùng để loại trừ tập tin không cần thiết.
  • Không tìm thấy ) – kiểm tra các đường trong câu . Giai đoạn xây dựng phải sản xuất ra kết quả ở địa điểm đã xác định. Hãy dùng để gỡ lỗi.
  • Thông tin rò rỉ ) — không bao giờ sao chép toàn bộ thư mục chứa hay . Chỉ sao chép tập tin cần thiết thôi.
  • Mặc dù nhiều giai đoạn [FLT: 1] — kiểm tra xem bạn có vô tình sao chép hay toàn bộ nguồn. Hãy dùng để xem kích cỡ lớp.

Kết luận

Các công cụ này tạo ra các công cụ công cụ đóng đa giai đoạn. Nó cho phép bạn vận chuyển những hình ảnh được dựa vào, bảo mật, đơn giản và được ghi chép trong một tập tin docker. Bằng cách phân chia các mối quan tâm giữa việc xây dựng và chạy thời gian, bạn có thể giảm đáng kể kích cỡ ảnh, cải thiện an ninh, và dòng luồng điện tích CI/CD. Những kỹ thuật được hiển thị ở đây áp dụng cho gần bất kỳ chồng nào, cho dù bạn đang xây dựng tập tin « Node.js », Go, Java, hoặc trao đổi ứng dụng điều khiển. Bắt đầu bằng cách chuyển đổi tập tin hiện thời của bạn đang có, và ngay lập tức, bạn sẽ xây dựng các đường ống dẫn tăng tốc độ, và hiệu quả toàn bộ.

Để biết thêm chi tiết, hãy nhắc đến sách hướng dẫn [FLT: 0] [FLT: 0]. Những tài liệu thật về xây dựng và tài liệu hướng dẫn ) [FLT: t [FLT:]. Những ví dụ thực tế khác nhau cũng có trong tài liệu [FLT:].