Container DevOps

Hướng dẫn cài đặt Private Docker Registry

docker registry

Giới thiệu

Private Docker registries là một cách thực tế để phân phối tài nguyên và chia sẻ  images Docker  giữa các containers. Thiết lập private registry sẽ tăng tốc độ phân phối và đảm bảo  phát triển CI/CD suôn sẻ  bằng  nền tảng Docker .

Trong hướng dẫn này, hãy tìm hiểu cách thiết lập và cấu hình private Docker registry cho khả năng truy cập bên ngoài.

registry docker

Điều kiện tiên quyết

Private Docker Registry là gì

private Docker registry là registry instance containers được cài đặt trên máy chủ riêng và chỉ khả dụng cho người dùng được ủy quyền. Nó lưu trữ images ở một vị trí tập trung và cung cấp chúng cho tất cả các máy chủ Docker đã được xác thực.

Khi được thiết lập trên máy chủ, private Docker registry sẽ liên lạc với Docker Hub qua internet. Máy chủ pull và push images, lưu trữ cục bộ và chia sẻ chúng với các máy chủ Docker được ủy quyền. Máy chủ có thể truy cập repository cục bộ qua kết nối an toàn và sao chép images từ registry cục bộ để tạo containers.

Private Docker Registry và public

Registries Docker public và private có cùng công nghệ cơ bản nhưng các trường hợp sử dụng khác nhau.

Public registries  lưu trữ images containers mà bất kỳ ai cũng có thể tải xuống và sử dụng. Bản chất truy cập mở của chúng khiến chúng trở thành một nơi tốt để các nhà phát triển chia sẻ các dự án nguồn mở của họ và được tiếp cận rộng rãi hơn. public Docker registry phổ biến nhất là  Docker Hub , nơi lưu trữ hơn năm triệu images có sẵn public.

Private registries  chứa các images containers độc quyền hoặc nhạy cảm không nhằm mục đích phân phối public. Bằng cách yêu cầu xác thực, Registries này hạn chế người có thể pull và push images, tạo ra môi trường phát triển an toàn hơn. Bằng cách thực thi cục bộ, Private registries cũng tăng tốc độ phát triển ứng dụng và tiết kiệm băng thông.

Cài đặt và cấu hình private Docker registry

Thiết lập máy chủ để lưu trữ private Docker registry yêu cầu thực thi dịch vụ registry, cấu hình máy chủ web Nginx và tạo các chứng chỉ bảo mật cần thiết. Thực hiện theo các bước bên dưới để cài đặt private Docker registry trên máy chủ.

Bước 1: Tạo thư mục registry

Tạo một thư mục dự án mới để lưu trữ tất cả các tệp cấu hình cần thiết. Các bước sau đây cho thấy cách tạo cấu trúc thư mục phù hợp:

1. Sử dụng lệnh mkdir sau   để tạo thư mục dự án mới có nhãn  registry  và hai thư mục con,  nginx  và  auth :

mkdir -p registry/{nginx,auth}

2. Tạo hai thư mục mới  conf.d  và  ssl bên trong  nginx thư mục:

mkdir -p registry/nginx/{conf.d,ssl}

3. Đi tới  thư mục registry  và kiểm tra hệ thống phân cấp thư mục bằng cách sử dụng  lệnh tree :

cd registry && tree

Lưu ý : Nếu bạn chưa có  công cụ  tree  thì hãy cài đặt nó với đuôi  sudo apt install tree.

Đầu ra hiển thị cấu trúc cuối cùng của  thư mục dự án registry  .

Bước 2: Tạo Docker Compose Manifest và xác định dịch vụ

Tạo manifest compose.yaml mới   cho Docker Compose. manifest xác định phiên bản Docker Compose và các dịch vụ cần thiết để thiết lập private registry. Các bước sau đây giải thích cách cấu hình  tệp compose.yaml  :

1. Sử dụng  chương trình soạn thảo văn bản  để tạo một tệp mới trong  thư mục registry  . Hướng dẫn này sử dụng  Nano .

nano compose.yaml

2. Dán nội dung sau vào file:

version: '3'
services:
  registry:
    image: registry:2
    restart: always
    ports:
    - "5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registrydata:/data
      - ./auth:/auth
    networks:
      - mynet
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet
networks:
  mynet:
    driver: bridge
volumes:
  registrydata:
    driver: local

Dịch vụ đầu tiên được xác định trong manifest là  dịch vụ registry  . Định nghĩa dịch vụ bao gồm các dữ liệu sau:

  • Vì Docker registry là một containers thực thi  images registry  nên images được định nghĩa là  registry:2.
  • Việc thêm  restart: always dòng đảm bảo dịch vụ registry Docker khởi động khi hệ thống khởi động.
  • Việc đặt  giá trị Port  để  5000:5000 cho Docker biết rằng Port  5000  bên trong containers đang thực thi sẽ ánh xạ tới  Port  5000  trên  hệ điều hành máy chủ .
  • Dịch vụ  gắn ổ đĩa docker registrydata  và  auth thư mục cục bộ, cùng với  registry.passwd tệp xác thực.

Dịch vụ khác thực thi máy chủ web Nginx. Cấu hình đặt dịch vụ thực thi trên các Port  80:80 (HTTPS) và  443:443 (HTTPS). Nó gắn kết các thư mục cục bộ cho cấu hình ảo ( conf.d) và  chứng chỉ SSL  ( ssl).

Cuối cùng, manifest xác định networks và volumes Docker được registry sử dụng. Mạng  mynet thực thi bằng  trình điều khiển bridge  , trong khi  registrydata volumesử dụng  trình điều khiển cục bộ  .

3. Lưu và đóng tệp.

Bước 3: Thiết lập chuyển tiếp Port Nginx

Thực hiện theo quy trình bên dưới để  cấu hình máy chủ ảo Nginx  bằng cách xác định tham số máy chủ trong tệp cấu hình.

1. Tạo một   tệp  máy chủ ảo mới có tên register.conf  trong  thư mục nginx/conf.d  :

nano nginx/conf.d/registry.conf

2. Thêm nội dung sau, thay thế  [domain]  bằng địa chỉ miền của registry, ví dụ:  example.com :

upstream docker-registry {
    server registry:5000;
}

server {
    listen 80;
    server_name registry.[domain];
    return 301 https://registry.[domain]$request_uri;
}

server {
    listen 443 ssl http2;
    server_name registry.[domain];

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

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location / {
        if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" )  {
            return 404;
        }

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

}

3. Lưu tệp và thoát.

Đoạn mã trên xác định các thành phần sau:

  • Kết nối giữa Nginx và  dịch vụ registry  qua  Port 5000 .
  • server block listens trên  Port 80  và thực hiện  chuyển hướng HTTP sang HTTPS .
  • server block listens trên  Port 443  và cung cấp kết nối được mã hóa cho registry. block này cũng được cấu hình để chỉ cho phép kết nối từ các máy khách Docker có phiên bản 1.6 trở lên vì các phiên bản trước đó đã xử lý sai user agents.

Bước 4: Tăng kích thước tệp tải lên Nginx

Theo mặc định, Nginx giới hạn kích thước tệp tải lên ở mức  1MB . Vì nhiều Docker image vượt quá con số này nên cách tốt nhất là tăng kích thước tệp tối đa trên Nginx. Để đảm bảo tải lên thành công images lớn hơn, hãy làm theo các bước bên dưới để tăng giới hạn lên  2GB :

1. Tạo tệp cấu hình Nginx bổ sung bằng cách gõ:

nano nginx/conf.d/additional.conf

2. Thêm dòng sau vào tệp:

client_max_body_size 2G;

3. Lưu và đóng tệp.

Bước 5: cấu hình Chứng chỉ SSL và Xác thực cơ bản

Lưu ý : Nếu bạn chưa có chứng chỉ, hãy xem  cách tạo yêu cầu ký chứng chỉ OpenSSL .

Tiến hành các bước dưới đây để sao chép chứng chỉ SSL của miền vào  thư mục ssl  trong dự án:

1. Sử dụng  lệnh cp  để sao chép  tệp fullchain.pem  :

cp [path-to-file]/fullchain.pem nginx/ssl/

2. Sao chép  tệp privkey.pem  :

cp [path-to-file]/privkey.pem nginx/ssl/

3. Vào  thư mục xác thực  :

cd auth

4. yêu cầu file mật khẩu mới được đặt tên  registry.passwd cho người dùng:

htpasswd -Bc registry.passwd [username]

5. Nhập mật khẩu mạnh và nhập lại để xác nhận. Đầu ra xác nhận sự thành công của hoạt động.

Bước 6: Thêm chứng chỉ CA gốc

Thêm chứng chỉ Root CA vào Docker và hệ thống máy chủ bằng cách làm theo quy trình bên dưới:

1. Xuất  .crt file bằng OpenSSL bằng cách gõ:

openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt

2. Tạo thư mục chứa chứng chỉ Docker:

mkdir -p /etc/docker/certs.d/registry.[domain]/

3. Copy chứng chỉ Root vào thư mục:

cp rootCA.crt /etc/docker/certs.d/registry.[domain]/

4. Tạo một thư mục mới có tên extra trong  thư mục /usr/share/ca-certificates  :

mkdir -p /usr/share/ca-certificates/extra/

5. Sao chép chứng chỉ gốc tương tự vào  thư mục phụ  :

cp rootCA.crt /usr/share/ca-certificates/extra/

6. Cấu hình lại gói vừa tạo  ca-certificate bằng cách gõ:

dpkg-reconfigure ca-certificates

7. Khởi động lại dịch vụ Docker để áp dụng các thay đổi:

systemctl restart docker

Bước 7: thực thi Docker registry

Với mọi thứ đã được thiết lập và sẵn sàng, hãy xây dựng bộ chứa Docker registry và Nginx bằng cách sử dụng Docker Compose:

1. Thực thi  docker compose up lệnh với  -d tùy chọn triển khai các container ở chế độ detached.

docker compose up -d

2. Kiểm tra xem  registry  và  dịch vụ nginx  có đang thực thi không:

docker compose ps

Đầu ra sẽ hiển thị các dịch vụ và Port được chỉ định của chúng.

Cách push images Docker vào private registry

1. Để push images từ máy chủ Docker sang máy chủ Private Docker Registry, hãy đăng nhập vào registry bằng lệnh sau:

docker login https://registry.[domain]/v2/

Ví dụ: để truy cập registry tại  example.com , hãy nhập:

docker login https://registry.example.com/v2/

2. Nhập tên  người dùng  và  mật khẩu  đã tạo ở  Bước 5 .

3. push image vào private registry bằng lệnh:

docker push registry.[domain]/[new-image-name]

pull images từ Docker Hub sang private registry

1. Để lưu trữ cục bộ images từ Docker Hub vào private registry, hãy sử dụng lệnh  docker pull :

docker pull [image]

2. Thêm thẻ vào images để gắn nhãn cho private registry:

docker image tag [image] registry.[domain]/[new-image-name]

3. Kiểm tra xem images Docker có sẵn cục bộ hay không bằng cách nhắc hệ thống liệt kê tất cả các images được lưu trữ cục bộ:

docker images

Phần kết luận

Sau khi làm theo hướng dẫn này, bạn có thể thiết lập thành công private Docker registry trên Ubuntu, cùng với máy chủ ảo Nginx và xác thực cơ bản. Sử dụng nó để quản lý images Docker và xây dựng containers trên máy chủ Docker từ xa.

Nếu bạn chưa quen với Docker, hãy đọc  Cách quản lý containers Docker  để tìm hiểu thêm về các phương pháp hay nhất để quản lý containers bằng Docker.

Đăng ký liền tay Nhận Ngay Bài Mới

Subscribe ngay

Cám ơn bạn đã đăng ký !

Lỗi đăng ký !

Add Comment

Click here to post a comment

Đăng ký liền tay
Nhận Ngay Bài Mới

Subscribe ngay

Cám ơn bạn đã đăng ký !

Lỗi đăng ký !