Thứ hai, 07/01/2019 | 00:00 GMT+7

Cách thiết lập registry Docker riêng trên Ubuntu 18.04

Docker Registry là một ứng dụng quản lý việc lưu trữ và cung cấp containers images Docker. Cơ quan đăng ký tập trung containers images và giảm thời gian xây dựng cho các nhà phát triển. Docker image đảm bảo cùng một môi trường thời gian chạy thông qua ảo hóa, nhưng việc xây dựng hình ảnh có thể đòi hỏi đầu tư thời gian đáng kể. Ví dụ: thay vì cài đặt các gói và phụ thuộc riêng biệt để sử dụng Docker, các nhà phát triển có thể download hình ảnh nén từ register có chứa tất cả các thành phần cần thiết. Hơn nữa, các nhà phát triển có thể tự động đẩy hình ảnh vào register bằng cách sử dụng các công cụ tích hợp liên tục, chẳng hạn như TravisCI , để cập nhật hình ảnh liền mạch trong quá trình production và phát triển.

Docker cũng có một nơi đăng ký công khai miễn phí, Docker Hub , có thể lưu trữ các Docker image tùy chỉnh của bạn, nhưng có những trường hợp bạn sẽ không muốn hình ảnh của bạn hiển thị công khai. Hình ảnh thường chứa tất cả các mã cần thiết để chạy một ứng dụng, vì vậy việc sử dụng register riêng sẽ được ưu tiên hơn khi sử dụng phần mềm độc quyền.

Trong hướng dẫn này, bạn sẽ cài đặt và bảo mật Register Docker riêng của bạn . Bạn sẽ sử dụng Docker Compose để xác cấu hình chạy các ứng dụng Docker của bạn và Nginx để chuyển tiếp lưu lượng server từ HTTPS đến containers Docker đang chạy. Khi bạn đã hoàn thành hướng dẫn này, bạn có thể đẩy Docker image tùy chỉnh vào register riêng tư của bạn và kéo hình ảnh một cách an toàn từ server từ xa.

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn cần các thành phần sau :

  • Hai server Ubuntu 18.04 được cài đặt theo hướng dẫn cài đặt server ban đầu Ubuntu 18.04 , bao gồm user không phải root có quyền sudo và firewall . Một server sẽ lưu trữ Đăng ký Docker riêng của bạn và server kia sẽ là server khách của bạn.
  • Docker và Docker-Compose được cài đặt trên cả hai server theo hướng dẫn Cách cài đặt Docker-Compose trên Ubuntu 18.04 . Bạn chỉ cần hoàn thành bước đầu tiên của hướng dẫn này để cài đặt Docker Compose. Hướng dẫn này giải thích cách cài đặt Docker như một phần của yêu cầu của nó.
  • Nginx được cài đặt trên server đăng ký Docker riêng của bạn theo Cách cài đặt Nginx trên Ubuntu 18.04 .
  • Nginx được bảo mật bằng Let's Encrypt trên server của bạn cho Cơ quan đăng ký Docker riêng, theo Cách bảo mật Nginx bằng Let's Encrypt . Đảm bảo chuyển hướng tất cả lưu lượng truy cập từ HTTP sang HTTPS ở Bước 4.
  • Tên domain phân giải đến server bạn đang sử dụng cho Cơ quan đăng ký Docker riêng. Bạn sẽ cài đặt điều này như một phần của yêu cầu Let's Encrypt.

Bước 1 - Cài đặt và cấu hình Docker Registry

Công cụ dòng lệnh Docker hữu ích để khởi động và quản lý một hoặc hai containers Docker, nhưng để triển khai đầy đủ, hầu hết các ứng dụng chạy bên trong containers Docker yêu cầu các thành phần khác chạy song song. Ví dụ: rất nhiều ứng dụng web bao gồm một web server , như Nginx, phục vụ mã của ứng dụng, một ngôn ngữ kịch bản thông dịch như PHP và một server database như MySQL.

Với Docker Compose, bạn có thể viết một file .yml để cài đặt cấu hình của từng containers và thông tin mà các containers cần giao tiếp với nhau.Sau đó, bạn có thể sử dụng công cụ dòng lệnh docker-compose để đưa ra lệnh cho tất cả các thành phần tạo nên ứng dụng của bạn.

Bản thân Docker Registry là một ứng dụng có nhiều thành phần, vì vậy bạn sẽ sử dụng Docker Compose để quản lý cấu hình của bạn . Để bắt đầu một version của register , bạn sẽ cài đặt file docker-compose.yml để xác định vị trí nơi register của bạn sẽ lưu trữ dữ liệu của nó.

Trên server mà bạn đã tạo để lưu trữ Register Docker riêng của bạn , bạn có thể tạo folder docker-registry , di chuyển vào đó, rồi tạo một folder con data bằng các lệnh sau:

  • mkdir ~/docker-registry && cd $_
  • mkdir data

Sử dụng editor của bạn để tạo file cấu hình docker-compose.yml :

  • nano docker-compose.yml

Thêm nội dung sau vào file , mô tả cấu hình cơ bản cho Register Docker:

docker-compos.yml
version: '3'  services:   registry:     image: registry:2     ports:     - "5000:5000"     environment:       REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data     volumes:       - ./data:/data 

Phần environment đặt một biến môi trường trong containers Docker Registry với đường dẫn /data . Ứng dụng Docker Registry sẽ kiểm tra biến môi trường này khi nó khởi động và kết quả là bắt đầu lưu dữ liệu của nó vào folder /data .

Tuy nhiên, khi bạn đã bao gồm dòng volumes: - ./data:/data , Docker sẽ bắt đầu ánh xạ folder /data trong containers đó với /data trên server đăng ký của bạn. Kết quả cuối cùng là dữ liệu của Docker Registry đều được lưu trữ trong ~/docker-registry/data trên server đăng ký.

Phần ports , với cấu hình 5000:5000 , yêu cầu Docker ánh xạ cổng 5000 trên server thành cổng 5000 trong containers đang chạy. Điều này cho phép bạn gửi yêu cầu đến cổng 5000 trên server và yêu cầu được chuyển tiếp đến ứng dụng đăng ký.

Đến đây bạn có thể khởi động Docker Compose để kiểm tra cài đặt :

  • docker-compose up

Bạn sẽ thấy các thanh download trong kết quả của bạn hiển thị Docker đang download Docker image Registry từ register riêng của Docker. Trong vòng một hoặc hai phút, bạn sẽ thấy kết quả tương tự như sau (các version có thể khác nhau):

Output of docker-compose up
Starting docker-registry_registry_1 ... done Attaching to docker-registry_registry_1 registry_1 | time="2018-11-06T18:43:09Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2 registry_1 | time="2018-11-06T18:43:09Z" level=info msg="redis not configured" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2 registry_1 | time="2018-11-06T18:43:09Z" level=info msg="Starting upload purge in 20m0s" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2 registry_1 | time="2018-11-06T18:43:09Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2 registry_1 | time="2018-11-06T18:43:09Z" level=info msg="listening on [::]:5000" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2

Bạn sẽ giải quyết thông báo cảnh báo No HTTP secret provided sau trong hướng dẫn này. Đầu ra cho thấy rằng containers đang bắt đầu. Dòng cuối cùng của kết quả cho thấy nó đã bắt đầu nghe thành công trên cổng 5000 .

Theo mặc định, Docker Compose sẽ vẫn chờ thông tin đầu vào của bạn, vì vậy hãy nhấn CTRL+C để tắt containers Docker Registry của bạn.

Bạn đã cài đặt nghe đăng ký Docker đầy đủ trên cổng 5000 . Đến đây, register sẽ không khởi động trừ khi bạn khởi động nó theo cách thủ công. Ngoài ra, Docker Registry không đi kèm với bất kỳ cơ chế xác thực tích hợp nào, vì vậy nó hiện không an toàn và hoàn toàn mở cho công chúng. Trong các bước sau, bạn sẽ giải quyết những lo ngại về bảo mật này.

Bước 2 - Cài đặt chuyển tiếp cổng Nginx

Bạn đã cài đặt HTTPS trên server Docker Registry của bạn với Nginx, nghĩa là bây giờ bạn có thể cài đặt chuyển tiếp cổng từ Nginx sang cổng 5000 . Sau khi hoàn thành bước này, bạn có thể truy cập trực tiếp vào register của bạn tại example.com .

Là một phần của yêu cầu Cách bảo mật Nginx Với Let's Encrypt , bạn đã cài đặt file /etc/nginx/sites-available/ example.com chứa cấu hình server của bạn .

Mở file này bằng editor của bạn:

  • sudo nano /etc/nginx/sites-available/example.com

Tìm dòng location hiện có. Nó sẽ trông giống thế này:

/etc/nginx/sites-available/example.com
... location / {   ... } ... 

Bạn cần chuyển tiếp lưu lượng đến cổng 5000 , nơi đăng ký của bạn sẽ chạy. Bạn cũng muốn nối các tiêu đề vào yêu cầu vào register , nơi cung cấp thông tin bổ sung từ server với mỗi yêu cầu và phản hồi. Xóa nội dung của phần location và thêm nội dung sau vào phần đó:

/etc/nginx/sites-available/example.com
... 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://localhost:5000;     proxy_set_header  Host              $http_host;   # required for docker client's sake     proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP     proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;     proxy_set_header  X-Forwarded-Proto $scheme;     proxy_read_timeout                  900; } ... 

Phần $http_user_agent xác minh version Docker của ứng dụng client trên 1.5 và đảm bảo UserAgent không phải là ứng dụng Go . Vì bạn đang sử dụng version 2.0 của register , các client cũ hơn không được hỗ trợ. Để biết thêm thông tin, bạn có thể tìm cấu hình tiêu đề nginx trong hướng dẫn Nginx Registry của Docker .

Lưu và thoát khỏi file . Áp dụng các thay đổi bằng cách khởi động lại Nginx:

  • sudo service nginx restart

Bạn có thể xác nhận Nginx đang chuyển tiếp lưu lượng đến cổng 5000 bằng cách chạy register :

  • cd ~/docker-registry
  • docker-compose up

Trong cửa sổ trình duyệt, hãy mở url sau:

https://example.com/v2 

Bạn sẽ thấy một đối tượng JSON trống hoặc:

{} 

Trong terminal của bạn, bạn sẽ thấy kết quả tương tự như sau:

Output of docker-compose up
registry_1 | time="2018-11-07T17:57:42Z" level=info msg="response completed" go.version=go1.7.6 http.request.host=cornellappdev.com http.request.id=a8f5984e-15e3-4946-9c40-d71f8557652f http.request.method=GET http.request.remoteaddr=128.84.125.58 http.request.uri="/v2/" http.request.useragent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7" http.response.contenttype="application/json; charset=utf-8" http.response.duration=2.125995ms http.response.status=200 http.response.written=2 instance.id=3093e5ab-5715-42bc-808e-73f310848860 version=v2.6.2 registry_1 | 172.18.0.1 - - [07/Nov/2018:17:57:42 +0000] "GET /v2/ HTTP/1.0" 200 2 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7"

Bạn có thể thấy từ dòng cuối cùng rằng một yêu cầu GET đã được thực hiện tới /v2/ , đây là điểm cuối mà bạn đã gửi yêu cầu từ trình duyệt của bạn . Vùng chứa đã nhận được yêu cầu bạn đưa ra, từ chuyển tiếp cổng và trả lại phản hồi là {} . Mã 200 ở dòng cuối cùng của kết quả nghĩa là containers đã xử lý yêu cầu thành công.

Đến đây bạn đã cài đặt chuyển tiếp cổng, bạn có thể chuyển sang cải thiện tính bảo mật của register của bạn .

Bước 3 - Cài đặt xác thực

Với yêu cầu ủy quyền Nginx đúng cách, giờ đây bạn có thể bảo mật register của bạn bằng xác thực HTTP để quản lý ai có quyền truy cập vào Register Docker của bạn. Để làm điều này, bạn sẽ tạo một file xác thực bằng htpasswd và thêm user vào đó. Xác thực HTTP nhanh chóng được cài đặt và bảo mật qua kết nối HTTPS, đây là kết nối mà cơ quan đăng ký sẽ sử dụng.

Bạn có thể cài đặt gói htpasswd bằng cách chạy như sau:

  • sudo apt install apache2-utils

Đến đây bạn sẽ tạo folder nơi bạn sẽ lưu trữ thông tin xác thực của ta và thay đổi thành folder đó. $_ mở rộng đến đối số cuối cùng của lệnh trước, trong trường hợp này là ~/docker-registry/auth :

  • mkdir ~/docker-registry/auth && cd $_

Tiếp theo, bạn sẽ tạo user đầu tiên như sau, thay thế username bằng tên user bạn muốn sử dụng. Cờ -B chỉ định mã hóa bcrypt , an toàn hơn mã hóa mặc định. Nhập password khi được yêu cầu :

  • htpasswd -Bc registry.password username

Lưu ý: Để thêm nhiều user hơn, hãy chạy lại lệnh trước đó mà không có tùy chọn -c, ( c là để tạo):

  • htpasswd registry.password username

Tiếp theo, bạn sẽ chỉnh sửa file docker-compose.yml để yêu cầu Docker sử dụng file bạn đã tạo để xác thực user .

  • cd ~/docker-registry
  • nano docker-compose.yml

Bạn có thể thêm các biến môi trường và một dung lượng cho folder auth/ mà bạn đã tạo, bằng cách chỉnh sửa file docker-compose.yml để cho Docker biết cách bạn muốn xác thực user . Thêm nội dung được đánh dấu sau vào file :

docker-compos.yml
version: '3'  services:   registry:     image: registry:2     ports:     - "5000:5000"     environment:       REGISTRY_AUTH: htpasswd       REGISTRY_AUTH_HTPASSWD_REALM: Registry       REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password       REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data     volumes:       - ./auth:/auth       - ./data:/data 

Đối với REGISTRY_AUTH , bạn đã chỉ định htpasswd , là schemas xác thực bạn đang sử dụng và đặt REGISTRY_AUTH_HTPASSWD_PATH thành đường dẫn của file xác thực. Cuối cùng, REGISTRY_AUTH_HTPASSWD_REALM biểu thị tên của lĩnh vực htpasswd .

Đến đây bạn có thể xác minh xác thực của bạn hoạt động chính xác, bằng cách chạy register và kiểm tra xem nó có nhắc user nhập tên user và password hay không.

  • docker-compose up

Trong cửa sổ trình duyệt, hãy mở https:// example.com /v2 .

Sau khi nhập username và password tương ứng, bạn sẽ thấy {} . Bạn đã xác nhận cài đặt xác thực cơ bản: register chỉ trả lại kết quả sau khi bạn nhập đúng tên user và password . Đến đây bạn đã bảo mật register của bạn và có thể tiếp tục sử dụng register .

Bước 4 - Khởi động Docker Registry như một dịch vụ

Bạn muốn đảm bảo register của bạn sẽ bắt đầu khi nào hệ thống khởi động. Nếu có bất kỳ sự cố hệ thống không lường trước được, bạn cần đảm bảo register khởi động lại khi server khởi động lại. Mở docker-compose.yml :

  • nano docker-compose.yml

Thêm dòng nội dung sau vào registry: :

docker-compos.yml
...   registry:     restart: always ... 

Bạn có thể bắt đầu register của bạn dưới dạng quy trình , điều này sẽ cho phép bạn thoát phiên ssh và tiếp tục quá trình:

  • docker-compose up -d

Với register của bạn đang chạy trong nền, bây giờ bạn có thể chuẩn bị cho Nginx để tải lên file .

Bước 5 - Tăng kích thước tải lên file cho Nginx

Trước khi bạn có thể đẩy một hình ảnh vào register , bạn cần đảm bảo register của bạn có thể xử lý tải lên file lớn. Mặc dù Docker chia các file tải lên hình ảnh lớn thành các lớp riêng biệt, đôi khi chúng có thể hơn 1GB . Theo mặc định, Nginx có giới hạn 1MB đối với file tải lên, vì vậy bạn cần chỉnh sửa file cấu hình cho nginx và đặt kích thước file tải lên tối đa là 2GB .

  • sudo nano /etc/nginx/nginx.conf

Tìm phần http và thêm dòng sau:

/etc/nginx/nginx.conf
... http {         client_max_body_size 2000M;         ... } ... 

Cuối cùng, khởi động lại Nginx để áp dụng các thay đổi cấu hình:

  • sudo service nginx restart

Như vậy, bạn có thể tải hình ảnh lớn lên Docker Registry của bạn mà không gặp lỗi Nginx.

Bước 6 - Xuất bản lên Cơ quan đăng ký Docker Riêng tư của bạn

Đến đây bạn đã sẵn sàng xuất bản một hình ảnh lên Docker Registry riêng tư của bạn , nhưng trước tiên bạn phải tạo một hình ảnh. Đối với hướng dẫn này, bạn sẽ tạo một hình ảnh đơn giản dựa trên hình ảnh ubuntu từ Docker Hub. Docker Hub là một register được lưu trữ công khai, với nhiều hình ảnh được cấu hình sẵn có thể được tận dụng để nhanh chóng Dockerize các ứng dụng. Sử dụng hình ảnh ubuntu , bạn sẽ kiểm tra việc đẩy và kéo vào register của bạn .

Từ server khách hàng của bạn, tạo một hình ảnh trống, nhỏ để đẩy sang register mới của bạn, cờ -i-t cung cấp cho bạn quyền truy cập shell tương tác vào containers :

  • docker run -t -i ubuntu /bin/bash

Sau khi download xong, bạn sẽ ở bên trong dấu nhắc Docker, hãy lưu ý ID containers của bạn sau root@ sẽ thay đổi. Thực hiện thay đổi nhanh chóng đối với hệ thống file bằng cách tạo một file có tên SUCCESS . Trong bước tiếp theo, bạn có thể sử dụng file này để xác định xem quá trình xuất bản có thành công hay không:

  • touch /SUCCESS

Thoát ra khỏi containers Docker:

  • exit

Lệnh sau tạo một hình ảnh mới có tên là test-image dựa trên hình ảnh đã chạy cùng với bất kỳ thay đổi nào bạn đã thực hiện. Trong trường hợp của ta , việc bổ sung file /SUCCESS có trong hình ảnh mới.

Commit thay đổi:

  • docker commit $(docker ps -lq) test-image

Đến đây, hình ảnh chỉ tồn tại local . Đến đây bạn có thể đẩy nó vào register mới mà bạn đã tạo. Đăng nhập vào Docker Registry của bạn:

  • docker login https://example.com

Nhập username và password tương ứng từ trước đó. Tiếp theo, bạn sẽ gắn thẻ hình ảnh với vị trí của register riêng tư để đẩy đến nó:

  • docker tag test-image example.com/test-image

Đẩy hình ảnh mới được gắn thẻ vào register :

  • docker push example.com/test-image

Đầu ra của bạn sẽ trông giống như sau:

Output
The push refers to a repository [example.com/test-image] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...

Bạn đã xác minh register của bạn xử lý xác thực user và cho phép user đã xác thực đẩy hình ảnh vào register . Tiếp theo, bạn sẽ xác nhận bạn cũng có thể kéo hình ảnh từ register .

Bước 7 - Lấy từ đăng ký Docker riêng của bạn

Quay lại server đăng ký của bạn để bạn có thể kiểm tra việc kéo hình ảnh từ server khách hàng của bạn . Cũng có thể kiểm tra từ server thứ ba.

Đăng nhập bằng tên user và password bạn đã cài đặt trước đó:

  • docker login https://example.com

Đến đây bạn đã sẵn sàng để kéo hình ảnh. Sử dụng domain và tên hình ảnh mà bạn đã gắn thẻ ở bước trước:

  • docker pull example.com/test-image

Docker sẽ download hình ảnh và đưa bạn trở lại dấu nhắc . Nếu bạn chạy hình ảnh trên server đăng ký, bạn sẽ thấy file SUCCESS mà bạn đã tạo trước đó ở đó:

  • docker run -it example.com/test-image /bin/bash

Liệt kê các file của bạn bên trong bash shell:

  • ls

Bạn sẽ thấy file SUCCESS mà bạn đã tạo cho hình ảnh này:

SUCCESS  bin  boot  dev  etc  home  lib  lib64  media   mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var 

Bạn đã hoàn tất việc cài đặt register an toàn mà user có thể đẩy và kéo các hình ảnh tùy chỉnh.

Kết luận

Trong hướng dẫn này, bạn cài đặt Register Docker riêng của bạn và xuất bản Docker image . Như đã đề cập trong phần giới thiệu, bạn cũng có thể sử dụng TravisCI hoặc một công cụ CI tương tự để tự động đẩy trực tiếp vào register riêng tư. Bằng cách tận dụng Docker và đăng ký vào quy trình làm việc của bạn , bạn có thể đảm bảo hình ảnh chứa mã sẽ dẫn đến hành vi giống nhau trên bất kỳ máy nào, cho dù đang production hay đang phát triển. Để biết thêm thông tin về cách viết file Docker, bạn có thể đọc hướng dẫn Docker giải thích quy trình này.


Tags:

Các tin liên quan

Cách thiết lập triển khai nhiều node với Rancher 2.1, Kubernetes và Docker Machine trên Ubuntu 18.04
2019-01-03
Cách tạo ứng dụng Node.js với Docker
2018-11-29
Cách quản lý triển khai nhiều node với Máy Rancher và Docker trên Ubuntu 16.04
2018-10-30
Cách cài đặt và sử dụng Docker trên Ubuntu 16.04
2018-10-19
Cách cung cấp và quản lý server Docker từ xa bằng Máy Docker trên Ubuntu 18.04
2018-10-02
Cách cài đặt và bảo mật OpenFaaS bằng Docker Swarm trên Ubuntu 16.04
2018-09-19
Cách cài đặt Docker Compose trên Debian 9
2018-09-06
Cách cài đặt và sử dụng Docker trên Debian 9
2018-09-04
Cách chia sẻ dữ liệu giữa Docker Container và Host
2018-07-11
Cách cài đặt Docker Compose trên Ubuntu 18.04
2018-07-09