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.
- Cổng dịch vụ
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ỉ
, có thiết lập để lưu dữ liệu cố định ở máy host 192.168.13.191
:5000/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.