Registry image của riêng bạn
Khi nào bạn cần registry riêng, cách thiết lập nó với mật khẩu và chứng chỉ, nó tiêu tốn bao nhiêu dung lượng đĩa, và làm sao để không biến nó thành bãi rác các image cũ.
Cập nhật 23 tháng 8, 2026
Registry là kho lưu trữ image. Bạn cần registry riêng trong ba trường hợp: image là riêng tư và không được rời khỏi hạ tầng của bạn, build diễn ra thường xuyên và giới hạn tải xuống từ bên ngoài gây cản trở, hoặc bạn triển khai cùng một thứ trên nhiều máy.
Phương án đơn giản: registry:2
services:
registry:
image: registry:2
restart: unless-stopped
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- ./data:/var/lib/registry
- ./auth:/auth:ro
ports:
- "127.0.0.1:5000:5000"
Tạo mật khẩu như sau:
mkdir -p auth
docker run --rm --entrypoint htpasswd httpd:2 -Bbn deploy 'long-password' > auth/htpasswd
docker compose up -d
Đừng mở cổng ra bên ngoài: một web server có chứng chỉ sẽ đứng trước registry. Docker từ chối làm việc với registry của bên thứ ba qua HTTP — và điều đó hoàn toàn hợp lý, vì mã thực thi được đưa đến máy của bạn thông qua nó.
Làm việc với registry
docker login registry.example.com
docker tag myapp:1.5.0 registry.example.com/myapp:1.5.0
docker push registry.example.com/myapp:1.5.0
docker pull registry.example.com/myapp:1.5.0
curl -u deploy https://registry.example.com/v2/_catalog
curl -u deploy https://registry.example.com/v2/myapp/tags/list
Sau docker login, thông tin đăng nhập nằm trong ~/.docker/config.json dưới dạng văn bản thuần (base64 không phải là mã hóa). Trên các máy build, hãy tạo một tài khoản riêng chỉ có quyền đọc.
Một registry không giới hạn dung lượng và không dọn dẹp là cách nhanh nhất để làm đầy ổ đĩa. Mỗi lần build đều thêm các layer, và xóa một tag không giải phóng dung lượng: bạn cần garbage collection. Trên VDS-1 với 40 GB, registry của một dự án đang hoạt động sẽ làm đầy ổ đĩa chỉ trong vài tuần.
Dọn dẹp
Xóa một tag và garbage collection sau đó:
docker compose exec registry registry garbage-collect \
--delete-untagged /etc/docker/registry/config.yml
Bạn phải dừng registry trong khi garbage collection chạy — nếu không, một push đồng thời có thể làm mất các layer:
docker compose stop registry
docker compose run --rm registry registry garbage-collect --delete-untagged /etc/docker/registry/config.yml
docker compose start registry
Hãy thiết lập việc này như một tác vụ theo lịch mỗi tuần một lần và theo dõi dung lượng ổ đĩa.
Thay thế: registry đi kèm với Git server
Nếu bạn đã thiết lập Forgejo hoặc Gitea, chúng có sẵn kho package tích hợp, bao gồm cả Docker image. Bạn không cần một dịch vụ riêng: quyền truy cập đi qua cùng các tài khoản, và image hiển thị ngay cạnh mã nguồn. Với các dự án nhỏ, điều này tiện hơn so với registry:2 độc lập.
Những lỗi thường gặp
- Registry mở mà không có xác thực. Qua đó, ai đó có thể cài một image sẽ được triển khai trên chính máy production của bạn.
- Dùng tag
latestthay vì phiên bản. Registry không còn là nguồn đảm bảo khả năng tái lập: không rõ chính xác thứ gì đang được triển khai. Xem cập nhật container. - Lưu trữ trên cùng ổ đĩa với cơ sở dữ liệu. Một đợt push tăng vọt sẽ ngốn băng thông ổ đĩa và làm chậm dịch vụ production — xem tốc độ ổ đĩa.
- Thư mục
./datakhông nằm trong bản sao lưu của bạn. Bạn sẽ mất toàn bộ image mà bạn không có sẵn mã nguồn. Xem cần sao lưu những gì.