Registry publik, gudang image yang melayani unggahan dan unduhan melalui jaringan, tidak selalu menjadi pilihan yang tepat untuk image yang bersifat internal. Topik ini membahas alasan menyelenggarakan registry privat, dua jalur penyediaannya, pemasangan registry pada server sendiri, serta penamaan dan login yang menyertainya. Satu percobaan curl di bagian akhir menampilkan antarmuka API yang sama pada seluruh registry. Image aplikasi catatan tetap dipakai sebagai contoh.
Alasan menyelenggarakan registry privat#
Alasan pertama adalah kerahasiaan. Image internal membawa kode aplikasi, konfigurasi lingkungan, dan terkadang jejak struktur jaringan internal, sedangkan image pada registry publik dapat ditarik dan dibedah oleh siapa pun. Menyimpan image semacam itu di registry milik sendiri menjaga isinya tetap berada dalam jangkauan tim.
Alasan kedua adalah latensi, waktu tunggu transfer data. Penarikan image dari server di jaringan internal atau di data center yang sama berlangsung jauh lebih cepat daripada melalui internet publik, dan perbedaan itu terasa pada pipeline yang menarik image berulang-ulang. Alasan ketiga adalah kepatuhan, sebab sebagian regulasi menuntut data tertentu tidak melintasi wilayah atau pihak tertentu. Registry privat menempatkan seluruh alur data di bawah kendali organisasi, sehingga persyaratan semacam itu dapat dipenuhi.
Dua jalur penyediaan registry#
Jalur pertama adalah layanan registry terkelola, layanan awan dari penyedia besar yang mengurus penyimpanan, autentikasi, dan ketersediaannya. Perintah push, pengiriman image ke registry, dan pull, penarikan image dari registry, dapat langsung diarahkan ke layanan semacam ini karena protokolnya sama dengan Docker Hub. Jalur ini cocok untuk tim yang tidak ingin merawat server tambahan.
Jalur kedua adalah registry self-hosted, registry yang dipasang sendiri pada server yang dikelola sendiri. Proyek distribution adalah registry open source, perangkat lunak dengan kode sumber terbuka, yang menjadi implementasi rujukan Registry API v2 dan tersedia sebagai image registry:2 pada Docker Hub. Jalur ini dipilih bila jaringannya tertutup, data yang disimpan sangat sensitif, atau kepatuhan menuntut kendali penuh atas penyimpanan.
| Aspek | Layanan terkelola | Self-hosted dengan distribution |
|---|---|---|
| Penyiapan | membuat registry dari dasbor penyedia | menjalankan image registry:2 |
| Perawatan server | menjadi tanggung jawab penyedia | menjadi tanggung jawab sendiri |
| Lokasi data | wilayah yang disediakan penyedia | sepenuhnya di server sendiri |
Menjalankan registry distribution secara lokal#
Perintah berikut menjalankan registry distribution di komputer lokal dan membukanya pada port 5000. Port 5000 merupakan port yang dipakai sebagai contoh bawaan pada dokumentasi registry. Satu baris perintah sudah cukup karena seluruh konfigurasi lain memakai nilai bawaannya.
# tidak-dijalankan: Docker tidak tersedia di sandbox
# menjalankan registry distribution pada port 5000
docker run -d -p 5000:5000 registry:2Opsi -d menjalankan container di latar belakang, opsi -p 5000:5000 memetakan port 5000 di host ke port 5000 di container, dan registry:2 adalah image resmi proyek distribution. Sesudah container berjalan, registry melayani permintaan di alamat localhost:5000. Layanan itu menerima HTTP tanpa enkripsi, sedangkan daemon menganggap registry HTTP tidak aman, sehingga alamatnya perlu didaftarkan pada opsi insecure-registries dalam konfigurasi daemon sebelum push dan pull dapat dilakukan.
Penamaan dan login pada registry privat#
Image yang akan disimpan di registry privat ditandai tag, label teks yang menunjuk satu varian image, dengan alamat registry sebagai awalan namanya. Tanpa penandaan itu, daemon akan mengarahkan unggahan ke Docker Hub. Dua perintah berikut menandai image catatan untuk registry lokal, lalu mengunggahnya.
# tidak-dijalankan: Docker tidak tersedia di sandbox
# menandai image dengan alamat registry lokal
docker tag catatan localhost:5000/catatan:1.0.0
docker push localhost:5000/catatan:1.0.0Daemon menganggap bagian sebelum garis miring pertama sebagai alamat registry apabila bagian itu memuat titik, titik dua, atau berupa localhost. Karena itu, nama budi/catatan tetap menuju Docker Hub, dengan budi diperlakukan sebagai namespace, bagian nama yang menunjukkan pemilik repository. Repository sendiri adalah wadah untuk satu nama image beserta seluruh versinya. Sebaliknya, localhost:5000/catatan menuju registry lokal, dan catatan menjadi nama repositorynya.
Registry privat yang dipasangi autentikasi menuntut login yang menyebut alamatnya, dan alamat yang sama diberikan oleh layanan terkelola untuk registry miliknya. Formatnya sama dengan login Docker Hub, hanya ditambah alamat sebagai argumen. Sesudahnya, kredensial, data identitas yang membuktikan kepemilikan akun, untuk alamat itu tersimpan pada berkas konfigurasi yang sama dengan login Docker Hub.
# tidak-dijalankan: Docker tidak tersedia di sandbox
# login ke registry privat lokal
docker login localhost:5000API v2 yang sama pada semua registry#
Distribution, Docker Hub, dan registry terkelola melayani klien melalui Registry API v2, antarmuka HTTP yang sama yang dipakai daemon saat menarik dan mengunggah image. Percakapan pertama dengan API itu dapat dicoba langsung dengan curl tanpa Docker sama sekali. Alamat https://registry-1.docker.io/v2/ adalah titik masuk Registry API milik Docker Hub.
curl -s -w "\nStatus HTTP: %{http_code}\n" https://registry-1.docker.io/v2/{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
Status HTTP: 401Registry menjawab dengan JSON berisi satu error berkode UNAUTHORIZED dan status HTTP 401. Jawaban itu bukan kegagalan koneksi, melainkan mekanisme normal registry yang menuntut token autentikasi sebelum melayani konten. Saat menjalankan pull dan push, daemon menyelesaikan pertukaran token tersebut secara otomatis. Endpoint dengan bentuk serupa juga tersedia di registry distribution lokal, yaitu localhost:5000/v2/.
Untuk membaca daftar tag tanpa autentikasi, Docker Hub menyediakan API layanan webnya sendiri. Perintah berikut mengambil dua tag teratas dari repository resmi alpine.
curl -s "https://hub.docker.com/v2/repositories/library/alpine/tags?page_size=2" \
| python3 -c "import json,sys; data=json.load(sys.stdin); [print(t['name']) for t in data['results']]"latest
3.24.3Dua tag itu ditarik langsung dari Docker Hub saat topik ini ditulis, sehingga isinya dapat berubah seiring dirilisnya tag baru. Yang penting dari percobaan ini adalah bentuk protokolnya, karena daemon menjalankan permintaan serupa pada Registry API v2 setiap kali image ditarik atau diunggah. Registry apa pun yang mengikuti API itu dapat dipakai dengan cara yang sama, baik Docker Hub, registry distribution lokal, maupun layanan terkelola.
Ringkasan#
- Registry privat dipilih untuk menjaga kerahasiaan image, memperpendek transfer di jaringan internal, dan memenuhi persyaratan kepatuhan.
- Registry privat diperoleh lewat dua jalur, yaitu layanan terkelola dari penyedia awan atau registry self-hosted dengan proyek distribution.
- Image untuk registry privat ditandai dengan alamat registry sebagai awalan, misalnya
localhost:5000/catatan:1.0.0, dan registry berautentikasi menuntutdocker loginbeserta alamatnya. - Seluruh registry melayani klien melalui Registry API v2 yang sama, dan permintaan tanpa token dijawab dengan status HTTP 401.
Referensi#
- Docker Registry — distribution — Dokumentasi proyek distribution, registry self-hosted yang menjadi implementasi rujukan Registry API v2.
- Docker Hub — Docker Docs — Registry publik yang menjadi objek percobaan API pada topik ini.
- Open Container Initiative — Badan standardisasi yang menetapkan spesifikasi image dan distribusi container.