Deploy Private Docker Registry di Server Ubuntu 18.04

Senin, 08 Maret 2021

Deploy Private Docker Registry di Ubuntu 18.04. Di tutorial ini saya akan sharing mengenai bagaiman acara private docker registry di server Ubuntu. Docker registry adalah aplikasi yang mengelola dan menyimpan docker images. Hal ini berguna untuk memudahkan developer/sysadmin dalam proses deploy karena tidak perlu lagi melakukan build image setiap ingin melakukan deploy.

Docker sendiri menyediakan public Docker Registry bernama Docker Hub. Namun jika kasusnya adalah kalian membuild image yang tidak seharusnya bisa diakses oleh publik, solusinya adalah membuat server Docker Registry sendiri. Di tutorial ini saya akan share bagaimana cara men-deploy private Docker Registry di server Ubuntu 18.04, dengan docker-compose dan juga Nginx sebagai reverse proxy-nya.


Sebelum memulai tutorial ini, pastikan kalian sudah menginstall docker, docker- compose, dan Nginx di server Ubuntu 18.04 kalian.

Install Docker CE dan Docker Compose
Oke langsung saja ya...
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose

sudo usermod -aG docker $(whoami)

Setup Container Docker Registry

Buat direktori untuk menyimpan file konfigurasi maupun data dari docker registry.

mkdir docker-registry && cd $_

Didalam direktori docker-registry kita buat lagi dir data dan auth.

mkdir {data,auth}

Selanjutnya adalah mengatur autentifikasi. Disini kita gunakan http auth.

sudo apt install apache2-utils

cd auth

htpasswd -Bc .registry_auth username

.registry_auth adalah nama file passwd-nya, sementara untuk username silahkan sesuaikan sendiri. Untuk enkripsinya, docker registry hanya menerima bcrypt encryption, jadi kita tambahkan flag B.

Setelah file auth ditambahkan, sekarang kita buat file docker-composenya. Balik lagi ke direktori docker-registry lalu buat file docker-compose.yml. Isinya:

version: '3'

services:
  registry:
    image: registry:2.7.1
    container_name: docker-registry
    restart: always
    ports:
    - "127.0.0.1:5000:5000"
    environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/.registry_auth
    volumes:
      - ./auth:/auth
      - ./data:/data
Untuk exposing port nya silahkan kalian sesuaikan sendiri.
Tinggal kita jalankan container docker-registry dengan command
docker-compose up -d
Jika tidak ada error, docker-registry akan berjalan di 127.0.0.1:5000. Tinggal kita expose lewat Nginx dengan fitur reverse proxy mereka. Berikut pengaturan vhost Nginx yang saya gunakan. Silahkan sesuaikan sendiri.
server {
       listen         80;
       server_name    registry.linuxsec.org;
       return         301 https://$server_name$request_uri;
}

server {
  listen       443 ssl http2;
  listen       [::]:443 ssl http2;
  server_name  registry.linuxsec.org;
  server_tokens off;

  ssl_protocols TLSv1.2 TLSv1.3;          # TLS 1.3 requires nginx >= 1.13.0
  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem; # openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM";
  ssl_ecdh_curve secp384r1;               # Requires nginx >= 1.1.0
  ssl_session_timeout  10m;
  ssl_session_cache shared:SSL:10m;
  ssl_session_tickets off;                # Requires nginx >= 1.5.9
  ssl_stapling on;                        # Requires nginx >= 1.3.7
  ssl_stapling_verify on;                 # Requires nginx => 1.3.7
  ssl_early_data off;                     # 0-RTT, enable if desired - Requires nginx >= 1.15.4
  resolver 1.1.1.1 valid=300s;            # Replace with your local resolver
  resolver_timeout 10s;

  # HTTP Security Headers
  ssl_certificate /etc/nginx/ssl-cert/linuxsec/fullchain.pem;
  ssl_certificate_key /etc/nginx/ssl-cert/linuxsec/privkey.pem;

  root /var/www/registry;
  access_log /var/log/nginx/registry_access.log;
  error_log  /var/log/nginx/registry_error.log warn;
  index index.html;
  
  client_max_body_size 2000M;
  
  location / {
    proxy_pass       http://localhost:5000;
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
    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_http_version 1.1;
    proxy_pass_request_headers on;
  }

# Allow Let's Encrypt
location ~ /.well-known {
        allow all;
   }
}
Untuk SSLnya, kalian bisa gunakan Let's Encrypt.
Push Image ke Docker Registry
Setelah docker registry kalian berjalan, kalian bisa mulai menyimpan image di server private docker registry tersebut.
Pertama, login ke docker registry dengan command
docker login https://registry.domain.com
Masukkan username dan password yang sudah kalian atur menggunakan htpasswd saat melakukan deploy server Docker Registry diatas.

Selanjutnya, tambahkan tag image pada image yang ada di local. Misalnya:
docker tag private-vpn registry.domain.com/private-vpn
Lalu push image tersebut ke server private docker registry.
docker push registry.domain.com/private-vpn
Pull Image dari Docker Registry
Untuk pull image dari client juga gampang. Pertama, login ke docker registry
docker login https://registry.domain.com
Lalu tinggal pull image yang ada di docker-registry. Contoh:
docker pull registry.domain.com/private-vpn
Oke mungkin sekian tutorial singkat kali ini, semoga bermanfaat. Jika ada yang ingin ditanyakan silahkan tinggalkan komentar.

Artikel Terkait Docker