Thursday, November 21, 2024

[Docker] Phần 11 – Tạo kho chứa Registry riêng để chứa các Image Docker

-

Mở đầu.

Trong thế giới phát triển phần mềm hiện đại, việc sử dụng các ứng dụng và dịch vụ dựa trên Docker đã trở nên rất phổ biến. Docker là một nền tảng ảo hóa ứng dụng giúp đóng gói ứng dụng cùng với tất cả các phụ thuộc của nó thành một container, đảm bảo tính di động và khả năng chạy trên bất kỳ máy chủ nào có Docker cài đặt. Để quản lý và chia sẻ các Docker image của chúng ta, việc sử dụng một kho chứa Registry riêng là một giải pháp thông minh. Trong bài viết này, chúng ta sẽ khám phá cách tạo và quản lý một kho chứa Registry Docker riêng, sử dụng image registry:2.8.3. Kho chứa này sẽ cho phép chúng ta lưu trữ, đẩy (push) và kéo (pull) các Docker image một cách an toàn và hiệu quả.

Chúng ta sẽ tìm hiểu cách cài đặt và cấu hình Registry, tạo và quản lý các image Docker trong kho chứa này, và cuối cùng, xem xét một số lợi ích và ứng dụng của việc sử dụng kho chứa Registry Docker riêng trong quá trình phát triển và triển khai ứng dụng.

Khởi tạo registry riêng.

  • Các thông tin chính của registry:
    • Cổng dịch vụ 5000
    • Phiên bản có thể dùng: registry:2.8.3
    • Dữ liệu lưu tại /var/lib/registry của container.

Giả sử máy host đang có địa chỉ IP là 192.168.13.191, cài đặt để Docker truy cập được đến kho ở địa chỉ 192.168.13.191:5000, có thiết lập để lưu dữ liệu cố định ở máy host /home/registry/ (nếu chưa có bạn tạo thư mục này trước).

mkdir /home/registry

Sau đó hay pull image registry:2.8.3 này về.

docker pull registry:2.8.3

Chạy lệnh docker run để khởi tạo container.

docker run -itd --name=registry -p 5000:5000 -v /home/registry:/var/lib/registry registry:2.8.3

Xác nhận lại container đã khởi tạo thành công với docker ps.

$ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                                       NAMES
8b437b59a4e0   registry:2.8.3   "/entrypoint.sh /etc…"   10 seconds ago   Up 10 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry

Push image vào registry vừa tạo xong.

Để đẩy một Image đang có ở máy local lên kho riêng có địa chỉ 192.168.13.191:5000 thì cần đặt tên Image phần tên có chứa địa chỉ ở đầu với cấu trúc như sau: <private_registry>/image_name:tag với private_registry là địa chỉ của registry.

Giờ hãy pull một Image từ hub.docker.com về (hoặc nếu thích thì build riêng một image), giả sử mình sẽ build 1 webserver sử dụng Nginx phiên bản latest.

Tạo nội dung file config của Nginx.

cat > /home/registry/nginx.conf << 'OEF'
server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://web;
    }
}
OEF

Tạo nội dung website.

cat > /home/registry/index.html << 'OEF'
<!DOCTYPE html>
<html>
    <head>
        <title>Welcome to my website server</title>
    </head>
    <body>
        <h1>This is the custom content of website server</h1>
    </body>
</html>
OEF

Tạo Dockerfile.

cat > /home/registry/Dockerfile << 'OEF'
FROM haproxy:latest
COPY ./index.html /usr/share/nginx/html/index.html
OEF

Bây giờ hãy build image này bằng lệnh docker build.

$ docker build -t webserver:1.0.1 --force-rm -f Dockerfile .
[+] Building 1.7s (7/7) FINISHED                                                                                                                                                                                docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                      0.1s
 => => transferring dockerfile: 105B                                                                                                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                                                                                                         0.2s
 => => transferring context: 2B                                                                                                                                                                                           0.0s
 => [internal] load metadata for docker.io/library/nginx:latest                                                                                                                                                           1.2s
 => [internal] load build context                                                                                                                                                                                         0.1s
 => => transferring context: 229B                                                                                                                                                                                         0.0s
 => [1/2] FROM docker.io/library/nginx:latest@sha256:32da30332506740a2f7c34d5dc70467b7f14ec67d912703568daff790ab3f755                                                                                                     0.0s
 => CACHED [2/2] COPY ./index.html /usr/share/nginx/html/index.html                                                                                                                                                       0.0s
 => exporting to image                                                                                                                                                                                                    0.0s
 => => exporting layers                                                                                                                                                                                                   0.0s
 => => writing image sha256:8d4342f672f15cf53a57eecd20e6c68ff5ba0bbadeb5a184994542f9d2e6e038                                                                                                                              0.0s
 => => naming to docker.io/library/webserver:1.0.1                                                                                                                                                                        0.0s

Sau khi build xong image webserver thì nó có ID là 8d4342f672f1.

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
webserver    1.0.1     8d4342f672f1   4 minutes ago   187MB
registry     2.8.3     0ae1560ca86f   36 hours ago    25.4MB

Đổi tên image này thành tên 192.168.13.191:5000/webserver:1.0.1.

docker tag 8d4342f672f1 192.168.13.191:5000/webserver:1.0.1

Kết quả sau khi đổi tên như dưới.

$ docker image ls
REPOSITORY                      TAG       IMAGE ID       CREATED         SIZE
192.168.13.191:5000/webserver   1.0.1     8d4342f672f1   6 minutes ago   187MB
webserver                       1.0.1     8d4342f672f1   6 minutes ago   187MB
registry                        2.8.3     0ae1560ca86f   36 hours ago    25.4MB

Với cách đặt tên như vậy, nếu dùng lệnh docker push nó sẽ đẩy lên kho chứa có địa chỉ 192.168.13.191:5000 là kho chứa của bạn. Nhưng trước khi đẩy image lên kho chứa riêng của bạn, bạn cần cấu hình Docker daemon cho phép kho chứa Registry không an toàn (insecure registries) được Docker daemon cho phép sử dụng. Để sửa nó, bạn cần chỉnh sửa file cấu hình Docker daemon.

Bạn cần tạo nó nếu chưa tồn tại hoặc nếu đã tồn tại thì thêm nội dung dưới vào (với 192.168.13.191:5000 là địa chỉ của kho chứa).

cat > /etc/docker/daemon.json << 'OEF'
{
  "insecure-registries" : ["192.168.13.191:5000"]
}
OEF

Sau khi bạn đã mở file cấu hình Docker daemon, bạn có thể tìm và chỉnh sửa phần "insecure-registries" để thêm hoặc loại bỏ kho chứa Registry không an toàn theo ý muốn. Đảm bảo lưu lại file sau khi chỉnh sửa.

Sau khi bạn đã chỉnh sửa cấu hình, bạn cần khởi động lại Docker daemon để áp dụng các thay đổi. Trên Linux, bạn có thể làm điều này bằng cách sử dụng lệnh:

sudo systemctl restart docker

Giờ thì hay dùng lệnh push để đẩy image này lên kho chứa của bạn nhé.

$ docker push 192.168.13.191:5000/webserver:1.0.1
The push refers to repository [192.168.13.191:5000/webserver]
1c0c0108f3a6: Pushed 
d26d4f0eb474: Pushed 
a7e2a768c198: Pushed 
9c6261b5d198: Pushed 
ea43d4f82a03: Pushed 
1dc45c680d0f: Pushed 
eb7e3384f0ab: Pushed 
d310e774110a: Pushed 
1.0.1: digest: sha256:c6fe75b0f5a6182ed7cff8a57b7bec5790efe7b03d632fb7dd07f4b6a832536c size: 1985

Pull image từ registry vừa push lên xong.

Sau lệnh này thì khó chứa đã có image với tên đầy đủ 192.168.13.191:5000/webserver:1.0.1, bất kỳ lúc nào có thể tải lại bằng lệnh pull.

$ docker pull 192.168.13.191:5000/webserver:1.0.1
1.0.1: Pulling from webserver
a803e7c4b030: Already exists 
8b625c47d697: Already exists 
4d3239651a63: Already exists 
0f816efa513d: Already exists 
01d159b8db2f: Already exists 
5fb9a81470f3: Already exists 
9b1e1e7164db: Already exists 
5b717725e189: Already exists 
Digest: sha256:c6fe75b0f5a6182ed7cff8a57b7bec5790efe7b03d632fb7dd07f4b6a832536c
Status: Downloaded newer image for 192.168.13.191:5000/webserver:1.0.1
192.168.13.191:5000/webserver:1.0.1

Bạn cũng có thể thử nghiệm bằng cách tạo docker-compose.yaml như sau.

cat > /home/registry/docker-compose.yaml << 'OEF'
version: "3"
services:
  webserver:
    image: 192.168.13.191:5000/webserver:1.0.1
    restart: always
    hostname: webserver
    ports:
        - "80:80"
    container_name: webserver
    command: ["nginx", "-g", "daemon off;"]
OEF

Sau đó chạy lệnh docker-compose.

$ docker-compose up -d
[+] Running 9/9
 ⠿ webserver Pulled                                                                                                                                                                                                       0.3s
   ⠿ a803e7c4b030 Already exists                                                                                                                                                                                          0.0s
   ⠿ 8b625c47d697 Already exists                                                                                                                                                                                          0.0s
   ⠿ 4d3239651a63 Already exists                                                                                                                                                                                          0.0s
   ⠿ 0f816efa513d Already exists                                                                                                                                                                                          0.0s
   ⠿ 01d159b8db2f Already exists                                                                                                                                                                                          0.0s
   ⠿ 5fb9a81470f3 Already exists                                                                                                                                                                                          0.0s
   ⠿ 9b1e1e7164db Already exists                                                                                                                                                                                          0.0s
   ⠿ 5b717725e189 Already exists                                                                                                                                                                                          0.0s
[+] Running 2/2
 ⠿ Network registry_default  Created                                                                                                                                                                                      0.1s
 ⠿ Container webserver       Started                                                                                                                                                                                      0.5s

Kết quả.

$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED              STATUS              PORTS                                       NAMES
ea6d4938bd33   192.168.13.191:5000/webserver:1.0.1   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp           webserver
8b437b59a4e0   registry:2.8.3                        "/entrypoint.sh /etc…"   47 minutes ago       Up 15 minutes       0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry

Và đây là kết quả webserver của bạn.

$ curl 192.168.13.191 
<!DOCTYPE html>
<html>
    <head>
        <title>Welcome to my website server</title>
    </head>
    <body>
        <h1>This is the custom content of website server</h1>
    </body>

Kết luận.

Trong bài viết này, chúng ta đã thảo luận về việc tạo và quản lý một kho chứa Registry Docker riêng sử dụng image registry:2.8.3. Đây là một công cụ quan trọng trong quá trình phát triển và triển khai ứng dụng Docker, giúp chúng ta lưu trữ và chia sẻ các Docker image một cách an toàn và hiệu quả.

Chúng ta đã tìm hiểu cách cài đặt, cấu hình, và sử dụng kho chứa Registry, bao gồm việc thêm các image mới, đẩy và kéo image từ kho chứa. Điều này giúp chúng ta tiết kiệm thời gian và nguồn lực khi làm việc với các ứng dụng Docker phức tạp.

Sử dụng kho chứa Registry Docker riêng cũng giúp bảo vệ quyền riêng tư của các image và dữ liệu quan trọng, đồng thời tạo điều kiện thuận lợi cho quá trình phát triển và triển khai ứng dụng. Việc này đặc biệt quan trọng trong các môi trường doanh nghiệp yêu cầu bảo mật cao và quản lý tài nguyên một cách nghiêm ngặt.

Hy vọng rằng thông qua bài viết này, bạn đã có cái nhìn tổng quan về cách sử dụng kho chứa Registry Docker riêng và cách nó có thể hỗ trợ quá trình phát triển phần mềm của bạn. Điều này sẽ giúp bạn tối ưu hóa quá trình làm việc với Docker và tạo ra các ứng dụng Docker mạnh mẽ và bảo mật hơn.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories