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.
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
- Docker và Docker–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
docker-compose version
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
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 – nginx
và auth
:
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
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
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
).
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.
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 và 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