Membuat Docker Private Registry
Tips sederhana untuk menghemat bandwidth
Buat docker file trus build
root@ubuntu:~/docker/laravel# ls
Dockerfile laravel.conf
Dockerfile.save oracle-instantclient12.1-basic_12.1.0.2.0-2_amd64.deb
Dockerfileold oracle-instantclient12.1-devel_12.1.0.2.0-2_amd64.deb
composer.phar redis.conf
root@ubuntu:~/docker/laravel#
root@ubuntu:~/docker/laravel# docker build -t yogyagroup/laravel:14.04 .
root@ubuntu:~/docker/laravel# docker tag yogyagroup/laravel:14.04 localhost:5000/yogyagroup/laravel:14.04
root@ubuntu:~/docker/laravel# docker push localhost:5000/yogyagroup/laravel:14.04
The push refers to repository [localhost:5000/yogyagroup/laravel]
b4c1b135b1a0: Preparing
14.04: digest: sha256:8d490c12a67871d6436574395e0fa50f67d3ece86b0c7d499a7528ef2f75f30a size: 8697
root@ubuntu:~/docker/laravel# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/yogyagroup/laravel 14.04 2166e0593a36 7 minutes ago 982MB
yogyagroup/laravel 14.04 2166e0593a36 7 minutes ago 982MB
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.
root@ubuntu:~/docker/laravel# ls
Dockerfile laravel.conf
Dockerfile.save oracle-instantclient12.1-basic_12.1.0.2.0-2_amd64.deb
Dockerfileold oracle-instantclient12.1-devel_12.1.0.2.0-2_amd64.deb
composer.phar redis.conf
root@ubuntu:~/docker/laravel#
root@ubuntu:~/docker/laravel# docker build -t yogyagroup/laravel:14.04 .
root@ubuntu:~/docker/laravel# docker tag yogyagroup/laravel:14.04 localhost:5000/yogyagroup/laravel:14.04
root@ubuntu:~/docker/laravel# docker push localhost:5000/yogyagroup/laravel:14.04
The push refers to repository [localhost:5000/yogyagroup/laravel]
b4c1b135b1a0: Preparing
14.04: digest: sha256:8d490c12a67871d6436574395e0fa50f67d3ece86b0c7d499a7528ef2f75f30a size: 8697
root@ubuntu:~/docker/laravel# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/yogyagroup/laravel 14.04 2166e0593a36 7 minutes ago 982MB
yogyagroup/laravel 14.04 2166e0593a36 7 minutes ago 982MB
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 iniREPOSITORY 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 iniREPOSITORY 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 menampilkanREPOSITORY 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
Tidak ada komentar:
Posting Komentar