Featured image of post Membuat Private Registry

Membuat Private Registry

Maafkan saya yang akhir-akhir ini tidak menulis blog (2 bulan), dikarenakan kerjaan yang padat dan manajemen waktu yang buruk. Namun sekarang saya senggang dan mampu untuk menulis blog.

Intro

Kadang untuk alasan privasi atau mencari kecepatan dalam deployment, seseorang atau suatu perusahaan akan memilih untuk membuat Container Registry-nya sendiri, apalagi sekarang lagi populer banget development aplikasi menggunakan kontainer, cocok banget. Untuk itu dibuatlah artikel ini. Namun pada artikel ini saya hanya akan memberikan contoh kecilnya saja, yang mungkin bisa kalian kembangkan misal kalian ingin membuat cluster container registry, dsb. Okay langsung saja.

Requirement

  • Docker
  • Docker Compose
  • Nginx
  • Certbot/LetsEncrypt (HTTPS bro/gak wajib)
  • Sebuah domain (jika anda orang yang mampu/gak wajib)

Susunan file & directory

1
2
3
4
5
container-registry
├── auth
│   ├── htpasswd
├── docker-compose.yaml
└── registry

Berikut adalah susunan file & directory yang akan digunakan, asumsikan folder utama kita (workdir) bernama container-registry, didalamnya ada directory bernama auth dan registry, auth berisi file htpasswd yang berguna untuk menyimpan user & password sedangkan directory registry adalah folder yang akan digunakan untuk menyimpan semua image yang dipush oleh user. Dan jangan lupakan file docker-compose.yaml, file yang berisi konfigurasi kontainer.

Step-by-step

Ya… HTTPS dan domain itu tidak wajib karena tidak semua orang memiliki uang yang cukup untuk membeli sebuah domain (seperti saya). Sebenarnya untuk login docker registry membutuhkan request HTTPS, tapi kita bisa mem-bypassnya, nanti bakal saya jelasin diakhir artikel.

Docker-compose file

Pertama, kita akan mendeploy sebuah container registry, dan untungnya Docker sudah membuat imagenya agar kita bisa lebih mudah dalam membuat container registry secara pribadi. Pada artikel ini dibuat, docker registry masih dalam versi 2.7.0. Jika ingin menggunakan versi terbaru kalian bisa cek pada Docker Hub.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
version: "3.0"
services:
    registry:
        image: registry:2.7.0
        restart: always
        ports: 
            - 5000:5000
        environment:
            REGISTRY_AUTH: htpasswd
            REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
            REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
        volumes: 
            - ./registry:/var/lib/registry
            - ./auth:/auth

Tapi jangan dideploy terlebih dahulu! Karena kita harus membuat autentikasi password terlebih dahulu.

Autentikasi

Tentu saja kita ingin, registry kita hanya dimasuki oleh orang yang kita beri akses, untuk itu kita harus membuat autentikasi agar user harus login untuk dapat menggunakan registry ini. Masukkan perintah berikut.

1
2
3
4
## Buat folder bernama "auth"
mkdir auth
## Membuat file "htpasswd" didalam folder "auth", dengan user "blog" & password "blogleon666"
docker run --rm --entrypoint htpasswd registry:2.7.0 -Bbn blog blogleon666 > auth/htpasswd

Deployment

Step paling gampang yaitu deployment, karena kita hanya akan menjalankan satu perintah saja.

1
docker-compose up -d

Konfigurasi domain dan SSL

Pada artikel ini, kita akan menggunakan SSL gratis yaitu Certbot/LetsEncrypt. Pertama install terlebih dahulu Certbot & Nginx.

1
2
3
4
5
6
7
8
9
## Install Certbot
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

## Install Nginx Debian Base
sudo apt install nginx -y
## Install Nginx Arch Base
sudo pacman -Sy nginx

Reverse Proxy

Buat reverse proxy terlebih dahulu untuk mengalihkan IP Address server dengan domain yang kita miliki. Kita tidak perlu membuat konfigurasi untuk HTTPS karena nantinya akan digenerate otomatis oleh Certbot.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// Gunakan text editor favorit kalian
cd /etc/nginx/sites-available
sudo nano registry.conf

// Isi dari registry.conf
server {
    client_max_body_size 666M;
    server_name registry.leonprasetya.my.id;
    location / {
        proxy_pass http://172.168.10.1:5000;
    }
}

// Aktifkan reverse proxy
sudo ln -s /etc/nginx/sites-available/registry.conf /etc/nginx/sites-enable
  • client_max_body_size adalah limit upload yang diperbolehkan, kalian bisa atur sesuka hati, namun saya lebih suka memberi angka yang demonic!!!
  • server_name adalah nama domain kalian.
  • proxy_pass adalah alamat IP Address server yang dideploy container registry.

SSL/HTTPS

Let the magic happen. Dengan Certbot, memasang SSL akan terasa sangat mudah.

1
sudo certbot --email [email protected] --nginx -d registry.leonprasetya.my.id

Ketika proses selesai, coba buka file /etc/nginx/sites-available/registry.conf untuk memastikan bahwa konfigurasi SSL sudah berhasil. Jika sudah selesai kurang lebih outputnya akan terlihat seperti ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server {
    server_name registry.leonprasetya.my.id;
    location / {
        proxy_pass http://172.168.10.1:5000;
        proxy_http_version  1.1;
        proxy_cache_bypass  $http_upgrade;
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header Connection        "upgrade";
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host  $host;
        proxy_set_header X-Forwarded-Port  $server_port;
    }
 
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/registry.leonprasetya.my.id/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/registry.leonprasetya.my.id/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
    if ($host = registry.leonprasetya.my.id) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
 
    listen 80;
    server_name registry.leonprasetya.my.id;
    return 404; # managed by Certbot
}

Testing

Pemasangan Reverse Proxy dan SSL adalah step terakhir yang kita lalui, sekarang saatnya untuk mencoba container registry yang telah kita deploy.

Login

1
2
3
4
5
6
7
8
9
# Login dengan username & password yang kita buat sebelumnya!
docker login registry.leonprasetya.my.id
Username: blog
Password: <password_kita>
WARNING! Your password will be stored unencrypted in /home/leon/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
 
Login Succeeded

Pull & Push Image

1
2
3
4
docker pull ubuntu:16.04
docker tag ubuntu:16.04 registry.leonprasetya.my.id/my-ubuntu
docker push registry.leonprasetya.my.id/my-ubuntu
docker pull registry.leonprasetya.my.id/my-ubuntu

Jika tidak paham dengan command berikut, kalian bisa cek pada aritek saya yang sebelumnya yaitu Docker Untuk Pemula hehehe…

Cek Images

Pada container registry ini, kita tidak dapat menggunakan perintah docker search seperti biasanya, sebagai gantinya kita bisa melakukan pengecekan atau melihat semua daftar images pada container registry ini menggunakan HTTP request. Seperti contoh.

1
2
3
curl -X GET http://blog:[email protected]/v2/_catalog
# Output 
{"repositories":["my-ubuntu","postgres"]}

Kita juga dapat melihat list tags pada sebuah image.

1
2
3
curl -X GET http://blog:[email protected]/v2/postgres/tags/list
# Output
{"name":"postgres","tags":["9.6"]}

Insecure Container Registry

Seperti yang saya janjikan diawal artikel ini, untuk teman-teman yang tak memiliki domain atau yang benar-benar hanya ingin Container registry ini diakses secara local, namun normalnya jika kalian mengaksesnya menggunakan menggunakan direct IP Address ataupun protokol HTTP, Docker akan melempar error http: server gave http response to https client. Dan inilah yang akan kita bahas pada bab ini. Buat file daemon.json untuk membuat list insecure-registries (insecure seperti saya).

1
2
3
4
5
sudo nano /etc/docker/daemon.json
 
{
   "insecure-registries" : ["172.168.10.1:5000"]
}

Lalu restart Docker kalian terlebih dahulu. Contoh dibawah menggunakan systemd.

1
sudo systemctl restart docker.service

Lalu kalian bisa login.

1
docker login 172.168.10.1:5000

Konsiderasi

Sebenarnya ada produk Container Registry lain yang ada seperti JFrog dan Nexus keduanya memiliki Web Interface yang memudahkan kita untuk me-manage registry, namun saya memilih Docker karena deployment yang simple dan minimalist. Selalu ada Pro dan Kontra dalam memilih sesuatu, namun kita hanya harus memilih yang cocok untuk kita pakai.

Penutup

Oke sekian artikel pada hari ini, saya sangat senang akhirnya bisa menulis lagi, seperti biasa jika ada pertanyaan/typo/kurang jelas, kalian bisa berdiskusi pada kolom komentar. Sekian dan terimakasih.

Referensi

comments powered by Disqus
Writen with ❤️ by Leon
Built with Hugo
Theme Stack designed by Jimmy