0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Danh Sách Kiểm Tra Tối Ưu Cho Triển Khai Docker

Đăng vào 7 tháng trước

• 4 phút đọc

Danh Sách Kiểm Tra Tối Ưu Cho Triển Khai Docker

Triển khai các container Docker lên môi trường sản xuất có thể giống như việc lắp ghép một bức tranh ghép hình mà không nhìn thấy. Chỉ cần thiếu một mảnh—một hình ảnh cơ sở không được cố định, một cổng bị mở, hoặc một container không bao giờ tắt—có thể biến một quá trình triển khai suôn sẻ thành một phiên cứu hỏa. Danh sách kiểm tra ngắn gọn buộc bạn phải xác minh các điểm thất bại phổ biến nhất trước khi bạn nhấn Triển Khai.

Chuẩn bị Trước Khi Khởi Chạy: Chuẩn Bị Hình Ảnh

Lựa Chọn Hình Ảnh Cơ Sở

  • Chọn một hình ảnh chính thức, tối thiểu (ví dụ: node:18-alpine hoặc python:3.11-slim).
  • Tránh sử dụng thẻ latest; chúng gây ra các bản build không xác định.

Cố Định Phiên Bản

dockerfile Copy
# Ví dụ Dockerfile cho API Node.js
FROM node:18.17-alpine AS builder
WORKDIR /app

# Cố định phiên bản npm
RUN npm install -g npm@9.8.1

COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

FROM node:18.17-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"]

Tại sao? Các số phiên bản chính xác khóa bề mặt tấn công và đảm bảo các bản build có thể tái tạo trên các trình chạy CI.

Bảo Mật Thời Gian Chạy

Chạy với Người Dùng Không Phải là Root

dockerfile Copy
# Thêm một người dùng có ít quyền hơn
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
  • Không bao giờ chạy ứng dụng của bạn với quyền root. Điều này hạn chế tác động của việc thoát container.

Hệ Thống Tập Tin Chỉ Đọc

Thêm cờ --read-only khi bạn khởi động container, và chỉ gắn kết các thư mục thực sự cần quyền ghi.

bash Copy
docker run -d \
  --read-only \
  -v /app/tmp:/tmp:rw \
  mycompany/api:1.2.3
  • Bảo vệ khỏi việc ghi đè không mong muốn và giúp container của bạn hoạt động giống như một micro-service không trạng thái.

Mạng & Khám Phá Dịch Vụ

  • Chỉ mở các cổng cần thiết – sử dụng EXPOSE trong Dockerfile và -p/--publish tại thời điểm chạy cho ánh xạ chính xác.
  • Healthchecks – cho phép các bộ điều phối biết khi nào một container đã sẵn sàng.
dockerfile Copy
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:3000/health || exit 1

Tài liệu lưu lượng vào/ra dự kiến trong một bảng ngắn:

Cổng Giao thức Mục đích
3000 TCP HTTP API
5432 TCP Cơ sở dữ liệu (chỉ nội bộ)

Quan Sát

  1. Ghi Nhận Cấu Trúc – xuất ra JSON vào stdout/stderr. Hầu hết các bộ thu thập nhật ký (ví dụ: Loki, Papertrail) tự động phân tích nó.
  2. Chỉ số – xuất các chỉ số Prometheus trên một điểm cuối dành riêng.
  3. Theo Dõi – chèn một ID theo dõi tại điểm nhập và truyền nó xuống.
dockerfile Copy
# Ví dụ: xuất các chỉ số Prometheus tại /metrics
ENV METRICS_PORT=9100
EXPOSE 9100

Tắt Ứng Dụng Mềm Mại với systemd

Khi Docker chạy dưới một dịch vụ systemd, bạn có thể kiểm soát thời gian dừng và đảm bảo các dịch vụ phụ thuộc được thông báo.

ini Copy
# /etc/systemd/system/myapp.service
[Unit]
Description=API Docker của Tôi
After=network-online.target
Wants=network-online.target

[Service]
Restart=always
# Kéo hình ảnh mới nhất trước mỗi lần khởi động (tuỳ chọn)
ExecStartPre=/usr/bin/docker pull mycompany/api:1.2.3
ExecStart=/usr/bin/docker run \
  --rm \
  --name myapp \
  --read-only \
  -v /app/tmp:/tmp:rw \
  -p 3000:3000 \
  mycompany/api:1.2.3
ExecStop=/usr/bin/docker stop -t 30 myapp
TimeoutStopSec=40

[Install]
WantedBy=multi-user.target
  • TimeoutStopSec cung cấp cho container một khoảng thời gian 30 giây để hoàn thành các yêu cầu đang được xử lý trước khi docker kill bị ép buộc.

Tích Hợp CI/CD

Một workflow GitHub Actions tối thiểu xây dựng, quét và đẩy hình ảnh:

yaml Copy
name: CI
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Thiết lập Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Xây dựng và đẩy
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: mycompany/api:${{ github.sha }}
      - name: Quét hình ảnh
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: mycompany/api:${{ github.sha }}
          severity: HIGH,CRITICAL
  • Bước quét giúp phát hiện các CVE đã biết trước khi chúng đến môi trường sản xuất.

Những Suy Nghĩ Cuối Cùng

Chạy Docker trong môi trường sản xuất không chỉ là viết một Dockerfile. Đó là một quy trình có kỷ luật bao gồm vệ sinh hình ảnh, bảo mật thời gian chạy, mạng, khả năng quan sát và tự động hóa. Bằng cách đánh dấu từng mục trong danh sách kiểm tra này, bạn sẽ giảm khả năng gặp sự cố bất ngờ và giữ cho dịch vụ của bạn luôn hoạt động hiệu quả và an toàn. Nếu bạn đang tìm kiếm một đối tác có thể giúp bạn kiểm tra quy trình container của mình hoặc cung cấp dịch vụ lưu trữ Kubernetes được quản lý, hãy xem xét việc tham khảo tại Lacida Web để có một cuộc trò chuyện không áp lực.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào