+1

Hướng dẫn cách tự xây dựng Container Registry cho riêng mình

Container registry là một danh mục lưu trữ nơi bạn có thể đẩy và kéo các container image. Có rất nhiều registry công khai và riêng tư dành cho các nhà phát triển như Docker Hub, Amazon ECR và Google Cloud Artifact Registry. Tuy nhiên, đôi khi, thay vì dựa vào một nhà cung cấp bên ngoài, bạn có thể muốn tự lưu trữ các image của mình. Điều này giúp bạn kiểm soát nhiều hơn cách registry được định cấu hình và nơi lưu trữ các container image.

Bài viết này là một hướng dẫn thực hành sẽ chỉ cho bạn cách tự lưu trữ Container Registry. Để hiểu rõ bài viết này, bạn nên quen thuộc với các công cụ như Docker và NGINX, đồng thời hiểu chung về container.

Container Image là gì?

Trước khi nói về container registry, trước tiên hãy hiểu container image là gì. Nói một cách dễ hiểu, container image là một gói bao gồm tất cả các tệp, thư viện và cấu hình để chạy một container. Chúng được tạo thành từ các lớp, trong đó mỗi lớp đại diện cho một tập hợp các thay đổi của hệ thống tệp để thêm, xóa hoặc sửa đổi tệp.

Cách phổ biến nhất để tạo container image là sử dụng Dockerfile.

# build an image
docker build -t pliutau/hello-world:v0 .

# check the images locally
docker images
# REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
# hello-world   latest    9facd12bbcdd   22 seconds ago   11MB

Điều này tạo ra một container image được lưu trữ trên máy cục bộ của bạn. Nhưng điều gì sẽ xảy ra nếu bạn muốn chia sẻ image này với người khác hoặc sử dụng nó trên một máy khác? Đây là lúc container registry phát huy tác dụng.

Container Registry là gì?

Container registry là một danh mục lưu trữ nơi bạn có thể đẩy và kéo các container image. Các image được nhóm thành các repository, là tập hợp các image có liên quan với cùng tên. Ví dụ: trên Docker Hub registry, nginx là tên của repository chứa các phiên bản khác nhau của image NGINX.

Một số registry là công khai, có nghĩa là bất kỳ ai trên Internet đều có thể truy cập các image được lưu trữ trên đó. Các registry công khai như Docker Hub là một lựa chọn tốt để lưu trữ các dự án mã nguồn mở.

Mặt khác, các registry riêng tư cung cấp một cách để kết hợp bảo mật và quyền riêng tư vào bộ nhớ container image của doanh nghiệp, được lưu trữ trên đám mây hoặc tại chỗ. Các registry riêng tư này thường đi kèm với các tính năng bảo mật nâng cao và hỗ trợ kỹ thuật.

Có một danh sách ngày càng tăng các registry riêng tư có sẵn như Amazon ECR, GCP Artifact Registry, GitHub Container Registry và Docker Hub cũng cung cấp tính năng repository riêng tư.

Là một lập trình viên, bạn tương tác với container registry khi sử dụng lệnh docker push và docker pull.

docker push docker.io/pliutau/hello-world:v0

# In case of Docker Hub we could also skip the registry part
docker push pliutau/hello-world:v0

Hãy cùng xem xét cấu trúc của URL hình ảnh chứa:

docker pull docker.io/pliutau/hello-world:v0@sha256:dc11b2...
                |            |            |          |
                ↓            ↓            ↓          ↓
             registry    repository      tag       digest

Khi nào bạn nên tự xây dựng Container Registry?

Đôi khi, thay vì dựa vào nhà cung cấp như AWS hoặc GCP, bạn có thể muốn tự lưu trữ image của mình. Điều này giữ cho cơ sở hạ tầng của bạn nội bộ và khiến bạn ít phụ thuộc hơn vào các nhà cung cấp bên ngoài. Trong một số ngành công nghiệp bị quản lý chặt chẽ, đây thậm chí còn là một yêu cầu.

Một registry tự lưu trữ chạy trên máy chủ của riêng bạn, giúp bạn kiểm soát nhiều hơn cách registry được định cấu hình và nơi lưu trữ các container image. Đồng thời, nó đi kèm với chi phí duy trì và bảo mật registry.

Có một số giải pháp container registry mã nguồn mở có sẵn. Loại phổ biến nhất được Docker hỗ trợ chính thức, được gọi là registry, với việc triển khai để lưu trữ và phân phối các container image và artifact. Điều này có nghĩa là bạn có thể chạy registry của riêng mình bên trong một container.

Dưới đây là các bước chính để chạy registry trên máy chủ:

  • Cài đặt Docker và Docker Compose trên máy chủ.
  • Định cấu hình và chạy container registry.
  • Chạy NGINX để xử lý TLS và chuyển tiếp yêu cầu đến container registry.
  • Thiết lập chứng chỉ SSL và định cấu hình một tên miền.

Cài đặt Docker và Docker Compose trên máy chủ

Bạn có thể sử dụng bất kỳ máy chủ nào hỗ trợ Docker. Ví dụ: bạn có thể sử dụng DigitalOcean Droplet với Ubuntu. Đối với bản demo này, tôi đã sử dụng Google Cloud Compute để tạo máy ảo với Ubuntu.

neofetch

# OS: Ubuntu 20.04.6 LTS x86_64
# CPU: Intel Xeon (2) @ 2.200GHz
# Memory: 3908MiB

Khi đã vào bên trong máy ảo, chúng ta nên cài đặt Docker và Docker Compose. Docker Compose là tùy chọn, nhưng nó giúp dễ dàng quản lý các ứng dụng đa container hơn.

# install docker engine and docker-compose
sudo snap install docker

# verify the installation
docker --version
docker-compose --version

Định cấu hình và chạy Container Registry

Tiếp theo, chúng ta cần định cấu hình container registry của mình. Tệp compose.yaml sau đây sẽ tạo một container registry với một volume để lưu trữ các image và một volume để lưu trữ tệp mật khẩu.

services:
  registry:
    image: registry:latest
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      # Mount the password file
      - ./registry/registry.password:/auth/registry.password
      # Mount the data directory
      - ./registry/data:/data
    ports:
      - 5000

Tệp mật khẩu được xác định trong REGISTRY_AUTH_HTPASSWD_PATH được sử dụng để xác thực người dùng khi họ đẩy hoặc kéo image từ registry. Chúng ta nên tạo một tệp mật khẩu bằng lệnh htpasswd. Chúng ta cũng nên tạo một thư mục để lưu trữ các image.

mkdir -p ./registry/data

# install htpasswd
sudo apt install apache2-utils

# create a password file. username: busy, password: bee
htpasswd -Bbn busy bee > ./registry/registry.password

Bây giờ chúng ta có thể khởi động container registry. Nếu bạn thấy thông báo này, thì mọi thứ đang hoạt động như bình thường:

docker-compose up

# successfull run should output something like this:
# registry | level=info msg="listening on [::]:5000"

Chạy NGINX để xử lý TLS

Như đã đề cập trước đó, chúng ta có thể sử dụng NGINX để xử lý TLS và chuyển tiếp yêu cầu đến container registry.

Docker Registry yêu cầu chứng chỉ SSL đáng tin cậy hợp lệ để hoạt động. Bạn có thể sử dụng một cái gì đó như Let's Encrypt hoặc lấy nó theo cách thủ công. Đảm bảo rằng bạn có một tên miền trỏ đến máy chủ của mình (registry.pliutau.com trong trường hợp của tôi). Đối với bản demo này, tôi đã có được chứng chỉ bằng cách sử dụng certbot và đặt nó vào thư mục ./nginx/certs.

Vì chúng ta đang chạy Docker Registry trong một container, chúng ta cũng có thể chạy NGINX trong một container bằng cách thêm service sau vào tệp compose.yaml:

services:
  registry:
    # ...
  nginx:
    image: nginx:latest
    depends_on:
      - registry
    volumes:
      # mount the nginx configuration
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      # mount the certificates obtained from Let's Encrypt
      - ./nginx/certs:/etc/nginx/certs
    ports:
      - "443:443"

Tệp nginx.conf của chúng ta có thể trông như thế này:

worker_processes auto;

events {
    worker_connections 1024;
}

http {
    upstream registry {
        server registry:5000;
    }

    server {
        server_name registry.pliutau.com;
        listen 443 ssl;

        ssl_certificate /etc/nginx/certs/fullchain.pem;
        ssl_certificate_key /etc/nginx/certs/privkey.pem;

        location / {
            # important setting for large images
            client_max_body_size                1000m;

            proxy_pass                          http://registry;
            proxy_set_header  Host              $http_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_read_timeout                  900;
        }
    }
}

Vận hành Container Registry

Sau những bước này, chúng ta có thể chạy các container registry và Nginx của mình.

docker-compose up

Bây giờ, ở phía máy khách, bạn có thể đẩy và kéo các image từ registry của mình. Nhưng trước tiên, chúng ta cần đăng nhập vào registry.

docker login registry.pliutau.com

# Username: busy
# Password: bee
# Login Succeeded

Đã đến lúc xây dựng và đẩy image của chúng ta đến registry tự lưu trữ:

docker build -t registry.pliutau.com/pliutau/hello-world:v0 .

docker push registry.pliutau.com/pliutau/hello-world:v0
# v0: digest: sha256:a56ea4... size: 738

Trên máy chủ của bạn, bạn có thể kiểm tra các image đã tải lên trong thư mục dữ liệu:

ls -la ./registry/data/docker/registry/v2/repositories/

Các lựa chọn khác

Làm theo ví dụ trên, bạn cũng có thể chạy registry trên Kubernetes. Hoặc bạn có thể sử dụng dịch vụ registry được quản lý như Harbor, là một registry mã nguồn mở cung cấp các tính năng bảo mật nâng cao và tương thích với Docker và Kubernetes.

Ngoài ra, nếu bạn muốn có UI cho registry tự lưu trữ của mình, bạn có thể sử dụng một dự án như joxit/docker-registry-ui và chạy nó trong một container riêng biệt.

Kết luận

Container Registry tự lưu trữ cho phép bạn kiểm soát hoàn toàn registry của mình và cách triển khai nó. Đồng thời, nó đi kèm với chi phí duy trì và bảo mật registry.

Cho dù lý do của bạn để chạy một registry tự lưu trữ là gì, bây giờ bạn đã biết cách thực hiện. Từ đây, bạn có thể so sánh các tùy chọn khác nhau và chọn tùy chọn phù hợp nhất với nhu cầu của mình.

Cảm ơn các bạn đã lắng nghe.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí