---
title: "Cara Membuat Docker Registry Pribadi di VPS"
description: "Panduan menyiapkan Docker registry pribadi di VPS dengan image registry:3, login htpasswd, HTTPS lewat reverse proxy, dan pembersihan image lama."
url: "https://nivelva.com/insight/cara-membuat-docker-registry-pribadi-vps"
category: "Server \u0026 Infrastruktur"
tags: ["docker","registry","vps","container","devops"]
author: "Lucas Tan"
published: "2026-11-11T13:33:00+07:00"
updated: "2026-11-11T13:33:00+07:00"
language: "id"
publisher: "Nivelva (https://nivelva.com)"
---

# Cara Membuat Docker Registry Pribadi di VPS

> **Jawaban singkat:** Docker registry pribadi bisa dijalankan di VPS dengan image resmi registry:3, dilindungi login htpasswd berformat bcrypt, dan dibuka lewat HTTPS di belakang reverse proxy. Image lama dibersihkan dengan perintah garbage-collect saat registry dalam keadaan berhenti atau read-only.

Pernah kesal karena image aplikasi kantor harus diunggah ke registry publik, padahal isinya kode internal? Atau proses deploy jadi lambat karena setiap server menarik image dari luar negeri? Jawabannya bisa sesederhana menjalankan registry sendiri di satu VPS.

Registry pribadi adalah tempat menyimpan image Docker yang hanya bisa diakses timmu. Proyek resminya bernama Distribution (dulu Docker Registry), dan image siap pakainya tersedia di Docker Hub dengan nama `registry`. Versi 3 memakai tag `registry:3`.

## Apa yang perlu disiapkan dulu?

Sebelum mulai, pastikan beberapa hal ini sudah ada:

- VPS Linux dengan Docker Engine dan plugin Compose terpasang. Kalau belum akrab dengan Docker, baca dulu [apa itu Docker](https://nivelva.com/insight/apa-itu-docker).
- Subdomain khusus, misalnya `registry.contoh.co.id`, yang record A-nya mengarah ke IP VPS.
- Ruang disk yang cukup. Image menumpuk lebih cepat dari dugaan, terutama kalau setiap commit menghasilkan tag baru.
- Port 80 dan 443 terbuka untuk reverse proxy. Port registry sendiri (5000) cukup didengarkan di localhost.

## Langkah membuat registry pribadi

### Langkah 1: Buat folder kerja dan file login

Registry hanya menerima file htpasswd berformat bcrypt, jadi opsi `-B` wajib dipakai. Cara termudah membuatnya adalah meminjam program `htpasswd` dari image `httpd:2`, seperti contoh di dokumentasi resmi:

```bash
mkdir -p /opt/registry/{auth,data}
cd /opt/registry
docker run --rm --entrypoint htpasswd httpd:2 -Bbn timdev PasswordPanjangSekali > auth/htpasswd
```

Ganti `timdev` dan kata sandinya. Untuk menambah pengguna lain, jalankan perintah yang sama dengan `>>` agar file tidak tertimpa.

### Langkah 2: Tulis docker-compose.yml

```yaml
services:
  registry:
    image: registry:3
    restart: always
    ports:
      - "127.0.0.1:5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    volumes:
      - ./auth:/auth:ro
      - ./data:/var/lib/registry
```

Perhatikan `127.0.0.1:5000:5000`. Dengan cara ini registry tidak langsung terbuka ke internet, hanya bisa dijangkau reverse proxy di server yang sama. Ini penting karena Docker suka menembus aturan firewall, seperti dibahas di [cara mengamankan Docker di VPS agar port tidak bocor](https://nivelva.com/insight/cara-mengamankan-docker-vps-port-tidak-bocor).

Variabel `REGISTRY_STORAGE_DELETE_ENABLED` mengizinkan penghapusan image lewat API. Tanpa ini, langkah pembersihan di bawah tidak banyak berguna.

Jalankan dengan `docker compose up -d`, lalu cek `docker compose logs -f registry`.

### Langkah 3: Pasang HTTPS lewat reverse proxy

Klien Docker menolak registry tanpa TLS kecuali alamatnya localhost atau kamu menandainya sebagai `insecure-registries` di setiap mesin. Pilihan kedua merepotkan dan tidak aman, jadi pakai sertifikat sungguhan.

Registry sebenarnya bisa memegang sertifikat sendiri lewat `REGISTRY_HTTP_TLS_CERTIFICATE` dan `REGISTRY_HTTP_TLS_KEY`. Namun di VPS yang juga melayani situs lain, reverse proxy lebih praktis. Contoh potongan server block Nginx:

```nginx
server {
    listen 443 ssl;
    server_name registry.contoh.co.id;
    # baris ssl_certificate dari Certbot

    client_max_body_size 0;
    chunked_transfer_encoding on;

    location /v2/ {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 900;
    }
}
```

`client_max_body_size 0` mematikan batas ukuran unggahan. Tanpa baris ini, push layer besar akan gagal dengan error 413.

### Langkah 4: Login, tag, dan push

Dari laptop atau server CI:

```bash
docker login registry.contoh.co.id
docker tag aplikasi:1.4.0 registry.contoh.co.id/tim/aplikasi:1.4.0
docker push registry.contoh.co.id/tim/aplikasi:1.4.0
```

Di server produksi, cukup `docker login` sekali lalu `docker pull` seperti biasa. Untuk melihat isi registry, panggil API katalog:

```bash
curl -u timdev https://registry.contoh.co.id/v2/_catalog
```

## Bagaimana membersihkan image lama secara berkala?

Menghapus tag lewat API tidak langsung mengosongkan disk. Data layer baru benar-benar hilang setelah garbage collection. Dokumentasi resmi meminta registry dalam keadaan berhenti atau read-only selama proses ini, karena push yang berjalan bersamaan bisa merusak data.

Mulai versi 3, lokasi konfigurasi bawaan pindah ke `/etc/distribution/config.yml`. Jalankan dulu dalam mode uji:

```bash
docker compose stop registry
docker compose run --rm registry garbage-collect --dry-run /etc/distribution/config.yml
docker compose run --rm registry garbage-collect --delete-untagged /etc/distribution/config.yml
docker compose start registry
```

Opsi `--delete-untagged` ikut membuang manifest yang tidak lagi punya tag. Jadwalkan ini di jam sepi, misalnya seminggu sekali.

## Registry sendiri atau layanan terkelola?

| Pertimbangan | Registry di VPS sendiri | Registry terkelola |
|:--|:--|:--|
| Kendali data | Penuh, image tidak keluar dari servermu | Bergantung kebijakan penyedia |
| Kecepatan pull dari server di lokasi sama | Cepat, satu jaringan | Bergantung lokasi penyedia |
| Antarmuka web dan pemindaian celah | Tidak ada bawaan, perlu alat tambahan | Biasanya sudah tersedia |
| Perawatan | Kamu urus sendiri (update, disk, backup) | Diurus penyedia |
| Hak akses per proyek | Terbatas pada htpasswd sederhana | Umumnya lebih rinci |

Registry bawaan ini cocok untuk tim kecil sampai menengah dengan satu atau dua kelompok pengguna. Kalau butuh hak akses per proyek, antarmuka web, atau pemindaian celah otomatis, lihat solusi yang lebih lengkap seperti Harbor. Sementara itu, image di registry sendiri tetap bisa kamu periksa dengan [Trivy](https://nivelva.com/insight/cara-scan-image-docker-celah-trivy) sebelum dipakai di produksi.

## Pertanyaan yang sering diajukan

### Apakah registry pribadi bisa dipakai tanpa domain?

Bisa, tapi kamu harus memasang sertifikat yang dipercaya klien atau mendaftarkan alamatnya sebagai insecure-registries di setiap mesin Docker. Memakai subdomain dengan sertifikat Let's Encrypt jauh lebih sederhana dan aman.

### Di mana image tersimpan di dalam container?

Di /var/lib/registry. Karena itu folder ini dipetakan ke ./data di host, agar image tidak hilang saat container dibuat ulang.

### Apakah folder data perlu dibackup?

Kalau image bisa dibangun ulang dari kode dan CI, backup tidak terlalu mendesak. Kalau ada image yang tidak bisa dibuat ulang, misalnya versi lama yang sumbernya sudah berubah, backup folder data secara berkala.

### Kenapa disk tidak berkurang setelah menghapus tag?

Penghapusan tag hanya melepas referensi. Layer baru benar-benar dihapus setelah garbage-collect dijalankan, idealnya saat registry berhenti atau read-only.

### Bisakah registry ini menyimpan image untuk arsitektur ARM dan x86 sekaligus?

Bisa. Registry menyimpan manifest list atau image index yang dibuat docker buildx, jadi satu tag bisa berisi beberapa arsitektur.

## Checklist sebelum dipakai tim

- Registry hanya mendengarkan di 127.0.0.1, bukan di semua antarmuka.
- HTTPS aktif dan `docker login` berhasil dari mesin lain.
- Setiap anggota tim punya akun htpasswd sendiri.
- Jadwal garbage-collect mingguan sudah dibuat dan diuji dengan `--dry-run`.
- Pemantauan ruang disk aktif agar folder data tidak memenuhi server.

## Sumber

- <https://distribution.github.io/distribution/about/deploying/>
- <https://distribution.github.io/distribution/about/garbage-collection/>
- <https://github.com/distribution/distribution/releases/tag/v3.0.0>

---

Diterbitkan oleh Nivelva Insight (https://nivelva.com/insight/). Artikel ini: https://nivelva.com/insight/cara-membuat-docker-registry-pribadi-vps
Kontak Nivelva: WhatsApp https://wa.me/6285111245007, email hello@nivelva.com
