Docker là một công cụ mạnh mẽ giúp triển khai các máy chủ một cách hiệu quả. Docker Hub, một registry công khai của Docker, cho phép bạn lưu trữ các Docker images. Tuy nhiên, mặc dù Docker cho phép bạn miễn phí tải lên Docker images lên Docker Hub, tất cả các hình ảnh này sẽ được công khai, điều này có thể không phù hợp với các dự án yêu cầu bảo mật cao.
Bài hướng dẫn này sẽ hướng dẫn bạn cách thiết lập và bảo mật một Docker Registry riêng tư, giúp bạn dễ dàng lưu trữ và quản lý các Docker images một cách an toàn. Sau khi hoàn thành, bạn sẽ có thể tải lên các Docker images tùy chỉnh vào registry riêng và truy xuất chúng một cách an toàn từ các máy chủ khác.
Để thiết lập Docker Registry riêng tư hiệu quả, việc sử dụng VPS server mạnh mẽ là yếu tố then chốt. Một VPS server ổn định giúp bạn triển khai và quản lý container dễ dàng. Khám phá các giải pháp VPS server tối ưu tại DataOnline để bắt đầu ngay hôm nay!
Lưu ý rằng hướng dẫn này không bao gồm quy trình container hóa ứng dụng, mà tập trung vào việc xây dựng và cấu hình một registry riêng cho việc lưu trữ các bản triển khai. Hướng dẫn đã được kiểm tra trên cả máy chủ registry và máy khách chạy Ubuntu 14.04, nhưng nó cũng có thể áp dụng cho các bản phân phối Linux khác dựa trên Debian. Hướng dẫn này phù hợp với Docker Registry phiên bản 2.0.
Docker Concepts
Nếu bạn chưa sử dụng Docker trước đây, hãy dành chút thời gian để tìm hiểu một số khái niệm quan trọng của Docker. Nếu bạn đã quen với Docker và chỉ cần biết cách bắt đầu chạy registry của riêng mình, bạn có thể bỏ qua phần này.
Để ôn lại cách sử dụng Docker, hãy xem qua Docker Cheat Sheet xuất sắc.
Với cốt lõi của nó, Docker là cách để tách biệt một ứng dụng và các phụ thuộc cần thiết để chạy nó khỏi hệ điều hành. Để làm được điều này, Docker sử dụng các container và image. Một Docker image về cơ bản là một mẫu (template) cho một hệ thống tập tin. Khi bạn chạy một Docker image, một phiên bản của hệ thống tập tin đó sẽ được kích hoạt và chạy trên hệ thống của bạn bên trong một Docker container. Theo mặc định, container này không thể tác động đến image gốc hoặc hệ thống tập tin của máy chủ chạy Docker. Nó là một môi trường tự-contained.
Mọi thay đổi bạn thực hiện trong container chỉ được lưu giữ trong container đó và không ảnh hưởng đến image gốc. Nếu bạn quyết định muốn giữ lại các thay đổi đó, bạn có thể “commit” container thành một Docker image mới (thông qua lệnh docker commit
). Điều này có nghĩa là bạn sau đó có thể khởi tạo các container mới bắt đầu với nội dung của container cũ, mà không làm thay đổi container (hoặc image) ban đầu. Nếu bạn quen thuộc với git, thì quy trình này sẽ khá giống: bạn có thể tạo các nhánh mới (trong Docker gọi là image) từ bất kỳ container nào. Việc chạy một image tương tự như thực hiện lệnh git checkout.
Tiếp tục theo phép ẩn dụ này, việc chạy một Docker registry riêng tư giống như việc chạy một kho lưu trữ Git riêng tư cho các Docker image của bạn.
Yêu cầu tiên quyết
Để hoàn thành hướng dẫn này, bạn sẽ cần:
● 2 Droplets Ubuntu 14.04: một cho Docker registry riêng tư và một cho máy khách Docker
● Một người dùng không phải root có quyền sudo trên mỗi Droplet (xem hướng dẫn Thiết Lập Máy Chủ Ban Đầu với Ubuntu 14.04 để thiết lập).
● Docker và Docker Compose được cài đặt theo hướng dẫn từ Cách Cài Đặt và Sử Dụng Docker Compose trên Ubuntu 14.04.
● Một tên miền trỏ đến Droplet cho Docker registry riêng tư.
Bước 1 – Cài đặt các gói hỗ trợ bảo mật
Để thiết lập bảo mật cho Docker Registry, cách tốt nhất là sử dụng Docker Compose. Nhờ đó, bạn có thể dễ dàng chạy Docker Registry trong một container và để Nginx xử lý bảo mật cũng như giao tiếp với thế giới bên ngoài trong một container khác. Bạn đã cài đặt Docker Compose từ phần Prerequisites.
Vì chúng ta sẽ sử dụng Nginx để xử lý bảo mật, nên cần có nơi lưu trữ danh sách các kết hợp tên người dùng và mật khẩu cho phép truy cập registry. Chúng ta sẽ cài đặt gói apache2-utils
chứa tiện ích htpasswd
có thể tạo các mật khẩu băm (hash) mà Nginx hiểu được:
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 rất hiệu quả trong việc khởi động và quản lý một hoặc hai container Docker, nhưng hầu hết các ứng dụng chạy trong Docker container không tồn tại đơn 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 đều bao gồm một máy chủ web phục vụ mã nguồn của ứng dụng, một ngôn ngữ kịch bản thông dịch như PHP hoặc Ruby (với Rails), và một máy chủ cơ sở dữ liệu như MySQL.
Docker Compose cho phép bạn viết một file cấu hình .yml
cho mỗi container, cũng như các thông tin về cách các container giao tiếp với nhau. Sau đó, bạn sử dụng công cụ dòng lệnh docker-compose
để gửi lệnh cho tất cả các thành phần tạo nên một ứng dụng.
Vì Docker registry thực chất là một ứng dụng có nhiều thành phần, chúng ta sẽ sử dụng Docker Compose để quản lý cấu hình.
Thiết lập file Docker Compose
Để khởi động một registry cơ bản, cấu hình duy nhất cần thiết là định nghĩa vị trí lưu trữ dữ liệu của registry.
Trước tiên, tạo một thư mục để chứa các file của hướng dẫn và các thư mục con cần thiết:
mkdir ~/docker-registry && cd $_ mkdir data
Sử dụng trình soạn thảo ưa thích của bạn để tạo file docker-compose.yml
:
nano docker-compose.yml
Thêm nội dung sau vào file:
docker-compose.yml registry: image: registry:2 ports: - 127.0.0.1:5000:5000 environment: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data volumes: - ./data:/data
Giải thích:
-
Phần
environment
đặt biến môi trường trong container Docker registry với đường dẫn/data
. Ứng dụng Docker registry sẽ kiểm tra biến này khi khởi động và bắt đầu lưu dữ liệu vào thư mục/data
. -
Dòng
volumes: - ./data:/data
báo cho Docker ánh xạ thư mục/data
trong container tới thư mục~/docker-registry/data
trên máy chủ.
Khởi động Docker Compose để kiểm tra:
cd ~/docker-registry docker-compose up
Bạn sẽ thấy các thanh tiến trình tải xuống xuất hiện khi Docker tải image Docker registry từ registry của Docker. Nếu mọi thứ ổn, sau một vài phút bạn sẽ thấy đầu ra (output) tương tự:
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 nếu thấy thông báo “No HTTP secret provided” – đó là điều bình thường.
Hiện tại, bạn đã có một Docker registry đầy đủ, chạy và lắng nghe trên cổng 5000 (được cấu hình trong phần ports
). Tuy nhiên, registry này chưa thực sự hữu ích vì nó chỉ khởi động khi bạn bật nó lên thủ công và không có cơ chế xác thực tích hợp, nên đang hoàn toàn mở cho công chúng.
Docker Compose mặc định sẽ chờ lệnh của bạn mãi, vì vậy hãy nhấn CTRL-C
để tắt container Docker registry.
Bước 3 – Thiết lập Container Nginx
Để khắc phục các vấn đề bảo mật, bước đầu tiên là thiết lập một container Nginx và liên kết nó với container Docker registry.
Tạo một thư mục chứa cấu hình của Nginx:
mkdir ~/docker-registry/nginx
Sau đó, mở lại file docker-compose.yml
trong thư mục ~/docker-registry
:
nano docker-compose.yml
Thêm phần cấu hình Nginx vào đầu file:
docker-compose.yml nginx: image: "nginx:1.9" ports: - 5043:443 links: - registry:registry volumes: - ./nginx/:/etc/nginx/conf.d:ro
Giải thích:
-
Container Nginx được xây dựng từ image chính thức
nginx:1.9
. -
Phần
links
tự động thiết lập liên kết giữa container Nginx và container registry, cho phép Nginx truy cập registry qua hostnameregistry
. -
Phần
volumes
ánh xạ thư mục cấu hình trên máy chủ (~/docker-registry/nginx/) vào/etc/nginx/conf.d
trong container, với quyền chỉ đọc (:ro
).
File docker-compose.yml
đầy đủ sẽ trông như sau:
docker-compose.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
Khi chạy docker-compose up
, sẽ khởi động đồng thời hai container: một cho Docker registry và một cho Nginx.
Trước khi khởi động, ta cần cấu hình Nginx. Tạo file cấu hình cho registry:
nano ~/docker-registry/nginx/registry.conf
Dán nội dung 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 file và thoát.
Bây giờ, cài đặt Nginx (nếu chưa cài) và khởi động các container với:
docker-compose up
Nginx không in ra đầu ra khi khởi động, nhưng nếu mọi thứ đúng, bạn sẽ có một bản Nginx cấu hình để chuyển tiếp (proxy) các yêu cầu đến container registry. Để kiểm tra, hãy dùng curl
:
Truy cập trực tiếp Docker registry:
curl http://localhost:5000/v2/
Kết quả sẽ là một đối tượng JSON rỗng:
Output {}
Sau đó, truy cập qua Nginx:
curl http://localhost:5043/v2/
Kết quả cũng sẽ là:
Output {}
Nếu mọi thứ hoạt động đúng, bạn sẽ thấy một số đầu ra trong terminal của docker-compose
trông giống như sau:
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ố phía sau _
có thể khác trên máy của bạn), thì mọi thứ đều ổn, và Nginx đã chuyển tiếp thành công yêu cầu HTTP của chúng ta đến Docker registry.
Hãy nhấn CTRL-C
một lần nữa trong terminal docker-compose
để tắt các Docker container.
Bước 4 – Thiết lập xác thực
Khi Nginx đã chuyển tiếp các yêu cầu đúng, hãy thiết lập xác thực HTTP để kiểm soát quyền truy cập vào Docker registry.
Trước tiên, chuyển đến thư mục chứa cấu hình Nginx
Tạo người dùng đầu tiên (thay USERNAME bằng tên mong muốn):
Nhập mật khẩu khi được yêu cầu. Để thêm người dùng sau này, chạy lại lệnh trên mà không có tham số -c
(chữ c
nghĩa là tạo mới):
htpasswd registry.password USERNAME
Tại thời điểm này, chúng ta đã có một tệp registry.password
chứa thông tin người dùng được thiết lập và Docker registry đã sẵn sàng. Bạn có thể xem nội dung của tệp này bất cứ lúc nào để kiểm tra danh sách người dùng (hoặc xóa người dùng nếu bạn muốn thu hồi quyền truy cập).
Tiếp theo, chúng ta cần cấu hình Nginx để sử dụng tệp xác thực này.
Mở tệp ~/docker-registry/nginx/registry.conf
bằng trình soạn thảo văn bản ưa thích của bạn:
nano ~/docker-registry/nginx/registry.conf
Tìm đoạn có nội dung:
~/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ỏ dấu #
ở đầu dòng của các lệnh bắt đầu bằng auth_basic
và auth_basic_user_file
, cũng như dòng add_header
, để đoạn đó trở thành:
~/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;
Chúng ta đã cấu hình Nginx để bật xác thực HTTP Basic cho tất cả các yêu cầu được chuyển tiếp đến Docker registry và chỉ định sử dụng tệp mật khẩu mà chúng ta vừa tạo.
Bây giờ, hãy khởi động lại các container để kiểm tra xem xác thực có hoạt động không:
cd ~/docker-registry docker-compose up
Tiếp theo, lặp lại bài kiểm tra với curl
:
curl http://localhost:5043/v2/
Bạn sẽ nhận được thông báo lỗi do không được cấp quyền truy cậ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ờ, thử thêm tên người dùng và mật khẩu mà bạn đã tạo trước đó vào yêu cầu curl
:
curl http://USERNAME:PASSWORD@localhost:5043/v2/
Lần này, bạn sẽ nhận được đầu ra giống như trước – một đối tượng JSON rỗng {}
. Đồng thời, bạn cũng sẽ thấy các dòng log có tiền tố registry_
trong terminal của docker-compose
.
Cuối cùng, nhấn CTRL-C
trong terminal docker-compose
để tắt các Docker container.
Bước 5 – Thiết lập SSL
Hiện tại, registry đã chạy sau Nginx với xác thực HTTP cơ bản, nhưng các kết nối vẫn chưa được mã hoá (unencrypted). Bạn có thể nhận thấy trong file cấu hình Nginx có các dòng SSL bị comment (có dấu #
).
Mở lại file cấu hình:
nano ~/docker-registry/nginx/registry.conf
Tìm đoạn:
~/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ỏ dấu #
ở trước các dòng SSL và chỉnh sửa server_name
thành tên miền của bạn (nếu có). Khi xong, phần đầu file sẽ trở thành:
~/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 file. Nginx giờ sẽ tìm chứng chỉ SSL và file key tại /etc/nginx/conf.d/domain.crt
và /etc/nginx/conf.d/domain.key
. Do ánh xạ thư mục trong Docker Compose, thư mục /etc/nginx/conf.d/
trong container tương ứng với thư mục ~/docker-registry/nginx/
trên máy chủ của bạn. Vì vậy, bạn cần đặt các file chứng chỉ vào đó.
Nếu bạn có chứng chỉ SSL thật hoặc dự định mua, hãy copy chúng vào đúng vị trí. Nếu không, bạn có thể tạo chứng chỉ tự ký (self-signed certificate
).
Tự ký chứng chỉ SSL
Do Docker hiện không cho phép sử dụng chứng chỉ tự ký, ta cần thiết lập hệ thống của mình làm Certificate Signing Authority (CA) riêng.
Chuyển đến thư mục cấu hình Nginx:
cd ~/docker-registry/nginx
Tạo khóa gốc:
openssl genrsa -out devdockerCA.key 2048
Tạo chứng chỉ gốc (trả lời các câu hỏi theo ý bạn):
openssl req -x509 -new -nodes -key devdockerCA.key -days 10000 -out devdockerCA.crt
Tạo khóa cho server (sẽ dùng cho ssl_certificate_key):
openssl genrsa -out domain.key 2048
Bây giờ, chúng ta cần tạo một yêu cầu ký chứng chỉ (Certificate Signing Request – CSR).
Sau khi bạn nhập lệnh sau, OpenSSL sẽ yêu cầu bạn trả lời một số câu hỏi. Bạn có thể nhập bất kỳ thông tin nào cho các câu hỏi đầu tiên, nhưng khi OpenSSL yêu cầu nhập “Common Name”, hãy chắc chắn rằng bạn nhập tên miền hoặc địa chỉ IP của máy chủ của bạn.
Chạy lệnh sau để tạo yêu cầu ký chứng chỉ:
openssl req -new -key domain.key -out dev-docker-registry.com.csr
Ví dụ, nếu Docker registry của bạn sẽ chạy trên tên miền www.ilovedocker.com, thì khi OpenSSL yêu cầu nhập “Common Name”, bạn nên nhập 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 []:
Bây giờ, vì chứng chỉ tự ký không được tin cậy bởi các client, bạn cần cài đặt chứng chỉ gốc (devdockerCA.crt) lên máy chủ sử dụng Docker registry. Trên máy chủ registry:
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 Docker daemon để nhận các thay đổi:
sudo service docker restart
Lưu ý: Bạn cần lặp lại bước này trên mỗi máy khách kết nối tới Docker registry.
Bước 6 – Kiểm tra SSL
Khởi động lại các container bằng lệnh:
cd ~/docker-registry docker-compose up
Thử nghiệm với curl
sử dụng https (lưu ý phải dùng tên miền giống Common Name đã nhập khi tạo chứng chỉ):
curl https://USERNAME:PASSWORD@[YOUR-DOMAIN]:5043/v2/
Nếu sử dụng chứng chỉ tự ký, có thể nhận lỗi:
curl: (60) SSL certificate problem: self signed certificateĐể bỏ qua xác thực chứng chỉ, sử dụng tùy chọn
-k
:curl -k https://USERNAME:PASSWORD@[YOUR-DOMAIN]:5043/v2/
Nếu mọi thứ hoạt động đúng, lệnh curl
sẽ trả về một đối tượng JSON rỗng {}
, và terminal của docker-compose
sẽ hiển thị các log thông thường với tiền tố registry_
.
Nếu không, hãy kiểm tra lại các bước thiết lập SSL và file cấu hình Nginx để đảm bảo mọi thứ đã được thiết lập chính xác.
Đến thời điểm này, bạn đã có một Docker registry 2.0 hoàn chỉnh, chạy phía sau máy chủ Nginx, nơi cung cấp cả xác thực và mã hóa SSL. Nếu tường lửa của bạn được cấu hình để cho phép truy cập từ bên ngoài vào cổng 5043, thì bạn có thể đăng nhập vào Docker registry từ bất kỳ máy nào bằng cách chạy docker login https://<YOURDOMAIN>
Sau đó, nhập tên người dùng và mật khẩu mà bạn đã thiết lập trong các bước trước đó.
Bước 7 – Thiết lập cổng SSL thành 443
Chúng ta chỉ còn một vài bước nữa trước khi hoàn tất: đổi cổng sang cổng SSL tiêu chuẩn 443
và cấu hình docker-compose
để tự động khởi động các container khi hệ thống khởi động.
Trước tiên, hãy cấu hình container Nginx trong Docker để lắng nghe trên cổng 443 (cổng tiêu chuẩn cho SSL) thay vì cổng 5043 mà chúng ta đã sử dụng trước đó.
Tuy nhiên, trên Linux, các cổng dưới 1024 là “privileged” (cổng đặc quyền), nghĩa là chúng ta sẽ phải chạy docker-compose
với quyền root.
Mở file docker-compose.yml
:
nano ~/docker-registry/docker-compose.yml
Trong phần Nginx của file docker-compose.yml
, bạn sẽ thấy một mục ports(thao tác này ánh xạ cổng 5043 trên máy chủ đến cổng 443 bên trong container Nginx). Điều này sẽ ánh xạ cổng 443 trong container Nginx trực tiếp đến cổng 443 trên máy chủ, cho phép bạn truy cập Docker registry qua mà không cần chỉ định cổng.Nếu docker-compose
đang chạy, hãy dừng nó bằng CTRL-C
và khởi động lại với quyền root để áp dụng thay đổi:
~/docker-registry/docker-compose.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
Nếu docker-compose
vẫn đang chạy, hãy dừng nó bằng cách nhấn CTRL-C, sau đó khởi động lại trên cổng 443 bằng lệnh sau:
sudo docker-compose up
Lưu ý: Chỉ người dùng root mới có thể lắng nghe trên các cổng dưới 1024. Vì vậy, lần này bạn cần sử dụng
sudo
khi chạydocker-compose
, để Nginx có thể hoạt động trên cổng SSL mặc định 443.
Sau khi khởi động, bạn sẽ thấy docker-compose
hoạt động như bình thường.
Bây giờ, hãy thử một bài kiểm tra với curl
, lần này chúng ta không chỉ định cổng 5043 trong URL:
curl https://<YOURUSERNAME>:<YOURPASSWORD>@YOUR-DOMAIN/v2/
Nếu mọi thứ hoạt động chính xác, bạn sẽ thấy các log đầu ra thông thường với tiền tố registry_
trong terminal của docker-compose
.
Bạn cũng có thể thử chạy lệnh curl
này từ một máy khác để đảm bảo rằng cổng 443 thực sự được mở cho truy cập bên ngoài.
Cuối cùng, nhấn CTRL-C trong terminal docker-compose
để dừng các Docker container trước khi chuyển sang bước tiếp theo.
Bước 8 – Khởi chạy Docker Registry dưới dạng dịch vụ
Nếu mọi thứ ổn, ta hãy tạo một script Upstart để Docker registry tự khởi động khi hệ thống khởi động.
Dọn dẹp các container hiện có và chuyển thư mục Docker registry đến vị trí hệ thống:
cd ~/docker-registry docker-compose rm # this removes the existing containers sudo mv ~/docker-registry /docker-registry sudo chown -R root: /docker-registry
Tạo một script Upstart:
sudo nano /etc/init/docker-registry.conf
Thêm nội dung sau:
/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
Kiểm tra script Upstart:
sudo service docker-registry start
Bạn sẽ thấy thông báo như:
docker-registry start/running, process 25303
Bước 9 – Truy cập Docker Registry từ máy khách
Để truy cập Docker registry từ máy khác, trước tiên bạn cần cài đặt chứng chỉ SSL (chứng chỉ devdockerCA.crt) lên máy khách.
Trên máy chủ registry, mở file chứng chỉ sudo cat /docker-registry/nginx/devdockerCA.crt
Trên máy khách: Tạo thư mục chứa chứng chỉ
sudo cat /docker-registry/nginx/devdockerCA.crt
Bạn sẽ nhận được đầu ra trông 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 toàn bộ nội dung đó vào clipboard, sau đó kết nối đến máy khách.
Trên máy khách, tạo thư mục để lưu trữ chứng chỉ:
sudo mkdir /usr/local/share/ca-certificates/docker-dev-cert
Mở tệp chứng chỉ để chỉnh sửa:
sudo nano /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt
Dán nội dung chứng chỉ đã sao chép vào tệp, sau đó lưu và thoát.
Kiểm tra xem tệp đã được lưu chính xác trên máy khách bằng cách chạy lệnh sau:
cat /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt
Nếu mọi thứ hoạt động chính xác, bạn sẽ thấy nội dung chứng chỉ giống như trên máy chủ registry.
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-----
Chạy lệnh sau để cập nhật danh sách chứng chỉ tin cậy của hệ thống:
sudo update-ca-certificates
Bạn sẽ thấy đầu ra tương tự như sau (lưu ý dòng “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 Docker chưa được cài đặt trên máy khách, hãy cài đặt ngay bây giờ (xem phần Prerequisites).
Sau đó, khởi động lại Docker để đảm bảo nó tải lại danh sách chứng chỉ CA của hệ thống:
sudo service docker restart
Bây giờ, bạn có thể đăng nhập vào Docker registry từ máy khách bằng lệnh:
docker login https://YOUR-DOMAIN
Lưu ý: Bạn phải sử dụng https://
để đảm bảo kết nối an toàn.
Nhập tên người dùng và mật khẩu đã thiết lập trước đó (bạn có thể nhập bất kỳ giá trị nào 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.
Nếu đăng nhập thành công, bạn sẽ thấy thông báo:
Output of docker login Login Succeeded
Tại thời điểm này, Docker registry của bạn đã hoạt động thành công!
Bây giờ, hãy tạo một Docker image thử nghiệm và đẩy (push) nó lên registry để kiểm tra.
Bước 10 – Xuất bản Image lên Docker Registry riêng tư
Giờ bạn đã sẵn sàng để xuất bản một image lên Docker registry riêng tư, nhưng trước tiên cần tạo một image. Chúng ta sẽ tạo một image đơn giản dựa trên image ubuntu từ Docker Hub.
Trên máy khách, tạo một container tương tác:
docker run -t -i ubuntu /bin/bash
Sau khi tải xong, bạn sẽ vào prompt của Docker. Tạo một thay đổi nhanh bằng cách tạo file có tên SUCCESS
:
touch /SUCCESS
Thoát container:
exit
Commit thay đổi thành một image mới có tên test-image:
docker commit $(docker ps -lq) test-image
Image này lúc này chỉ tồn tại cục bộ. Để đẩy nó lên registry, hãy đăng nhập lại nếu cần (chú ý sử dụng https://
):
docker login https://YOUR-DOMAIN
Nhập thông tin xác thự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.
Tiếp theo, gán nhãn cho image với địa chỉ của registry:
docker tag test-image [YOUR-DOMAIN]/test-image
Cuối cùng, đẩy image lên registry:
docker push [YOUR-DOMAIN]/test-image
Quá trình này sẽ mất một lúc, và đầu ra sẽ kết thúc với thông tin như:
Output of docker push latest: digest: sha256:5ea1cfb425544011a3198757f9c6b283fa209a928caabe56063f85f3402363b4 size: 8008
Bước 11 – Kéo Image từ Docker Registry
Để đảm bảo mọi thứ hoạt động đúng, hãy quay lại máy chủ ban đầu (nơi bạn đã cài đặt Docker registry) và thử kéo (pull) image mà bạn vừa đẩy (push) từ máy khách. Bạn cũng có thể thử nghiệm thao tác này từ một máy chủ thứ ba.
Nếu Docker chưa được cài đặt trên máy chủ thử nghiệm, hãy quay lại và làm theo hướng dẫn cài đặt trong Step 6.
Nếu đây là máy chủ thứ ba, bạn cũng cần làm theo hướng dẫn về SSL để thêm chứng chỉ tin cậy vào hệ thống.
docker login https://[YOUR-DOMAIN]
Trên máy chủ thử nghiệm, đăng nhập vào registry bằng tên người dùng và mật khẩu mà bạn đã thiết lập trước đó.
Bây giờ, kéo image test-image từ registry.
Lưu ý rằng bạn chỉ cần sử dụng tên image (bao gồm tên miền, cổng và tên image), không cần https://
:
docker pull [YOUR-DOMAIN]/test-image
Docker sẽ tải xuống image và đưa bạn trở lại dấu nhắc lệnh (prompt).Khởi động container từ image vừa tải xuống:
docker run -t -i [YOUR-DOMAIN]/test-image /bin/bash
Liệt kê các tệp trong bash shell bằng lệnh:
ls
Bạn sẽ thấy file SUCCESS
mà chúng ta đã tạo trước đó:
SUCCESS bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Kết Luận
Khi cấu hình Docker Registry, chi phí vận hành là điều cần cân nhắc. Giá thuê VPS hợp lý sẽ giúp bạn tiết kiệm ngân sách mà vẫn đảm bảo hiệu suất. Tìm hiểu thêm về giá thuê VPS và các gói dịch vụ hấp dẫn tại DataOnline để chọn lựa phù hợp!
Chúc mừng bạn! Bạn đã hoàn thành việc thiết lập và sử dụng Docker registry riêng tư thành công để đẩy và kéo container Docker đầu tiên.
Chúc bạn tiếp tục khám phá và tận dụng hết tiềm năng của Docker!
Happy Dockering!