วิธีสร้าง docker registry ง่ายๆ โดย docker-compose

วิธีสร้าง docker registry ง่ายๆ โดย docker-compose

Docker registry ก็คือ ที่เก็บไฟล์ docker image ให้เราสามารถดึงมาใช้งานได้ตลอดเวลา โดยเริ่มต้นส่วนใหญ่เราจะใช้ของ Docker store (Docker hub) ซึ่งมันเป็น public ซึ่งเราสามารถเขียน docker image ของโปรเจ็คเราเองแล้วสามารถนำไปฝากไว้ได้ เพื่อให้เราเรียกใช้ง่ายๆ

ตัวอย่าง docker image ที่ผมเคยทำไว้บน docker hub ก็จะมี https://hub.docker.com/r/snappytux/nginx-php/ และ https://hub.docker.com/r/snappytux/laravel/ ซึ่งตอนนั้นผมทำขึ้นมาเพื่อใช้งานในโปรเจ็คต่างๆ ของผมเอง เพื่อนๆ สามารถนำไปใช้กันได้นะ แต่มันนานมากละ

และมันก็มีโปรเจ็ตตัวหนึ่งของ Twin synergy ที่ผมต้องสร้าง docker registry ไว้เพื่อให้ลูกค้าใช้เอง โดยเราสามารถสร้างขึ้นมาได้ง่ายมากผ่าน docker-compose.yml ดังนี้

version: '2'
services:
  nginx:
    image: nginx:1-alpine
    ports:
      - 443:443
    links:
      - registry
      - registry-web
    volumes:
      - ./conf/nginx/:/etc/nginx/conf.d
      - /etc/localtime:/etc/localtime:ro
    restart: always
  registry:
    image: registry:2
    ports:
      - 127.0.0.1:5000:5000
    environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data:/data
      - ./conf/regist/config.yml:/etc/docker/registry/config.yml
    restart: always
  registry-web:
    image: hyper/docker-registry-web:latest
    ports:
      - 127.0.0.1:8080:8080
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./conf/regist-web:/conf:ro
      - ./data:/data
    links:
      - registry:registry
    restart: always

โดย folder structure ของมันก็เป็นแบบนี้

├── README.md
├── conf
│   ├── nginx
│   │   ├── registry.conf
│   │   ├── registry.password
│   │   └── ssl
│   │       ├── ssl.key
│   │       └── ssl-bundle.crt
│   ├── regist
│   │   └── config.yml
│   └── regist-web
│       └── config.yml
├── data
└── docker-compose.yml

สร้างไฟล์ registry.conf ให้เราใส่ค่าดังนี้

upstream docker-registry {
  server registry:5000;
}
upstream docker-registry-web {
  server registry-web:8080;
}

server {
  listen 443 ssl;
  server_name regist.mellonet.com;

  # SSL
  ssl on;
  ssl_certificate /etc/nginx/conf.d/ssl/ssl-bundle.crt;
  ssl_certificate_key /etc/nginx/conf.d/ssl/ssl.key;

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

  # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
  chunked_transfer_encoding on;

  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 plus add_header
    auth_basic "registry.localhost";
    auth_basic_user_file /etc/nginx/conf.d/registry.password;
    add_header 'Docker-Distribution-Api-Version' 'registry/2.0' 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;
  }
  location / {
      auth_basic "Restricted Content";
      auth_basic_user_file /etc/nginx/conf.d/registry.password;

      proxy_pass                          http://docker-registry-web;
      proxy_set_header  Host              $http_host;
      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;
  }

}

ให้นำไฟล์ ssl ที่เราซื้อมาใส่ใน conf/ > nginx/ > ssl/ ส่วนชื่อไฟล์จะใช้แบบผมก็ได้ ถ้าหากเปลี่ยนชื่อไฟล์ ให้เราไปเปลี่ยนค่าใน registry.conf ด้วย

ssl_certificate /etc/nginx/conf.d/ssl/ssl-bundle.crt; 
ssl_certificate_key /etc/nginx/conf.d/ssl/ssl.key;

สร้างไฟล์ registry.password ใน conf/ > nginx/

เพื่อใช้เป็นระบบ login เข้าหน้าเว็บของ docker registry และเวลาเราใช้คำสั่ง docker login โดย registry-user เปลี่ยนเป็นชื่อที่ต้องการได้

$ htpasswd -c regist.password registry-user
New password: #ใส่รหัสผ่าน
Re-type new password: #ใส่รหัสผ่าน
Adding password for user registry-user

สร้างไฟล์ config.yml ใน conf/ > regist/

เพื่อใช้เป็นการตั้งค่าของระบบ registry

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  delete:
    enabled: true
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

สร้างไฟล์ config.yml ใน conf/ > regist-web/

เพื่อใช้เป็นการตั้งของระบบ registry-web โดย regist.domain.com สามารถเปลี่ยนเป็นชื่อของเราเองได้

registry:
   url: http://registry:5000/v2
   name: regist.domain.com
   readonly: false
   auth:
     enabled: false

เมื่อสร้างครบทุกไฟล์แล้วสามารถนำไปใช้งานได้เลย โดยใช้คำสั่ง docker-compose up -d จากนั้นทดลองเข้าหน้าเว็บ https://regist.domain.com ดูจะพบกับ Password Authentication ของ nginx 

nginx password prompt

หรือทดสอบด้วยการ

$ docker login -u username -p password registry.domain.com
Login Suceeded

เพียงเท่านี้เราก็จะมี docker registry ไว้ใช้ส่วนตัวแล้ว

ของแถม: ใช้ตัวนี้ก็ได้ http://port.us.org/ มันเป็น docker registry สำหรับให้เราใช้งานส่วนตัว

Happy docker :p

0

Add new comment