Ga Punya Server Buat Bikin Docker Registry?

Kalau ga ada masalah sama jumlah server, tinggal install nginx+registry versi docker dua-duanya.

Tapi untuk yang ga punya banyak server, kita bisa manfaatin server kita yang sudah terinstall nginx untuk setup docker private registry, domain, certificate (certbot) dan otentikasi (nginx httpd auth).


Jangan Banyak Alasan, Yuk Kita Buat

  1. Buat file baru docker-compose.yml isi dengan kode di bawah lalu jalankan dengan docker-compose up -d
version: '3'

services:
  registry:
    image: registry:2.7.1
    container_name: registry
    ports:
      - 127.0.0.1:5000:5000
    environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
      REGISTRY_STORAGE_DELETE_ENABLED: 'true'
      REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials: '[true]'
      REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods: '[HEAD, GET, OPTIONS, DELETE]'
      REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers: '[Authorization, Accept]'
      REGISTRY_HTTP_HEADERS_Access-Control-Max-Age: '[1728000]'
      REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers: '[Docker-Content-Digest]'
  volumes:
      - registry-data:/data

volumes:
    registry-data:
  1. Berikut nginx config nya, cukup copy bagian docker registry saja ya, saya anggap anda sudah terbiasa menggunakan nginx dan certbot.
upstream docker-registry {
  server 127.0.0.1:5000;
}

## Set a variable to help us decide if we need to add the
## 'Docker-Distribution-Api-Version' header.
## The registry always sets this header.
## In the case of nginx performing auth, the header is unset
## since nginx is auth-ing before proxying.
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
  '' 'registry/2.0';
}
server {
  server_name myprivateregistry.com;
  server_tokens off;

  # disable any limits to avoid HTTP 413 for large image uploads
  client_max_body_size 0;

  location / {
      # add auth basic at root app
      # dont forget to setup nginx-http-auth fail2ban
      auth_basic "Registry realm";
      auth_basic_user_file /etc/nginx/docker-registry-pass;
    }
location /v2/ {
    # 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;
    }

    # To add basic authentication to v2 use auth_basic setting.
    auth_basic "Registry realm";
    auth_basic_user_file etc/nginx/docker-registry-pass;

    ## If $docker_distribution_api_version is empty, the header is not added.
    ## See the map directive above where this variable is defined.
    add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

    proxy_pass                          http://docker-registry;
    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;
  }



  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/myprivateregistry.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/myprivateregistry.com/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 = myprivateregistry.com) {
      return 301 https://$host$request_uri;
  } # managed by Certbot


  server_name myprivateregistry.com;
  return 404; # managed by Certbot
}
  1. Buat otentikasi
docker run --rm --entrypoint htpasswd registry:2 -Bbn usernamenya passwordnya > /etc/nginx/docker-registry-pass
  1. Coba login, docker login myprivateregistry.com

    Login Berhasil

    Login Berhasil

  2. Kita test push image httpd ke private registry

docker tag httpd:2 myregistry.com/httpd:2
docker push myregistry.com/httpd:2
  1. Cek image katalog menggunakan curl
 curl -X GET -u usernamenya:passwordnya https://myprivateregistry/v2/_catalog
Test Push lalu Cek Image Katalog

Test Push lalu Cek Image Katalog

Referensi: