Cara Membuat Private Docker Registry di Ubuntu 20.04

Cara Membuat Private Docker Registry di Ubuntu 20.04

Jika kamu seorang developer atau sedang mencoba menjadi seorang developer dan aktif menggunakan Docker, kamu memerlukan Docker Registry untuk mendaftarkan atau menyimpan docker images kamu ke repository. Lantas, bagaimana cara membuat private Docker Registry di Ubuntu 20.04?

Sebagai informasi, selain bisa menggunakan Docker Hub sebagai Docker Registry, kamu juga bisa membuatnya sendiri supaya lebih private. Yuk, simak artikelnya berikut ini.

Docker Registry

Docker Registry adalah aplikasi yang mengelola penyimpanan dan pengiriman docker container images. Registry memusatkan images container dan mengurangi waktu build untuk developer. Docker images menjamin runtime environment yang sama melalui virtualisasi, tetapi membangun images dapat melibatkan investasi waktu yang signifikan. 

Misalnya, daripada menginstall dependency dan package secara terpisah untuk menggunakan Docker, developer dapat mengunduh image yang terkompres dari registry yang berisi semua komponen yang diperlukan. 

Selain itu, developer dapat mengotomatiskan pengiriman images ke registry menggunakan Continuous Integration Tools (CI) seperti Travis CI, untuk memperbaharui images dengan lancar selama masa production dan development.

Docker juga memiliki public registry yang gratis, yaitu Docker Hub, yang dapat menghosting docker images khusus kamu, tetapi ada situasi dimana kamu tidak ingin images nya tersedia untuk umum,. Images biasanya berisi semua kode yang diperlukan untuk menjalankan aplikasi, jadi lebih baik menggunakan private registry.

Pada tutorial ini, kita akan membahas mengenai cara membuat private Docker Registry di Ubuntu 20.04.

Persyaratan

Terdapat beberapa persyaratan pada instalasi ini.

Point

Terdapat beberapa rangkuman point instalasi pada artikel ini.

  • Update Server
  • Install & Configure Docker Registry
  • Setting Nginx Port Forwarding
  • Setting Authentication
  • Setting Docker Registry Service
  • Publish ke Private Docker Registry
  • Pull dari Private Docker Registry

Cara Membuat Private Docker Registry di Ubuntu 20.04

Update Server

Login terlebih dahulu ke root server dan update server untuk memastikan packages server nya sudah up-to-date.

$ apt-get update -y

$ reboot

Install & Configure Docker Registry

Perintah Docker berguna saat memulai dan menguji container, tetapi terbukti berat untuk penerapan yang lebih besar yang melibatkan banyak containers yang berjalan secara paralel.

Dengan Docker Compose, kamu bisa menulis satu file .yml untuk menyiapkan konfigurasi pada setiap environment untuk dapat berkomunikasi satu sama lain. Kamu bisa menggunakan docker-compose command-line tool untuk mengeluarkan perintah ke semua komponen aplikasi, sebagai contohnya sebagai group.

Docker Registry sendiri merupakan aplikasi dengan banyak komponen, jadi kamu akan dapat menggunakan Docker Compose untuk mengelolanya. Untuk memulai instance registry, kamu perlu menyiapkan file docker-compose.yml untuk menentukannya dan lokasi disk untuk disimpannya data registry.

Di sini, akan di setting konfigurasi directory bernama docker-registry di server utama. Berikut instruksinya.

$ mkdir ~/docker-registry

$ cd ~/docker-registry

Buat directory data untuk menyimpan images.

$ mkdir data

Buat file docker-compose.yml.

$ nano docker-compose.yml

Pastekan script di bawah ini.

version: '3'

services:

  registry:

    image: registry:2

    ports:

    - "5000:5000"

    environment:

      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data

    volumes:

      - ./data:/data

Penjelasan:

Service yang digunakan nantinya sebagai registry, dan image akan di set ke registry, versi 2. Kemudian, menggunakan port 5000. Yang nantinya setiap request ke port 5000 akan di forward ke registry.

Pada section Environment, menggunakan variable REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY ke /data, variable tersebut digunakan untuk menentukan volume mana yang digunakan untuk menyimpan data. Pada bagian volume, ditentukan directory mana yang akan digunakan sebagai tempat penyimpanan data, di sini kami menggunakan /data. Dan hanya berfungsi sebagai passthrough saja, data sebenarnya disimpan di host file system.

Lakukan konfigurasi dengan perintah di bawah ini.

$ docker-compose up

Output:

cara membuat private docker registry

Kamu akan mendapatkan informasi warning mengenai No HTTP secret provided, perhatikan pada baris terakhir dari output di atas, menunjukkan telah berhasil mulai listen pada port 5000.

CTRL + C untuk menghentikan eksekusi.

Pada step ini kamu telah berhasil membuat konfigurasi Docker Compose untuk memulai Docker Registry agar listen ke port 5000, langkah selanjutnya adalah expose ke domain & set authentication.

Setting Nginx Port Forwarding

Setelah enable HTTPS (SSL) di domain dengan tujuan untuk mengekspos Docker Registry dengan aman, kamu perlu konfigurasi Nginx untuk meneruskan traffic dari domain ke registry container.

Ubah file virtual host yang sudah ada, misalnya pada /etc/nginx/conf.d/vps201.dewiweb.conf

Pastekan script di bawah ini sebelum penutup “}”.

location / {   
# Do not allow connections from docker 1.5 and earlier     
# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents     
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {       return 404;     
}     
proxy_pass http://localhost:5000;     
proxy_set_header  Host              $http_host;   # required for docker client's sake     
proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP     
proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;     
proxy_set_header  X-Forwarded-Proto $scheme;     
proxy_read_timeout                  900; }

Verifikasi konfigurasi.

$ nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Restart Nginx
$ systemctl restart nginx

Untuk memastikan bahwa traffic sudah dialihkan ke registry container dengan port 5000, jalankan perintah berikut.

$ cd ~/docker-registry/

$ docker-compose up

Jika tampilan blank dan terdapat log seperti di bawah ini:

Asset Blog Dewaweb

Perhatikan pada line terakhir, terdapat request GET ke browser dengan return code 200, artinya request berhasil diproses dengan baik.

CTRL + C untuk menghentikan eksekusi.

Pada step ini kamu telah berhasil setting port forwarding, langkah selanjutnya adalah setting authentication untuk kebutuhan security.

Setting Authentication

Nginx memungkinkan kamu mengatur autentikasi HTTP untuk website yang dikelola, yang dapat kamu gunakan untuk membatasi akses ke Docker Registry. Kami kana membuat file otentikasi dengan htpasswd dan menambahkan username serta kombinasi password untuk dapat diterima.

Untuk mendapatkan htpasswd, kamu bisa install apache2-utils package dengan perintah di bawah ini.

$ apt-get install apache2-utils -y

Buat file credentials di dalam directory auth.

$ mkdir ~/docker-registry/auth

$ cd ~/docker-registry/auth

Ubah ninjadewa sesuai dengan username yang kamu inginkan. Kami menggunakan flag algoritma bcrypt.

$ htpasswd -Bc registry.password dewaninja

New password: 

Re-type new password: 

Adding password for user dewaninja

Masukkan password nya sesuai dengan yang kamu inginkan. Kemudian, ubah pada file docker-compose.yml untuk menggunakan user yang sebelumnya sudah dibuat.

$ nano ~/docker-registry/docker-compose.yml

Tambahkan yang kami beri warna merah.

version: '3'

services:

  registry:

    image: registry:2

    ports:

    - "5000:5000"

    environment:

      REGISTRY_AUTH: htpasswd

      REGISTRY_AUTH_HTPASSWD_REALM: Registry

      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password

      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data

    volumes:

      - ./auth:/auth

      - ./data:/data

Save dan exit.

Verifikasikan authentication nya dengan perintah.

$ cd ~/docker-registry/

$ docker-compose up

Jika setting authentication nya berhasil, maka saat akses domain akan menampilkan pop-up seperti di bawah ini.

cara membuat private docker registry

Setting Docker Registry Service

Supaya tidak perlu start manual seperti sebelumnya, kamu bisa setting Docker Registry sebagai service dengan mengubah docker-compose sebagai berikut.

$ cd ~/docker-registry/
$ nano docker-compose.yml

Tambahkan di bawah registry block:

    restart: always

Save dan exit.

Kemudian, jalankan registry di background proses dengan menggunakan flag -d.

$ docker-compose up -d

Output:

[+] Running 1/1

 ✔ Container docker-registry-registry-1  Started  

Tambahkan Max Upload Size Nginx

Untuk kebutuhan push image ke registry, perlu tambahkan max upload pada Nginx.

$ nano /etc/nginx/nginx.conf

Tambahkan script di bawah ini pada section “http {“

...

 client_max_body_size 16384m;

...

Kemudian save dan exit.

Restart Nginx

$ systemctl restart nginx

Publish ke Private Docker Registry

Setelah Service Docker Registry nya sudah up dan berjalan, serta bisa menerima file yang sizenya besar, kamu bisa coba push image ke sana. Kamu bisa gunakan ubuntu image dari Docker Hub, dari public Docker Registry untuk percobaan.

$ docker run -t -i ubuntu /bin/bash

Flag -i dan -t memberikan shell access ke container.

Jika berhasil, maka outputnya:

latest: Pulling from library/ubuntu

2ab09b027e7f: Pull complete 

Digest: sha256:67211c14fa74f070d27cc59d69a7fa9aeff8e28ea118ef3babc295a0428a6d21

Status: Downloaded newer image for ubuntu:latest

root@05442686a04b:/# 

Di atas, kamu sudah berhasil masuk ke Shell Access ke Container ubuntu. Buat file /SUCCESS:

# touch /SUCCESS

Membuat file tersebut untuk mengetahui bahwa kamu sudah melakukan kustomisasi container.

Kemudian exit.

# exit

Create new image dari container yang sudah kamu customize.

$ docker commit $(docker ps -lq) test-image 

Kemudian, kamu login terlebih dahulu ke Private Docker Registry.

$ docker login https://vps201.dewiweb.net

Ubah domainnya sesuai dengan domain kamu.

Output:

Username: dewaninja

Password: 

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

Rename image:

$ docker tag test-image vps201.dewiweb.net/test-image

Push ke Private Docker Registry kamu.

$ docker push vps201.dewiweb.net/test-image

Output:

Using default tag: latest

The push refers to repository [vps201.dewiweb.net/test-image]

d6e5a083b3fc: Pushed 

b93c1bd012ab: Pushed 

latest: digest: sha256:560d20c1a84aceb551b08ec36fbbc18cc3f28bc809b9513092e36ba9e51f83c7 size: 736

Pull dari Private Docker Registry

Setelah image nya berhasil di push ke Private Docker Registry, saat nya kamu melakukan pull.

$ docker login https://vps201.dewiweb.net/

Ubah domainnya sesuai dengan domain kamu.

$ docker pull vps201.dewiweb.net/test-image

$ docker run -it vps201.dewiweb.net/test-image /bin/bash

Lakukan ls untuk list file:

root@832a0d9ab329:/# ls

SUCCESS  bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  va

Terdapat “SUCCESS”, artinya berhasil pull dari latest image customized.

$ exit

Kesimpulan

Jika kamu mengikuti artikel ini dari awal sampai akhir, artinya kamu telah berhasil cara membuat private Docker Registry di Ubuntu 20.04. Demikian artikel ini, jangan sungkan untuk meninggalkan ide-ide topik yang ingin kamu baca di blog Dewaweb. Semoga artikel ini membantu.