Sabtu, 18 Januari 2020

DOCKER-membuat docker registry

Membuat Docker Private Registry

Tips sederhana untuk menghemat bandwidth

Mahendra Data

Mahendra Data

Mar 23, 2019 · 3 min read


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.
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

Tidak ada komentar:

Posting Komentar