Membuat Docker Private Registry

Tips sederhana untuk menghemat bandwidth

Mahendra Data
3 min readMar 23, 2019

Masih ingat dengan Docker Image berisi Python Keras, NLTK, dan Pandas yang telah saya buat sebelumnya? Docker Image tersebut saya buat untuk membantu istri saya menjalankan program yang dia buat di server karena program tersebut memerlukan waktu yang sangat lama untuk selesai. Ternyata program tersebut juga harus dijalankan beberapa kali untuk validasi output yang dihasilkan. Jika saya menjalankannya secara berurutan maka akan perlu waktu yang lebih lama lagi untuk selesai. Misalnya program tersebut perlu waktu 12 jam untuk selesai, bila saya harus menjalankannya 5 kali, maka perlu waktu 60 jam.

Untuk menghemat waktu, maka saya berencana menjalankan program tersebut dalam 5 server yang berbeda. Masalahnya adalah, image tersebut ukurannya fantastis, 6.8 GB. Build ulang Dockerfile yang telah saya buat di masing-masing server jelas tidak efektif, karena itu artinya harus download ulang semua dependencies program dari internet. Push lalu pull image tersebut ke Docker Hub bakal lebih tidak efektif lagi karena saya harus upload lalu download ulang image berukuran 6.8 GB dari internet ke empat server lainnya.

Akhirnya saya putuskan untuk membuat Docker Private Registry di salah satu server. Rencananya, Docker Image yang telah saya build akan saya push ke Docker Private Registry, sehingga server-server lain tinggal pull dari Docker Private Registry tersebut. Karena Docker Private Registry berada dalam satu LAN, maka tentunya akan dapat menghemat bandwidth secara signifikan.

Topologi

Untuk memudahkan anda memahami perintah-perintah yang ada artikel ini, berikut saya berikan ilustrasi topologi jaringan yang saya gunakan:

                   {INTERNET}
|
{NAT SERVER}
|
|---------|---------|---------|---------|
| | | | |
{A} {B} {C} {D} {E}
10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4 10.0.0.5

Semua Firewall pada server-server tersebut juga telah saya non-aktifkan.

Docker Local Registry

Singkat kata Docker Registry adalah tempat menyimpan dan mengelola Docker Image. Cara membuat Docker Local Registry sangatlah sederhana. Saya login ke salah satu server, dalam hal ini adalah Server A lalu saya jalankan perintah:

$ sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2

Sebuah container berisi program Docker Registry telah berjalan di Server A menggunakan port 5000. Silahkan mencobanya dengan beberapa langkah mudah berikut:

Pull sebuah image dari Docker Hub, misalnya:

$ sudo docker pull alpine:latest

Bila sukses, maka saat menjalankan perintah docker images anda akan mendapati output seperti ini

REPOSITORY  TAG     IMAGE ID      CREATED      SIZE
alpine latest 5cb3aa00f899 2 weeks ago 5.53MB

Beri tag baru pada image tersebut sesuai dengan lokasi Docker Registry, dalam hal ini adalah localhost dengan perintah:

$ sudo docker tag alpine:latest localhost:5000/alpine:latest

Bila anda jalankan lagi perintah docker images maka hasilnya akan menjadi seperti ini

REPOSITORY            TAG     IMAGE ID      CREATED      SIZE
alpine latest 5cb3aa00f899 2 weeks ago 5.53MB
localhost:5000/alpine latest 5cb3aa00f899 2 weeks ago 5.53MB

sekarang push image tersebut ke Docker Local Registry dengan perintah

$ sudo docker push localhost:5000/alpine:latest

Bila berhasil, maka Docker Images tersebut telah disimpan di dalam Docker Registry buatan anda.

Pull Dari Server Lain

Docker Registry yang telah kita buat sebelumnya sebenarnya useless bila tidak bisa digunakan oleh server lain. Bila anda coba jalankan perintah

$ sudo docker pull 10.0.0.1:5000/alpine:latest

dari server lain, misalnya Server B maka anda akan mendapati output:

Error response from daemon: Get https://10.0.0.1:5000/v2/: http: server gave HTTP response to HTTPS client

Error tersebut disebabkan karena secara default Docker hanya mengijinkan pull menggunakan secure connection. karena Docker Registry yang kita buat pada Server A hanya menggunakan http, maka perintah pull yang kita jalankan akan gagal.

Agar kita bisa pull dari Server A maka tambahkan sebuah file /etc/docker/daemon.json di Server B, C, D, dan E dengan isi

{
"insecure-registries" : ["10.0.0.1:5000"]
}

Anda bisa menyesuaikan IP dalam file tersebut sesuai dengan IP server anda. Restart service Docker pada Server B, C, D, dan E, misalnya dengan perintah:

$ sudo systemctl restart docker.service

Kemudian cobalah lagi perintah

$ sudo docker pull 10.0.0.1:5000/alpine:latest

Bila berhasil, maka perintah docker images akan menampilkan

REPOSITORY            TAG     IMAGE ID      CREATED      SIZE
10.0.0.1:5000/alpine latest 5cb3aa00f899 2 weeks ago 5.53MB

Membuat Secure Docker Registry

Sebenarnya kita bisa mengembangkan Docker Registry yang dilengkapi dengan secure dan authentication protokol, namun tidak dibahas dalam artikel ini karena akan terlalu panjang. Bila anda tertarik, anda bisa mempelajarinya melalui dokumentasi Docker berikut ini

Semoga bermanfaat.

--

--

Mahendra Data

Lecturer at Faculty of Computer Science, Universitas Brawijaya • System Administrator • https://www.linkedin.com/in/mahendra-data/