Thứ tư, 15/10/2014 | 00:00 GMT+7

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

Docker là một công cụ tuyệt vời để triển khai các server của bạn. Docker thậm chí còn có một nơi đăng ký công khai gọi là Docker Hub để lưu trữ Docker image . Mặc dù Docker cho phép bạn tải các tác phẩm Docker của bạn lên Docker Hub miễn phí, nhưng mọi thứ bạn tải lên cũng đều được công khai. Đây có thể không phải là lựa chọn tốt nhất cho dự án của bạn.

Hướng dẫn này sẽ chỉ cho bạn cách cài đặt và bảo mật register Docker riêng của bạn. Đến cuối hướng dẫn này, bạn có thể đẩy một 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ừ một server khác.

Hướng dẫn này không đề cập đến việc chứa ứng dụng của bạn mà chỉ đề cập đến cách tạo register nơi bạn có thể lưu trữ các triển khai của bạn . Nếu bạn muốn tìm hiểu cách bắt đầu với chính Docker (trái ngược với register ), bạn có thể cần đọc hướng dẫn Cách cài đặt và sử dụng Docker: Bắt đầu .

Hướng dẫn này đã được thử nghiệm với cả server đăng ký và client đăng ký chạy Ubuntu 14.04 , nhưng nó có thể hoạt động với các bản phân phối dựa trên Debian khác. Nó cũng bao gồm version 2.0 của Docker Registry.

Các khái niệm Docker

Nếu bạn chưa sử dụng Docker trước đây thì bạn nên dành một phút để xem qua một vài khái niệm chính của Docker. Nếu bạn đã sử dụng Docker và chỉ muốn biết cách bắt đầu chạy register của riêng mình, vui lòng chuyển sang phần tiếp theo.

Để biết thêm thông tin về cách sử dụng Docker, hãy xem Bảng lừa đảo Docker tuyệt vời.

Docker cốt lõi của nó là một cách để tách một ứng dụng và các phụ thuộc cần thiết để chạy nó khỏi chính hệ điều hành. Để làm cho điều này có thể, Docker sử dụng các containers hình ảnh . Docker image về cơ bản là một mẫu cho hệ thống file . Khi bạn chạy Docker image , một version của hệ thống file này được tạo trực tiếp và chạy trên hệ thống của bạn bên trong containers Docker. Theo mặc định, containers này không thể chạm vào chính ảnh root hoặc hệ thống file của server lưu trữ Docker đang chạy. Đó là một môi trường khép kín.

Bất kỳ thay đổi nào bạn thực hiện trong containers đều được lưu giữ trong chính containers đó và không ảnh hưởng đến hình ảnh root . Nếu bạn cần giữ những thay đổi đó, thì bạn có thể “ commit ” một containers với Docker image (thông qua lệnh docker commit ). Điều này nghĩa là bạn có thể tạo ra các containers mới bắt đầu với nội dung của containers cũ của bạn mà không ảnh hưởng đến containers (hoặc hình ảnh) ban đầu. Nếu bạn đã quen với git , thì quy trình làm việc sẽ có vẻ khá giống nhau: bạn có thể tạo các nhánh mới (hình ảnh theo cách nói của Docker) từ bất kỳ containers nào. Chạy một hình ảnh giống như thực hiện git checkout .

Để tiếp tục tương tự, chạy register Docker riêng giống như chạy một repository Git riêng cho Docker image của bạn.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần những thứ sau:

Bước 1 - Cài đặt gói để tăng cường bảo mật

Để cài đặt bảo mật cho Docker Registry, tốt nhất bạn nên sử dụng Docker Compose .Bằng cách này, ta có thể dễ dàng chạy Docker Registry trong một containers và để Nginx xử lý bảo mật và giao tiếp với thế giới bên ngoài trong một containers khác. Bạn nên cài đặt nó từ phần Yêu cầu .

Vì ta sẽ sử dụng Nginx để xử lý bảo mật của bạn , ta cũng cần một nơi để lưu trữ danh sách các tổ hợp tên user và password mà ta muốn truy cập vào register của bạn . Ta sẽ cài đặt gói apache2-utils chứa tiện ích htpasswd có thể dễ dàng tạo các băm password mà Nginx có thể hiểu:

  • sudo apt-get -y install apache2-utils

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

Công cụ dòng lệnh Docker hoạt động hiệu quả để khởi động và quản lý một hoặc hai containers Docker, nhưng hầu hết các ứng dụng chạy bên trong containers Docker không tồn tại riêng lẻ. Để triển khai đầy đủ hầu hết các ứng dụng, bạn cần một vài thành phần chạy song song. Ví dụ: hầu hết các ứng dụng web được tạo thành từ một web server phục vụ mã của ứng dụng, một ngôn ngữ kịch bản được thông dịch như PHP hoặc Ruby (với Rails) và một server database như MySQL.

Docker Compose cho phép bạn viết một file cấu hình .yml cho cấu hình cho mỗi containers cũng như thông tin về cách các containers giao tiếp với nhau. Sau đó, bạn 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 một ứng dụng.

Vì bản thân register Docker là một ứng dụng có nhiều thành phần, ta sẽ sử dụng Docker Compose để quản lý cấu hình của bạn .

Để bắt đầu một register cơ bản, cấu hình duy nhất cần thiết là xác định vị trí nơi register của bạn sẽ lưu trữ dữ liệu của nó. Hãy cài đặt file Docker Compose YAML cơ bản để hiển thị một version cơ bản của register .

Trước tiên, hãy tạo một folder chứa các file của ta cho hướng dẫn này và một số folder con mà ta cần :

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

Sử dụng editor yêu thích của bạn, tạo file docker-compose.yml :

  • nano docker-compose.yml

Thêm các nội dung sau vào file :

docker-compos.yml
registry:   image: registry:2   ports:     - 127.0.0.1:5000:5000   environment:     REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data   volumes:     - ./data:/data 

Điều thú vị ở đây là ở phần cuối. Phần environment đặt một biến môi trường trong containers đăng ký Docker với đường dẫn /data . Ứng dụng đăng ký Docker biết 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 .

Chỉ trong trường hợp này, bit volumes: - ./data:/data cho Docker biết rằng folder /data trong containers đó thực sự nên ánh xạ tới /data trên server của ta . Vì vậy, kết quả cuối cùng là dữ liệu của register Docker được lưu trữ trong ~/docker-registry/data trên máy local của ta .

Hãy tiếp tục và bắt đầu nó đảm bảo mọi thứ đều theo thứ tự:

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

Bạn sẽ thấy một loạt các thanh download di chuyển trên màn hình của bạn (đây là Docker download hình ảnh đăng ký Docker thực tế từ Docker Registry của riêng Docker). Nếu mọi thứ diễn ra tốt đẹp trong một hoặc hai phút, bạn sẽ thấy kết quả giống như sau (các version có thể khác nhau):

Output of docker-compose up
registry_1 | time="2015-10-18T23:45:58Z" 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." instance.id=44c828de-c27a-401e-bb2e-38b17e6a4b7b version=v2.1.1 registry_1 | time="2015-10-18T23:45:58Z" level=info msg="redis not configured" instance.id=44c828de-c27a-401e-bb2e-38b17e6a4b7b version=v2.1.1 registry_1 | time="2015-10-18T23:45:58Z" level=info msg="using inmemory blob descriptor cache" instance.id=44c828de-c27a-401e-bb2e-38b17e6a4b7b version=v2.1.1 registry_1 | time="2015-10-18T23:45:58Z" level=info msg="listening on [::]:5000" instance.id=44c828de-c27a-401e-bb2e-38b17e6a4b7b version=v2.1.1 registry_1 | time="2015-10-18T23:45:58Z" level=info msg="Starting upload purge in 1m0s" instance.id=44c828de-c27a-401e-bb2e-38b17e6a4b7b version=v2.1.1

Đừng lo lắng về thông báo No HTTP secret provided . Nó bình thường.

Tuyệt quá! Đến đây, bạn đã có một đăng ký Docker đầy đủ và đang chạy và lắng nghe trên cổng 5000 (điều này được cài đặt bởi các ports: bit trong file docker-compose.yml ). Đến đây, register vẫn chưa hữu ích - nó sẽ không khởi động trừ khi bạn khởi động register theo cách thủ công. Ngoài ra, register Docker 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ó không an toàn và hoàn toàn mở cho công chúng ngay bây giờ.

Theo mặc định, Docker Compose sẽ đợi dữ liệu nhập của bạn mãi mãi, vì vậy hãy tiếp tục và nhấn CTRL-C để tắt containers đăng ký Docker của bạn.

Bước 3 - Cài đặt containers Nginx

Hãy bắt tay vào khắc phục các vấn đề bảo mật này. Bước đầu tiên là cài đặt một bản sao của Nginx bên trong một containers Docker khác và liên kết nó với containers đăng ký Docker của ta .

Hãy bắt đầu bằng cách tạo một folder để lưu trữ cấu hình Nginx của ta :

  • mkdir ~/docker-registry/nginx

Bây giờ, hãy mở lại file docker-compose.yml của bạn trong folder ~/docker-registry :

  • nano docker-compose.yml

Dán phần sau vào đầu file :

docker-compos.yml
nginx:   image: "nginx:1.9"   ports:     - 5043:443   links:     - registry:registry   volumes:     - ./nginx/:/etc/nginx/conf.d:ro 

Điều này sẽ tạo một containers Docker mới dựa trên hình ảnh Nginx chính thức. Một chút thú vị ở đây là phần links . Nó tự động cài đặt một "liên kết" từ một containers Docker đến một containers khác. Khi containers Nginx khởi động, nó sẽ có thể truy cập containers registry tại registry tên server dù địa chỉ IP thực mà containers registry cuối cùng có là gì. ( Mức thấp Docker thực sự đang chèn một mục nhập vào file /etc/hosts trong containers nginx để cho nó biết IP của containers registry ).

Phần volumes: tương tự như những gì ta đã làm cho containers registry . Trong trường hợp này, nó cung cấp cho ta một cách để lưu trữ các file cấu hình mà ta sẽ sử dụng cho Nginx trên server của ta thay vì bên trong containers Docker. Phần cuối :ro chỉ cho Docker biết rằng containers Nginx chỉ nên có quyền truy cập chỉ đọc vào hệ thống file server .

Tệp docker-compose.yml đầy đủ của bạn bây giờ sẽ trông giống như sau:

docker-compos.yml
nginx:   image: "nginx:1.9"   ports:     - 5043:443   links:     - registry:registry   volumes:     - ./nginx/:/etc/nginx/conf.d registry:   image: registry:2   ports:     - 127.0.0.1:5000:5000   environment:     REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data   volumes:     - ./data:/data 

Chạy docker-compose up bây giờ sẽ bắt đầu hai containers cùng một lúc: một cho register Docker và một cho Nginx.

Tuy nhiên, ta cần cấu hình Nginx trước khi điều này hoạt động, vì vậy hãy tạo một file cấu hình Nginx mới.

Tạo file registry.conf :

  • nano ~/docker-registry/nginx/registry.conf

Sao chép phần sau vào file :

~ / docker-registry / nginx / registry.conf
upstream docker-registry {   server registry:5000; }  server {   listen 443;   server_name myregistrydomain.com;    # SSL   # ssl on;   # ssl_certificate /etc/nginx/conf.d/domain.crt;   # ssl_certificate_key /etc/nginx/conf.d/domain.key;    # disable any limits to avoid HTTP 413 for large image uploads   client_max_body_size 0;    # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)   chunked_transfer_encoding on;    location /v2/ {     # 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;     }      # To add basic authentication to v2 use auth_basic setting plus add_header     # auth_basic "registry.localhost";     # auth_basic_user_file /etc/nginx/conf.d/registry.password;     # add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;      proxy_pass                          http://docker-registry;     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;   } } 

Lưu và thoát khỏi file .

Đến đây bạn có thể cài đặt Nginx và khởi động tất cả hai containers Docker bằng một lệnh:

  • docker-compose up

Nginx không in bất kỳ kết quả nào khi khởi động, nhưng nếu mọi việc suôn sẻ, bạn hiện đang chạy một bản sao của Nginx được cài đặt để proxy cho containers registry của bạn. Để kiểm tra nó, hãy sử dụng curl để thực hiện một yêu cầu HTTP trực tiếp đến register Docker của ta , sau đó thực hiện một yêu cầu khác tới cổng Nginx của ta . Nếu mọi thứ được cài đặt đúng, kết quả sẽ giống nhau trong cả hai trường hợp (kể từ khi viết bài này, Docker trả về một đối tượng json trống “ {} ”) vì Nginx sẽ ủy quyền yêu cầu thông qua register Docker.

Đầu tiên, thực hiện một yêu cầu HTTP trực tiếp đến register Docker:

  • curl http://localhost:5000/v2/

Khi viết bài này, Docker trả về một đối tượng json trống, vì vậy bạn sẽ thấy:

Output
{}

Bây giờ hãy gửi một yêu cầu HTTP đến cổng Nginx:

  • curl http://localhost:5043/v2/

Bạn sẽ thấy cùng một kết quả :

Output
{}

Nếu mọi thứ đang hoạt động bình thường, bạn sẽ thấy một số kết quả trong terminal do docker-compose của bạn trông giống như bên dưới:

Output of docker-compose
registry_1 | time="2015-08-11T10:24:53.746529894Z" level=debug msg="authorizing request" environment=development http.request.host="localhost:5043" http.request.id=55c3e2a6-4f34-4b0b-bc57-11c814b4f4d3 http.request.method=GET http.request.remoteaddr=172.17.42.1 http.request.uri="/v2/" http.request.useragent="curl/7.35.0" instance.id=55634dfc-c9e0-4ec9-9872-6f4930c17759 service=registry version=v2.0.1 registry_1 | time="2015-08-11T10:24:53.747650205Z" level=info msg="response completed" environment=development http.request.host="localhost:5043" http.request.id=55c3e2a6-4f34-4b0b-bc57-11c814b4f4d3 http.request.method=GET http.request.remoteaddr=172.17.42.1 http.request.uri="/v2/" http.request.useragent="curl/7.35.0" http.response.contenttype="application/json; charset=utf-8" http.response.duration=8.143193ms http.response.status=200 http.response.written=2 instance.id=55634dfc-c9e0-4ec9-9872-6f4930c17759 service=registry version=v2.0.1 registry_1 | 172.17.0.21 - - [11/Aug/2015:10:24:53 +0000] "GET /v2/ HTTP/1.0" 200 2 "" "curl/7.35.0" nginx_1 | 172.17.42.1 - - [11/Aug/2015:10:24:53 +0000] "GET /v2/ HTTP/1.1" 200 2 "-" "curl/7.35.0" "-"

Nếu bạn thấy các dòng có tiền tố registry_ (số sau dấu _ có thể khác trên máy của bạn) thì tất cả đều ổn và Nginx đã ủy quyền thành công yêu cầu HTTP của ta tới register Docker.

Tiếp tục và nhấn CTRL-C trong terminal docker-compose để đóng các containers Docker của bạn.

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

Bây giờ Nginx đang yêu cầu ủy quyền đúng cách, hãy cài đặt nó bằng xác thực HTTP để ta có thể kiểm soát ai có quyền truy cập vào register Docker của ta . Để làm điều đó, ta sẽ tạo một file xác thực ở định dạng Apache (Nginx cũng có thể đọc nó) thông qua tiện ích htpasswd mà ta đã cài đặt trước đó và thêm user vào đó.

Tạo user đầu tiên như sau, thay thế USERNAME bằng tên user bạn muốn sử dụng:

  • cd ~/docker-registry/nginx
  • htpasswd -c registry.password USERNAME

Tạo password mới cho user này khi được yêu cầu .

Nếu bạn muốn thêm nhiều user hơn trong tương lai, chỉ cần chạy lại lệnh trên mà không có tùy chọn -c ( c là để tạo):

  • htpasswd registry.password USERNAME

Đến đây, ta có một file registry.password do user của ta cài đặt và một register Docker có sẵn. Bạn có thể xem qua file bất kỳ lúc nào nếu bạn muốn xem user của bạn (và xóa user nếu bạn muốn thu hồi quyền truy cập).

Tiếp theo, ta cần yêu cầu Nginx sử dụng file xác thực đó.

Mở ~/docker-registry/nginx/registry.conf trong editor yêu thích của bạn:

  • nano ~/docker-registry/nginx/registry.conf

Cuộn đến giữa file , nơi bạn sẽ thấy một số dòng trông như thế này:

~ / docker-registry / nginx / registry.conf
# To add basic authentication to v2 use auth_basic setting plus add_header # auth_basic "registry.localhost"; # auth_basic_user_file /etc/nginx/conf.d/registry.password; # add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always; 

Bỏ ghi chú hai dòng bắt đầu bằng auth_basic cũng như dòng bắt đầu bằng add_header bằng cách xóa ký tự # ở đầu
của các dòng. Sau đó nó sẽ trông như thế này:

~ / docker-registry / nginx / registry.conf
# To add basic authentication to v2 use auth_basic setting plus add_header auth_basic "registry.localhost"; auth_basic_user_file /etc/nginx/conf.d/registry.password; add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always; 

Bây giờ ta đã yêu cầu Nginx cài đặt xác thực cơ bản HTTP cho tất cả các yêu cầu được ủy quyền cho register Docker và yêu cầu nó sử dụng file password mà ta vừa tạo.

Hãy khôi phục các containers của ta để xem liệu xác thực có hoạt động hay không:

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

Lặp lại bài kiểm tra độ xoăn trước đó:

  • curl http://localhost:5043/v2/

Bạn sẽ nhận được thông báo phàn nàn về việc làm trái phép:

Output of curl
<html> <head><title>401 Authorization Required</title></head> <body bgcolor="white"> <center><h1>401 Authorization Required</h1></center> <hr><center>nginx/1.9.7</center> </body> </html>

Bây giờ hãy thử thêm tên user và password bạn đã tạo trước đó vào yêu cầu curl :

  • curl http://USERNAME:PASSWORD@localhost:5043/v2/

Bạn sẽ nhận được cùng một kết quả mà bạn đã nhận được trước đó - đối tượng json trống {} . Bạn cũng sẽ thấy cùng một kết quả registry_ trong terminal docker-compose .

Hãy tiếp tục và sử dụng CTRL-C trong terminal của trình docker-compose để tắt các containers Docker.

Bước 5 - Cài đặt SSL

Đến đây, ta đã cài đặt và chạy register phía sau Nginx với xác thực cơ bản HTTP đang hoạt động. Tuy nhiên, cài đặt vẫn không an toàn lắm vì các kết nối không được mã hóa. Bạn có thể đã nhận thấy các dòng SSL được chú thích trong file cấu hình Nginx mà ta đã tạo trước đó.

Hãy kích hoạt chúng. Đầu tiên, hãy mở file cấu hình Nginx để chỉnh sửa:

  • nano ~/docker-registry/nginx/registry.conf

Sử dụng các phím mũi tên để di chuyển xung quanh và tìm kiếm các dòng sau:

~ / docker-registry / nginx / registry.conf
server {   listen 443;   server_name myregistrydomain.com;    # SSL   # ssl on;   # ssl_certificate /etc/nginx/conf.d/domain.crt;   # ssl_certificate_key /etc/nginx/conf.d/domain.key; 

Bỏ ghi chú các dòng bên dưới comment SSL bằng cách xóa # ký tự phía trước chúng. Nếu bạn đã cài đặt một domain cho server của bạn , hãy thay đổi giá trị của server_name thành domain của bạn khi bạn ở đó. Khi bạn hoàn tất, phần trên cùng của file sẽ giống như sau:

~ / docker-registry / nginx / registry.conf
server {   listen 443;   server_name myregistrydomain.com;    # SSL   ssl on;   ssl_certificate /etc/nginx/conf.d/domain.crt;   ssl_certificate_key /etc/nginx/conf.d/domain.key; 

Lưu các file . Nginx hiện đã được cấu hình để sử dụng SSL và sẽ tìm kiếm certificate SSL và các file khóa tại /etc/nginx/conf.d/domain.crt/etc/nginx/conf.d/domain.key tương ứng. Do các ánh xạ mà ta đã cài đặt trước đó trong file docker-compose.yml của ta , đường dẫn /etc/nginx/conf.d/ trong containers Nginx tương ứng với folder ~/docker-registry/nginx/ trên server của ta , vì vậy ta sẽ đặt các file certificate của ta ở đó.

Nếu bạn đã cài đặt certificate SSL hoặc dự định mua một certificate SSL, thì bạn chỉ cần sao chép certificate và các file khóa vào các đường dẫn được liệt kê trong registry.conf ( ssl_certificatessl_certificate_key ).

Bạn cũng có thể nhận được chứng chỉ SSL đã ký miễn phí .

Nếu không, ta sẽ phải sử dụng certificate SSL tự ký.

Ký certificate của bạn

Vì Docker hiện không cho phép bạn sử dụng certificate SSL tự ký nên điều này phức tạp hơn một chút so với bình thường - ta cũng sẽ phải cài đặt hệ thống của bạn để hoạt động như cơ quan ký certificate của riêng ta .

Để bắt đầu, hãy chuyển sang folder ~/docker-registry/nginx của ta và sẵn sàng tạo các certificate :

  • cd ~/docker-registry/nginx

Tạo khóa root mới:

  • openssl genrsa -out devdockerCA.key 2048

Tạo certificate root (nhập bạn muốn tại dấu nhắc ):

  • openssl req -x509 -new -nodes -key devdockerCA.key -days 10000 -out devdockerCA.crt

Sau đó, tạo khóa cho server của bạn (đây là file được tham chiếu bởi ssl_certificate_key trong cấu hình Nginx của ta ):

  • openssl genrsa -out domain.key 2048

Bây giờ ta phải thực hiện một yêu cầu ký certificate .

Sau khi bạn gõ lệnh này, OpenSSL sẽ nhắc bạn trả lời một số câu hỏi. Viết bạn muốn trong vài lần đầu tiên, nhưng khi OpenSSL nhắc bạn nhập “Tên chung”, hãy đảm bảo nhập domain hoặc IP của server của bạn .

  • openssl req -new -key domain.key -out dev-docker-registry.com.csr

Ví dụ: nếu register Docker của bạn sẽ chạy trên domain www.ilovedocker.com , thì thông tin đầu vào của bạn sẽ giống như sau:

Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:www.ilovedocker.com Email Address []:  Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: 

Không nhập password thử thách.

Tiếp theo, ta cần ký vào certificate request :

  • openssl x509 -req -in dev-docker-registry.com.csr -CA devdockerCA.crt -CAkey devdockerCA.key -CAcreateserial -out domain.crt -days 10000

Vì các certificate mà ta vừa tạo không được xác minh bởi bất kỳ cơ quan cấp certificate đã biết nào (ví dụ: VeriSign), ta cần thông báo cho bất kỳ khách hàng nào đang sử dụng register Docker này đây là certificate hợp lệ . Hãy thực hiện việc này local trên server để ta có thể sử dụng Docker từ chính server đăng ký Docker:

  • sudo mkdir /usr/local/share/ca-certificates/docker-dev-cert
  • sudo cp devdockerCA.crt /usr/local/share/ca-certificates/docker-dev-cert
  • sudo update-ca-certificates

Khởi động lại daemon Docker để nó nhận các thay đổi đối với repository certificate của ta :

  • sudo service docker restart

Cảnh báo: Bạn sẽ phải lặp lại bước này cho mọi máy kết nối với register Docker này! Hướng dẫn cách thực hiện việc này cho các client Ubuntu 14.04 được liệt kê trong Bước 9 - Truy cập Register Docker của bạn từ Máy khách .

Bước 6 - Kiểm tra SSL

Mang lại các containers Docker của ta thông qua trình docker-compose up quen thuộc hiện nay:

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

Thực hiện một kiểm tra curl khác từ một terminal khác (chỉ lần này sử dụng https) để xác minh cài đặt SSL của ta đang hoạt động bình thường. Lưu ý để SSL hoạt động chính xác, bạn sẽ phải sử dụng cùng một domain mà bạn đã nhập vào trường Common Name trước đó trong khi tạo certificate SSL.

  • curl https://USERNAME:PASSWORD@[YOUR-DOMAIN]:5043/v2/

Lưu ý: Nếu bạn đang sử dụng certificate tự ký, bạn sẽ thấy lỗi sau từ curl :

curl: (60) SSL certificate problem: self signed certificate 

Sử dụng tùy chọn -k để nói curl không xác minh với đồng nghiệp:

  • curl -k https://USERNAME:PASSWORD@[YOUR-DOMAIN]:5043/v2/

Ví dụ: nếu user và password bạn cài đặt là sammy and test và certificate SSL của bạn là cho www.example.com , thì bạn sẽ nhập như sau:

  • curl https://sammy:test@www.example.com:5043/v2/

Nếu mọi việc suôn sẻ, curl sẽ in một đối tượng json trống {} và terminal docker-compose của bạn sẽ in kết quả registry_ thông thường.

Nếu không, hãy kiểm tra lại các bước SSL và file cấu hình Nginx của bạn đảm bảo mọi thứ đều chính xác.

Đến đây, ta có một đăng ký Docker 2.0 chức năng được cài đặt và chạy phía sau một server Nginx cung cấp xác thực và mã hóa qua SSL. Nếu firewall của bạn được cấu hình để cho phép truy cập vào cổng 5043 từ bên ngoài, thì bạn có thể đăng nhập vào register Docker này từ bất kỳ docker login https://<YOURDOMAIN> nào của docker login https://<YOURDOMAIN> máy docker login https://<YOURDOMAIN> và nhập tên user và password bạn đã đặt trong phần trước đó .

Bước 7 - Đặt cổng SSL thành 443

Chỉ cần thực hiện một vài bước nữa trước khi ta hoàn tất: thay đổi cổng để sử dụng cổng SSL tiêu chuẩn là 443 (tùy chọn) và cài đặt docker-compose để khởi động containers này khi khởi động.

Hãy bắt đầu bằng cách cài đặt containers Nginx dày đặc của ta để lắng nghe trên cổng 443 (cổng tiêu chuẩn cho SSL) thay vì cổng không chuẩn 5043 mà ta đã sử dụng cho đến nay. Tuy nhiên, các cổng dưới 1024 là các cổng “ quyền ” trên Linux, nghĩa là ta sẽ phải chạy docker-compose chứa docker-compose dưới dạng root.

Trước tiên, hãy mở docker-compose.yml trong một editor :

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

Trong phần Nginx, bạn sẽ thấy một phần ports: :, hãy thay đổi dòng - 5043:443 (điều này ánh xạ cổng 5043 trên server của ta thành cổng 443 bên trong containers Nginx) thành - 443:443 để cổng 443 của containers Nginx của ta nhận được được ánh xạ tới cổng 443. Khi hoàn tất docker-compose.yml bạn sẽ trông như thế này:

~ / docker-registry / docker-compo.yml
nginx:   image: "nginx:1.9"   ports:     - 443:443   links:     - registry:registry   volumes:     - ./nginx/:/etc/nginx/conf.d:ro registry:   image: registry:2   ports:     - 127.0.0.1:5000:5000   environment:     REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data   volumes:     - ./data:/data 

docker-compose phiên docker-compose của bạn qua CTRL-C nếu nó vẫn đang chạy và khởi động lại trên cổng 443:

  • sudo docker-compose up

Lưu ý: Chỉ user root mới có thể nghe các cổng dưới 1024. Lưu ý bạn cần sử dụng sudo lần này với lệnh docker-compose để Nginx có thể chạy trên cổng SSL mặc định 443.

Bạn sẽ thấy docker-compose khởi động như bình thường.

Hãy thử một bài kiểm tra curl khác bằng cách sử dụng domain của ta , chỉ lần này ta sẽ không chỉ định :5043 trong URL:

  • curl https://<YOURUSERNAME>:<YOURPASSWORD>@YOUR-DOMAIN/v2/

Nếu mọi việc suôn sẻ, bạn sẽ thấy kết quả registry_ thông thường trong terminal docker-compose của docker-compose . Bạn cũng có thể cần thử chạy lệnh curl tương tự này từ một máy khác đảm bảo rằng cổng 443 của bạn đang được tiếp xúc với thế giới bên ngoài.

Hãy tiếp tục và sử dụng CTRL-C trong terminal của trình docker-compose để tắt các containers Docker trước khi chuyển sang bước tiếp theo.

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

Nếu tất cả mọi thứ đang tốt, ta hãy đi trước và tạo ra một Upstart kịch bản để Docker registry của ta sẽ bắt đầu khi nào hệ thống khởi động.

Trước tiên, hãy xóa mọi containers hiện có, di chuyển register Docker của ta đến một vị trí trên toàn hệ thống và thay đổi quyền của nó thành root:

  • cd ~/docker-registry
  • docker-compose rm # this removes the existing containers
  • sudo mv ~/docker-registry /docker-registry
  • sudo chown -R root: /docker-registry

Sau đó, sử dụng editor yêu thích của bạn để tạo tập lệnh Khởi động:

  • sudo nano /etc/init/docker-registry.conf

Thêm các nội dung sau để tạo tập lệnh Upstart (việc Upstart để giám sát đúng các containers Docker hơi khó, hãy xem bài đăng trên blog này nếu bạn muốn biết thêm thông tin về những gì tập lệnh Upstart này đang thực hiện):

/etc/init/docker-registry.conf
description "Docker Registry"  start on runlevel [2345] stop on runlevel [016]  respawn respawn limit 10 5  chdir /docker-registry  exec /usr/local/bin/docker-compose up 

Để biết thêm về các tập lệnh Upstart, vui lòng đọc hướng dẫn này .

Hãy thử nghiệm tập lệnh Upstart mới của ta bằng lệnh:

  • sudo service docker-registry start

Bạn sẽ thấy thông tin như thế này:

docker-registry start/running, process 25303 

Bạn có thể xác minh server đang chạy bằng cách thực thi:

  • docker ps

Đầu ra sẽ giống như sau ( lưu ý tất cả các tên đều bắt đầu bằng dockerregistry_

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                          NAMES d4b6fef0b4d1        nginx:1.9           "nginx -g 'daemon of   2 minutes ago       Up 2 minutes        80/tcp, 0.0.0.0:443->443/tcp   dockerregistry_nginx_1 77668352bd39        registry:2          "registry cmd/regist   2 minutes ago       Up 2 minutes        127.0.0.1:5000->5000/tcp       dockerregistry_registry_1 

Upstart sẽ đăng nhập kết quả của docker-compose lệnh để /var/log/upstart/docker-registry.log . Đối với thử nghiệm cuối cùng của ta , hãy “xem trực tiếp” file log có tail ( sudo là cần thiết vì log mới bắt đầu được viết dưới dạng user root ):

  • sudo tail -f /var/log/upstart/docker-registry.log

Bạn sẽ thấy kết quả registry_ thông thường. Từ một terminal hoặc máy khác, hãy tiếp tục và chạy thử nghiệm độ curl quen thuộc hiện nay của ta :

  • curl https://<YOUR_USERNAME>:<YOURPASSWORD>@[YOUR-DOMAIN]/v2/

Nếu mọi thứ hoạt động bình thường thì curl sẽ in một {} vào terminal của bạn và bạn sẽ thấy thông thường:

registry_1 | time="2015-08-12T08:01:12.241887501Z" level=debug msg="authorizing request" environment=development http.request.host=docker.meatflavoredbeer.com http.request.id=e8d69e16-9448-4c48-afd8-57b1f1302742 http.request.method=GET http.request.remoteaddr=106.1.247.4 http.request.uri="/v2/" http.request.useragent="curl/7.37.1" instance.id=14d4727b-fda1-463f-8d0e-181f4c70cb17 service=registry version=v2.0.1 registry_1 | time="2015-08-12T08:01:12.242206499Z" level=info msg="response completed" environment=development http.request.host=docker.meatflavoredbeer.com http.request.id=e8d69e16-9448-4c48-afd8-57b1f1302742 http.request.method=GET http.request.remoteaddr=106.1.247.4 http.request.uri="/v2/" http.request.useragent="curl/7.37.1" http.response.contenttype="application/json; charset=utf-8" http.response.duration=3.359883ms http.response.status=200 http.response.written=2 instance.id=14d4727b-fda1-463f-8d0e-181f4c70cb17 service=registry version=v2.0.1 registry_1 | 172.17.0.4 - - [12/Aug/2015:08:01:12 +0000] "GET /v2/ HTTP/1.0" 200 2 "" "curl/7.37.1" nginx_1    | 106.1.247.4 - nik [12/Aug/2015:08:01:12 +0000] "GET /v2/ HTTP/1.1" 200 2 "-" "curl/7.37.1" "-" 

Bước 9 - Truy cập Register Docker của bạn từ Máy khách

Để truy cập register Docker của bạn từ một máy khác, trước tiên hãy thêm certificate SSL bạn đã tạo trước đó vào client mới. Tệp bạn muốn nằm tại ~/docker-registry/nginx/devdockerCA.crt .

Bạn có thể sao chép trực tiếp vào máy mới hoặc sử dụng hướng dẫn dưới đây để copy paste :

Trên server đăng ký , hãy xem certificate :

  • sudo cat /docker-registry/nginx/devdockerCA.crt

Bạn sẽ nhận được kết quả giống như sau:

Output of sudo cat /docker-registry/nginx/devdockerCA.crt
-----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIJANiXy7fHSPrmMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQwHhcNMTQwOTIxMDYwODE2WhcNNDIwMjA2MDYwODE2WjBF MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAuK4kNFaY3k/0RdKRK1XLj9+IrpR7WW5lrNaFB0OIiItHV9FjyuSWK2mj ObR1IWJNrVSqWvfZ/CLGay6Lp9DJvBbpT68dhuS5xbVw3bs3ghB24TntDYhHMAc8 GWor/ZQTzjccHUd1SJxt5mGXalNHUharkLd8mv4fAb7Mh/7AFP32W4X+scPE2bVH OJ1qH8ACo7pSVl1Ohcri6sMp01GoELyykpXu5azhuCnfXLRyuOvQb7llV5WyKhq+ SjcE3c2C+hCCC5g6IzRcMEg336Ktn5su+kK6c0hoD0PR/W0PtwgH4XlNdpVFqMST vthEG+Hv6xVGGH+nTszN7F9ugVMxewIDAQABo1AwTjAdBgNVHQ4EFgQULek+WVyK dJk3JIHoI4iVi0FPtdwwHwYDVR0jBBgwFoAULek+WVyKdJk3JIHoI4iVi0FPtdww DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAkignESZcgr4dBmVZqDwh YsrKeWSkj+5p9eW5hCHJ5Eg2X8oGTgItuLaLfyFWPS3MYWWMzggxgKMOQM+9o3+k oH5sUmraNzI3TmAtkqd/8isXzBUV661BbSV0obAgF/ul5v3Tl5uBbCXObC+NUikM O0C3fDmmeK799AM/hP5CTDehNaFXABGoVRMSlGYe8hZqap/Jm6AaKThV4g6n4F7M u5wYtI9YDMsxeVW6OP9ZfvpGZW/n/88MSFjMlBjFfFsorfRd6P5WADhdfA6CBECG LP83r7/MhqO06EOpsv4n2CJ3yoyqIr1L1+6C7Erl2em/jfOb/24y63dj/ATytt2H 6g== -----END CERTIFICATE-----

Sao chép kết quả đó vào clipboard của bạn và kết nối với client của bạn.

Trên máy khách , tạo folder certificate :

  • sudo mkdir /usr/local/share/ca-certificates/docker-dev-cert

Mở file certificate để chỉnh sửa:

  • sudo nano /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt

Dán nội dung certificate .

Xác minh file được lưu vào client một cách chính xác bằng cách xem file :

  • cat /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt

Nếu mọi thứ hoạt động bình thường, bạn sẽ thấy cùng một văn bản trước đó:

Output of cat /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt
-----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIJANiXy7fHSPrmMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV ... ... LP83r7/MhqO06EOpsv4n2CJ3yoyqIr1L1+6C7Erl2em/jfOb/24y63dj/ATytt2H 6g== -----END CERTIFICATE-----

Bây giờ hãy cập nhật các certificate :

  • sudo update-ca-certificates

Bạn sẽ nhận được kết quả giống như sau (lưu ý 1 added ):

Output of sudo update-ca-certificates
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d....done.

Nếu bạn chưa cài đặt Docker trên client , hãy làm như vậy ngay bây giờ (xem phần Yêu cầu ).

Khởi động lại Docker đảm bảo nó reload các certificate CA của hệ thống.

  • sudo service docker restart

Đến đây bạn có thể đăng nhập vào register Docker của bạn từ client :

  • docker login https://YOUR-DOMAIN

Lưu ý bạn đang sử dụng https:// . Nhập tên user và password bạn đã cài đặt trước đó (nhập bạn muốn cho email nếu được yêu cầu ).

Output of docker login
Username: USERNAME Password: PASSWORD Email: Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it.

Bạn sẽ thấy thông báo sau:

Output of docker login
Login Succeeded

Đến đây, register Docker của bạn đã được cài đặt và chạy! Hãy tạo một hình ảnh thử nghiệm để đẩy vào register .

Bước 10 - 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 register Docker riêng của bạn , nhưng trước tiên ta phải tạo một hình ảnh. Ta sẽ tạo một hình ảnh đơn giản dựa trên hình ảnh ubuntu từ Docker Hub.

Từ máy khách của bạn, hãy tạo một hình ảnh trống nhỏ để đẩy sang register mới của ta .

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

Sau khi download xong, bạn sẽ ở bên trong dấu nhắc Docker. Hãy thực hiện một thay đổi nhanh chóng đối với hệ thống file bằng cách tạo một file có tên là SUCCESS :

  • touch /SUCCESS

Thoát ra khỏi containers Docker:

  • exit

Commit thay đổi:

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

Lệnh này 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.

Hình ảnh này chỉ tồn tại local ngay bây giờ, vì vậy hãy đẩy nó vào register mới mà ta đã tạo.

Ở bước trước, bạn đã đăng nhập vào register Docker riêng của bạn . Trong trường hợp bạn vẫn chưa đăng nhập, hãy đăng nhập lại ( lưu ý bạn muốn sử dụng https:// ):

  • docker login https://YOUR-DOMAIN

Nhập tên user và password bạn đã cài đặt trước đó:

Username: USERNAME Password: PASSWORD Email:  Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it. 

Docker có một cơ chế bất thường để chỉ định đăng ký nào cần đẩy đến. Bạn phải gắn thẻ một hình ảnh với vị trí của register riêng để đẩy đến nó. Hãy gắn thẻ hình ảnh của ta vào register riêng tư của ta :

  • docker tag test-image [YOUR-DOMAIN]/test-image

Lưu ý bạn đang sử dụng tên local của hình ảnh trước tiên, sau đó là thẻ bạn muốn thêm vào nó. Thẻ không sử dụng https:// , chỉ sử dụng domain , cổng và hình ảnh.

Bây giờ ta có thể đẩy hình ảnh đó vào register của bạn . Lần này, ta chỉ sử dụng tên thẻ:

  • docker push [YOUR-DOMAIN]/test-image

Quá trình này sẽ mất một chút thời gian để tải lên server đăng ký. Bạn sẽ thấy kết quả kết thúc bằng một cái gì đó tương tự như sau:

Output of docker push
latest: digest: sha256:5ea1cfb425544011a3198757f9c6b283fa209a928caabe56063f85f3402363b4 size: 8008

Bước 11 - Kéo từ Register Docker của bạn

Để đảm bảo mọi thứ hoạt động, hãy quay lại server ban đầu của ta (nơi bạn đã cài đặt register Docker) và kéo hình ảnh mà ta vừa đẩy từ client . Bạn cũng có thể kiểm tra từ server thứ ba.

Nếu Docker chưa được cài đặt trên server kéo thử nghiệm của bạn, hãy quay lại và làm theo hướng dẫn cài đặt (và nếu đó là server thứ ba, hướng dẫn SSL) từ Bước 6.

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

  • docker login https://[YOUR-DOMAIN]

Và bây giờ kéo hình ảnh. Bạn chỉ muốn tên hình ảnh “thẻ”, bao gồm domain , cổng và tên hình ảnh (nhưng không phải https:// ):

  • docker pull [YOUR-DOMAIN]/test-image

Docker sẽ thực hiện một số download và đưa bạn trở lại dấu nhắc . Nếu bạn chạy hình ảnh trên máy mới, bạn sẽ thấy rằng file SUCCESS mà ta đã tạo trước đó ở đó:

  • docker run -t -i [YOUR-DOMAIN]/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à ta đã tạo trước đó 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 

Kết luận

Xin chúc mừng! Bạn vừa sử dụng register Docker riêng của bạn để đẩy và kéo containers Docker đầu tiên của bạn !

Vui vẻ lập tài liệu!


Tags:

Các tin liên quan

Cách thực hiện kiểm tra tích hợp liên tục với Drone.io trên CoreOS và Docker
2014-10-08