Skopeo: Sao chép Docker Image thần tốc giữa các Registry mà không cần ‘Pull’

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Dùng thử ngay cho nóng

Bạn đã bao giờ phát cáu vì phải ngồi chờ 15 phút chỉ để pull một cái image 3GB về máy, tag lại rồi mới push lên Registry khác chưa? Nếu có, Skopeo chính là cứu tinh của bạn.

Cài đặt Skopeo trên Ubuntu/Debian chỉ tốn vài giây:

sudo apt-get update
sudo apt-get install -y skopeo

Giả sử bạn cần chuyển image nginx:latest từ Docker Hub sang Private Registry mà không muốn tải nó về máy cá nhân. Hãy dùng lệnh này:

skopeo copy \
    docker://docker.io/library/nginx:latest \
    docker://registry.mycompany.com/production/nginx:latest

Lúc này, Skopeo sẽ đóng vai trò “môi giới” điều phối dữ liệu trực tiếp giữa hai Registry qua API. Bạn không cần cài Docker Engine, không cần quyền sudo và quan trọng nhất là ổ cứng máy bạn vẫn trống trơn.

Vì sao bạn nên vứt bỏ workflow Pull -> Tag -> Push?

Cách làm truyền thống thường gây ra 3 vấn đề gây ức chế cực độ cho dân DevOps:

  • Ngốn băng thông: Việc tải 2GB dữ liệu về rồi upload ngược lên server khác là một sự lãng phí tài nguyên khủng khiếp. Nếu mạng chậm, bạn sẽ mất cả buổi sáng chỉ để copy vài cái image.
  • Cháy ổ cứng: Các layer trung gian của Docker thường chiếm rất nhiều dung lượng. Trên các con Runner của CI/CD với ổ cứng giới hạn khoảng 20GB, việc pull image nặng sẽ làm pipeline đổ vỡ ngay lập tức.
  • Phụ thuộc Docker Daemon: Không phải môi trường nào cũng có sẵn Docker. Trong các hệ thống hiện đại như Kubernetes, việc chạy Docker-inside-Docker thường tiềm ẩn nhiều rủi ro bảo mật.

Skopeo giải quyết triệt để những việc này. Nó giao tiếp thẳng với Registry qua HTTP API để thao tác với manifest và layer mà không cần giải nén bất kỳ thứ gì ra máy.

Những tính năng thực tế nhất

1. Inspect: Soi nội dung Image trong 1 giây

Bạn muốn biết image này hỗ trợ arm64 hay amd64 trước khi tải? Thay vì pull về rồi mới check, hãy dùng lệnh inspect:

skopeo inspect docker://docker.io/library/ubuntu:22.04

Kết quả trả về là một cục JSON chi tiết về tag, layer và kiến trúc. Một tip nhỏ: Kết quả JSON trên terminal thường rất khó đọc. Mình thường copy toàn bộ rồi dán vào JSON formatter tại toolcraft.app/vi/tools/developer/json-formatter. Cách này giúp mình quan sát cấu trúc image nhanh hơn nhiều so với việc loay hoay cài extension.

2. Copy: “Vác” Image đi khắp mọi nơi

Lệnh này cho phép bạn di chuyển image linh hoạt giữa các định dạng khác nhau:

  • docker://: Chuyển giữa các Registry tiêu chuẩn.
  • oci://: Sử dụng định dạng Open Container Initiative.
  • dir://: Lưu image ra một thư mục (phù hợp để backup).

Ví dụ, để sao lưu image sang một server không có internet (air-gapped), bạn chỉ cần lưu nó ra thư mục:

skopeo copy docker://alpine:latest dir:/home/dev/backup-alpine

3. Delete: Dọn dẹp Registry từ xa

Docker CLI vốn không cho phép bạn xóa image trực tiếp trên Registry. Với Skopeo, nếu bạn có quyền admin, việc dọn dẹp các bản build cũ trở nên cực kỳ nhẹ nhàng:

skopeo delete docker://registry.mycompany.com/old-app:v1

Xử lý Authentication và Private Registry

Khi làm việc với các hệ thống yêu cầu mật khẩu như AWS ECR hay GitLab, bạn có thể truyền thông tin đăng nhập trực tiếp:

skopeo copy \
    --src-creds user_nguon:pass_nguon \
    --dest-creds user_dich:pass_dich \
    docker://docker.io/myrepo/private-image:latest \
    docker://quay.io/another-repo/image:latest

Nếu bạn đã từng docker login, Skopeo sẽ tự tìm file ~/.docker/config.json để lấy token. Bạn không cần phải nhập lại mật khẩu một lần nữa.

Đồng bộ hàng loạt với lệnh ‘sync’

Hãy tưởng tượng bạn phải chuyển 50 tag của một project từ Docker Hub sang Google Cloud. Thay vì gõ lệnh tay 50 lần, bạn chỉ cần tạo file sync.yaml:

'docker.io/itfromzero':
    images:
        nginx: ['1.21', '1.22', 'latest']
        redis: ['6.2', '7.0']

Sau đó chạy lệnh sync: skopeo sync --src yaml --dest docker sync.yaml gcr.io/my-project. Chỉ trong vài phút, toàn bộ kho image của bạn sẽ được “nhân bản” sang nhà mới.

Kinh nghiệm thực tế khi triển khai

Xử lý lỗi SSL khi dùng Registry nội bộ

Nếu bạn dùng Registry tự dựng (self-hosted) chưa có chứng chỉ SSL xịn, Skopeo sẽ báo lỗi certificate. Đừng lo, chỉ cần thêm flag --dest-tls-verify=false để bỏ qua kiểm tra an toàn là xong.

Tối ưu cho CI/CD Pipeline

Trong Jenkins hay GitLab Runner, mình luôn ưu tiên dùng Skopeo thay vì Docker. Nó giúp máy ảo Runner sạch sẽ hoàn toàn sau khi chạy. Bạn sẽ không còn gặp cảnh pipeline bị treo vì lỗi “No space left on device” do image rác tích tụ lâu ngày.

Tóm lại, nếu bạn thường xuyên phải quản lý Image hoặc chuyển đổi giữa các Cloud Provider, Skopeo là công cụ không thể thiếu. Nó gọn nhẹ, nhanh và giúp workflow của bạn chuyên nghiệp hơn hẳn.

Share: