CI/CD DevOps Docker

Hướng dẫn triển khai CI/CD với gitlab – phần 2: Docker Registry

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-1

Làm thế nào để cài đặt và sử dụng Private Docker Registry

1. Giới thiệu

Ở phần 1, chúng tôi đã tìm hiểu về cách để cài đặt và cấu hình Gitlab. Trong bài này, ta sẽ tiếp tục với bài viết về Docker registry.

Nếu bạn muốn xây dựng hệ thống CI/CD chạy ổn định trên nền tảng Docker, hãy cân nhắc sử dụng private Docker registry. Nó không chỉ giúp tăng tốc quá trình phân phối ứng dụng, mà còn là một trong những cách giúp phân bố tài nguyên và chia sẻ các Docker images giữa các Containers.

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

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-1

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

  • Một account có quyền sudo hoặc root
  • Một client server
  • Một server cho private Docker Registry
  • DockerDocker–Compose trên cả 2 server.
  • Nginx  trên private Docker Registry server

3. Private Docker Registry là gì?

Docker Registry là một ứng dụng phía máy chủ và là một phần của sản phẩm platform-as-a-service của Docker. Nó cho phép bạn lưu trữ cục bộ tất cả các Docker image vào một nơi tập trung.

Khi bạn thiết lập private registry, bạn chỉ định một máy chủ để giao tiếp với Docker Hub qua internet. Vai trò của máy chủ là kéo và đẩy các image, lưu trữ cục bộ và chia sẻ chúng giữa các máy chủ Docker khác.

Bằng cách chạy một registry có thể truy cập từ bên ngoài, điều này giúp bạn có thể tiết kiệm tài nguyên và tăng tốc các tiến trình. Chương trình này cho phép bạn lấy images mà không cần phải kết nối với Docker Hub, tiết kiệm băng thông và bảo vệ hệ thống khỏi các mối đe dọa tiềm ẩn trên môi trường mạng Internetes.

Máy chủ Docker có thể truy cập local repository qua kết nối an toàn và sao chép images từ local registry cục bộ để tạo vùng chứa riêng.

4. Trước khi bắt đầu

Như được liệt kê trong phần điều kiện tiên quyết, trong bài hướng dẫn này giả định rằng bạn đã cài đặt Docker và Docker-Compose trên tất cả các máy chủ.

Bạn có thể kiểm tra các phiên bản của chúng bằng các lệnh:

docker version

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-2

docker-compose version

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-3

Một điều khác bạn sẽ muốn đảm bảo là dịch vụ Docker đang chạy và được thiết lập để khởi động cùng hệ thống:

sudo systemctl start docker
sudo systemctl enable docker

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-4

Lưu ý: Nếu bạn cần hỗ trợ cài đặt Docker, bạn có thể tham khảo hướng dẫn của trên  Docker on DebianCentOS 7, or Ubuntu 18.04.

5. Cài đặt và cấu hình Private Docker Registry

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

Chúng ta sẽ bắt đầu bằng việc tạo thư mục lưu trữ dữ liệu cho private registry. Trước tiên, bạn tạo một thư mục mới, nó dùng để lưu trữ tất cả các tệp cấu hình.

1. Lệnh sau tạo một thư mục mới có nhãn registry  và hai thư mục con – nginxauth:

mkdir -p registry/{nginx, auth}

2. Di chuyển vào registry  và tạo hai thư mục mới bên trong nginx:

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

3. Xem sơ đồ của các thư mục mới được tạo bằng cách gõ:

tree

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-5

Bước 2: Tạo Script Docker-Compose và định nghĩa các dịch vụ

Tiếp theo, bạn cần tạo và cấu hình filedocker-compose.yml . File này định nghĩa phiên bản của Docker-Compose, cũng như các dịch vụ bạn cần để thiết lập private registry.

1. Tạo một tệp mới trong thư mục registry, và sử dụng một trình soạn thảo văn bản bất kỳ:

nano docker-compose.yml

2. Copy nội dung sau vào file docker-compose.yml

version: '3'
services:
#Registry
  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 Service
  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
#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  registrydata:
    driver: local

3. Lưu và đóng file.

Giải thích cấu hình:

Đầu tiên, bạn xác định phiên bản Docker-Compose mà bạn muốn sử dụng. Trong ví dụ này, nó là version: '3'. Sau đó, định nghĩa các thành phần của Docker registry, bắt đầu với dịch vụ #Registry

Docker Registry về cơ bản là một vùng chứa chạy registry image, đó là lý do tại sao image được định nghĩa là registry:2

Thêm dòng để restart: always đảm bảo Docker Registry luôn khởi động cùng hệ thống.

Định nghĩa port 5000:5000 để chỉ định port mapping từ ngoài server vào port bên trong container.

service sẽ mount volume của docker registrydata và thư mục local trên server auth , có chứa file password đã tạo trước đó là registry.passwd

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-6
Thành phần tiếp theo là #Nginx Service . Service này sẽ chạy với port 80:80 ( http) và 443:443 (HTTPS). Nó sẽ mount thư mục local vào thư mục cấu hình bên trong container là (conf.d) và  SSL certificates (ssl).

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-7
Cuối cùng, tham số mynet  sẽ chỉ định bridge driver và registrydata với một local driver, dùng để cấu hình network và volumes cho docker.

huong-dan-trien-khai-ci-cd-voi-gitlab-phan-2-docker-registry-8

Bước 3: Cấu hình Nginx Port Forwarding

Bước tiếp theo, ta sẽ tiến hành cấu hình virtual host cho Nginx

1. Di chuyển vào thư mục nginx/conf.d/ mà chúng ta đã tạo trước đó:

cd nginx/conf.d/

2. Tạo mới một file virutal host có tên là registry.conf:

nano registry.conf

3. Thêm vào những dòng sau:

upstream docker-registry {
    server registry:5000;
}

server {
    listen 80;
    server_name registry.example-server.com;
    return 301 https://registry.example-server.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name registry.example-server.com;

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

    # Log files for Debug
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location / {
        # 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;
        }

        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;
    }

}

4. Lưu lại file và thoát.

Bước 4: Tăng dung lượng file Upload Size cho Nginx

Mặc định, Nginx sẽ giới hạn dung lượng upload size tối đa chỉ là 1MB. Do đó, ta cần tăng dung lượng này lên, bởi vì image docker có dung lượng lớn hơn giá trị mặc định này nhiều. Để đảm bảo bạn có thể upload những image có kích thước lớn, ta sẽ câu hình lại tham số max_body_size  là 2GB.

1. Tạo mới 1 file cấu hình:

nano additional.conf

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

client_max_body_size 2G;

3. Lưu và thoát.

Bước 5: Cấu hình SSL Certificate và Basic Authentication

1. Copy các file SSL certificates vào thư mục ssl .

cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/

2. Di chuyển vào thư mục auth:

cd auth

3. Tạo một username và password mới với tên registry.passwd

htpasswd -Bc registry.passwd example

Lưu ý: Nếu bạn chưa có hoặc chưa biết cách tạo certificate, bạn có thể tham khảo bài viết:  how to generate an openSSL certificate signing request.

Bước 6: Thêm Root CA Certificate

Bây giờ, bạn cần thêm Root CA certificate vào Docker và hệ thống của bạn

1. Tạo file .crt với từ private key rootCA.pem với OpenSSL :

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

2. Copy Root certificate vào một thư mục mới trong Docker certificates:

mkdir -p /etc/docker/certs.d/registry.example-server.com/
cp rootCA.crt /etc/docker/certs.d/example-server.com/

3. Tiếp theo, copy certificate đó vào một thư mục mới khác với tên /usr/share/ca-certificate/extra:

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

4. Tiến hành Reconfigure cho ca-certificate vừa tạo bằng câu lệnh sau:

dpkg-reconfigure ca-certificates

5. Cuối cùng, restart lại Docker service:

systemctl restart docker

Bước 7: Chạy Docker Registry

Sau khi mọi thứ đã được thiết lập, bạn có thể khởi tạo Docker Registry container bằng Docker-Compose:

docker-compose up -d

Kiểm tra lại trạng thái của Nginx services :

docker-compose ps
netstat -plntu

Trong output chúng ta sẽ thấy các port đang listenning.

6. Pull Image Từ Docker Hub đến Private Registry

1. To locally store an image from Docker Hub to your private registry, use the docker pull command:
1. Để lưu trữ image từ Docker Hub đến private registry, sử dụng câu lệnh docker pull sau :

docker pull [docker_image]

2. Tạo tag cho image về private registry:

docker image tag [docker_image] registry.example-server.com/[new_image_name]

3. Kiểm tra lại images

docker images

7. Push Docker Image về Private Registry

1. Để push image từ Docker host về private Docker registry server, đầu tiên ta cần login vào registry với câu lệnh:

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

2. Nhập vào username password mà bạn đã định nghĩa trước đó trong phần virtual host.

3. Bây giờ, bạn có thể push image về private registry với câu lệnh:

docker push registry.example-server.com/[new_image_name]

4. Kiểm tra lại danh sách images được lưu trữ trong private Docker registry:

http -a example https://registry.example-server.com/v2/_catalog

8. Kết Bài

Như vậy, chúng ta đã thiết lập và cấu hình thành công một private Docker registry trên Ubuntu 18.04, cùng với Nginx virtual host và basic authentication. Sử dụng nó để quản lý Docker images và xây dựng các containers trên máy chủ Docker từ xa.  Nếu có khó khăn gì trong quá trình thực hành, vui lòng để lại bình luận. Chúng tôi sẽ hỗ trợ bạn. Chúc bạn thành công !

        Nguồn:                                     Truy Cập Diễn Đàn Ngay

congdonglinux.com                            forum.congdonglinux.com

   [maxbutton id=”2″ ]                            [maxbutton id=”3″ ] 

Đă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ý !