Docker Hub và Harbor: nơi cất image, quét lỗ hổng và phân quyền cho cả nhóm

Docker Hub và Harbor: nơi cất image, quét lỗ hổng và phân quyền cho cả nhóm

Bạn đã build được image, chạy được cả cụm bằng compose. Nhưng image đang nằm trên máy bạn. Làm sao đưa nó lên máy chủ, hay chia sẻ cho đồng nghiệp? Câu trả lời là registry, một kho chứa image. Hãy hình dung nó giống GitHub, nhưng thay vì chứa mã nguồn thì chứa image.

Docker Hub: registry công khai lớn nhất

Docker Hub là registry công khai phổ biến nhất, và bạn đã gián tiếp dùng nó rồi. Mỗi lần Dockerfile của bạn ghi FROM node:22-alpine, image nền đó được kéo về từ Docker Hub.

Ba thao tác cơ bản:

docker login
docker tag my-app tenban/my-app:1.0
docker push tenban/my-app:1.0

Lệnh login để đăng nhập, tag để đặt tên image theo đúng định dạng tài khoản, và push để đẩy image lên. Ở máy khác, chỉ cần docker pull tenban/my-app:1.0 là lấy image về. Docker Hub học trong mười lăm phút là dùng được.

Một cái bẫy cần biết: giới hạn số lần pull

Docker Hub có giới hạn số lần kéo image cho tài khoản miễn phí và cho người dùng ẩn danh không đăng nhập. Con số cụ thể được điều chỉnh nhiều lần qua các năm, nên đừng học thuộc một con số rồi phụ thuộc vào nó. Điều bạn cần nhớ là: nếu nhiều máy trong nhóm cùng kéo image mà không đăng nhập, rất dễ đụng trần và nhận lỗi “too many requests”, làm hỏng cả quy trình build tự động.

Cách giảm nhẹ trước mắt là luôn đăng nhập bằng docker login trước khi kéo. Nhưng khi nhóm lớn dần và có nhiều image nội bộ, đây chính là lúc bạn cần một registry của riêng mình. Và đó là lý do Harbor xuất hiện.

Harbor: registry tự host cho nhóm nghiêm túc

Harbor là một registry mã nguồn mở mà bạn tự vận hành trên hạ tầng của mình. Nó là một dự án đã tốt nghiệp của CNCF, tổ chức đứng sau nhiều công nghệ nền tảng như Kubernetes, ban đầu do VMware xây rồi hiến tặng cho cộng đồng. Nói cách khác, đây là công cụ cấp doanh nghiệp nhưng miễn phí.

So với việc chỉ dùng Docker Hub, Harbor cho bạn kiểm soát trọn vẹn: image nằm trên hạ tầng của bạn, không tính vào giới hạn của ai, và kéo về trong mạng nội bộ thì rất nhanh. Nhưng điều làm Harbor đáng giá là ba tính năng bảo mật đi kèm.

Trivy: quét lỗ hổng tự động

Harbor tích hợp sẵn Trivy làm bộ quét lỗ hổng mặc định. Trivy soi image của bạn để tìm các lỗ hổng đã biết, cả ở các gói hệ điều hành lẫn ở thư viện ứng dụng như npm hay pip, dựa trên một cơ sở dữ liệu CVE được cập nhật liên tục.

Điểm mạnh nhất là chính sách quét khi đẩy lên (scan-on-push): mỗi image vừa push lên đều tự động bị quét. Bạn còn có thể đặt luật chặn không cho kéo về những image dính lỗ hổng nghiêm trọng. Nghĩa là một image có lỗ hổng critical sẽ bị giữ lại, không lọt được xuống môi trường chạy thật. Đây là một tấm lưới an toàn thật sự hữu ích.

RBAC: phân quyền cho nhóm

RBAC (Role-Based Access Control) là phân quyền theo vai trò. Trong Harbor, bạn tổ chức image theo từng project, và gán quyền cho từng người theo project đó. Người này chỉ được đọc, người kia được đẩy image, người khác là quản trị. Harbor còn nối được với hệ thống danh tính sẵn có của công ty như LDAP, Active Directory hay OIDC, để dùng chung tài khoản.

Ngoài ra Harbor còn hỗ trợ ký image bằng Cosign hoặc Notation, để đảm bảo image không bị chỉnh sửa giữa đường, và nhân bản image sang nhiều nơi khác nhau.

Cài Harbor nhanh gọn

Harbor tự chạy bằng docker compose bên dưới, nên nếu bạn đã theo tới bài này thì mọi thứ đều quen thuộc. Sau khi tải bộ cài về, bạn chạy trình cài đặt kèm bật Trivy:

sudo ./install.sh --with-trivy

Sau đó kiểm tra các thành phần đã chạy đủ chưa:

docker compose ps

Vậy là bạn có một registry riêng, kèm quét lỗ hổng, ngay trên hạ tầng của mình.

Định nghĩa xong

Bạn coi như nắm được bài này khi:

  • Image của nhóm nằm trên Harbor của các bạn, đẩy lên và kéo về được.
  • Trivy quét image và không còn báo lỗ hổng ở mức nghiêm trọng.
  • Bạn giải thích được khác biệt giữa một registry công khai như Docker Hub và một registry tự host như Harbor, cùng lý do một nhóm nghiêm túc muốn có registry riêng.

Đến đây là trọn một vòng của tuần đóng gói: từ hiểu các tầng dịch vụ đám mây, tới đưa app vào container, tối ưu image, dựng cả cụm bằng compose, và cuối cùng là cất giữ, bảo vệ image cho cả nhóm.