摘要:前言最近開始研究的應用,于是打算搭建一個私有的倉庫,并使用阿里云的作為存儲引擎。登陸成功后,執行以下命令即可上傳配置阿里云首先在剛才執行的命令行窗口中按退出服務。待上傳完畢,可以打開阿里云的控制臺界面檢查文件是否被正確上傳上去了。
前言
最近開始研究 Docker 的應用,于是打算 搭建一個私有的 Docker 倉庫,并使用阿里云的 OSS 作為存儲引擎 。從網上搜索到的資料大都是比較舊的,新版本的 Registry 服務與舊版本的差別比較大,瞎折騰了一天,踩坑無數。突然有感, 網上的過時資料(或者說得不清不楚的)真是坑死人不償命 ,還是得把這兩天摸索出來的門道記錄下來,一是好讓自己過一段時間后再部署 Docker 倉庫時不用重踩一次坑,二來也順便給后來者提個醒。
系統環境
客戶端 docker 版本
docker version
Client:
Version: 1.9.1
API version: 1.21
Go version: go1.4.3
Git commit: a34a1d5
Built: Fri Nov 20 17:56:04 UTC 2015
OS/Arch: darwin/amd64
Server:
Version: 1.9.1
API version: 1.21
Go version: go1.4.3
Git commit: a34a1d5
Built: Fri Nov 20 17:56:04 UTC 2015
OS/Arch: linux/amd64
服務器端 docker 版本
Boot2Docker version 1.9.1, build master : cef800b - Fri Nov 20 19:33:59 UTC 2015
Docker version 1.9.1, build a34a1d5
客戶端 docker-compose 版本
docker-compose version 1.5.2, build 7240ff3
docker-py version: 1.5.0
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014
如果系統沒有docker-compose命令,可以執行以下命令安裝:
$ curl -L https://github.com/docker/com...uname -s-uname -m > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
啟動 Registry 服務
安裝
為了發揮 Docker 容器技術的優勢,我們直接使用 Docker 鏡像來部署服務。
首先在 服務器端 新建工作目錄并進入該目錄:
$ mkdir my_registry && cd my_registry
在當前目錄下新建文件docker-compose.yml:
registry:
restart: always
image: "registry:2"
ports:
- 127.0.0.1:5000:5000
volumes:
- ./auth:/auth - ./data:/var/lib/registry
environment:
- REGISTRY_AUTH=htpasswd - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm - REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
在啟動 Registry 服務時,需要用到以下兩個目錄:
auth目錄用于存放docker login時的賬號和密碼
data目錄用于存放docker push時上傳上來的文件
執行以下命令新建這兩個目錄:
$ mkdir auth && mkdir data
接著,創建一個測試賬號(用戶名:test,密碼:123456)并保存到auth/htpasswd中:
$ htpasswd -Bbn test 123456 > auth/htpasswd
現在我們來啟動 Registry 服務:
$ docker-compose up -d
由于本地沒有名為registry:2的鏡像,控制臺可能會打印出如下信息然后暫停一陣:
Pulling registry (registry:2)...
稍等一兩分鐘,可以看到控制臺打印出如下信息則說明已經啟動成功了:
Creating dockertest_registry_1
Attaching to dockertest_registry_1
registry_1 | time="2016-01-13T21:57:14Z" 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.5.2 instance.id=25aa4d1d-0510-4cb6-9006-1083bff5fc15 version=v2.2.1
registry_1 | time="2016-01-13T21:57:14Z" level=info msg="redis not configured" go.version=go1.5.2 instance.id=25aa4d1d-0510-4cb6-9006-1083bff5fc15 version=v2.2.1
registry_1 | time="2016-01-13T21:57:14Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.5.2 instance.id=25aa4d1d-0510-4cb6-9006-1083bff5fc15 version=v2.2.1
registry_1 | time="2016-01-13T21:57:14Z" level=info msg="Starting upload purge in 11m0s" go.version=go1.5.2 instance.id=25aa4d1d-0510-4cb6-9006-1083bff5fc15 version=v2.2.1
registry_1 | time="2016-01-13T21:57:14Z" level=info msg="listening on [::]:5000" go.version=go1.5.2 instance.id=25aa4d1d-0510-4cb6-9006-1083bff5fc15 version=v2.2.1
測試
現在再打開一個命令行窗口,并進入my_registry目錄。
執行以下命令創建一個新鏡像:
$ docker tag registry:2 127.0.0.1:5000/test/registry
說明:鏡像名為127.0.0.1:5000/test/registry,其中127.0.0.1:5000表示服務器地址,test/registry表示鏡像名。
上傳之前要先登錄:
$ docker login 127.0.0.1:5000
說明:按提示輸入上文創建的用戶名和密碼,郵箱可以不用填寫。
登陸成功后,執行以下命令即可上傳:
$ docker push 127.0.0.1:5000/test/registry
配置阿里云 OSS
首先在剛才執行docker-compose up的命令行窗口中按CTRL + C退出服務。
將文件docker-compose.yml改為以下內容:
registry:
restart: always
image: "registry:2"
ports:
- 127.0.0.1:5000:5000
volumes:
- ./auth:/auth
environment:
- REGISTRY_AUTH=htpasswd - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm - REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd - REGISTRY_STORAGE=oss - REGISTRY_STORAGE_OSS_ACCESSKEYID=your_oss_accesskey_id - REGISTRY_STORAGE_OSS_ACCESSKEYSECRET=your_oss_accesskey_secret - REGISTRY_STORAGE_OSS_REGION=your_oss_region - REGISTRY_STORAGE_OSS_BUCKET=your_oss_bucket - REGISTRY_STORAGE_OSS_ENDPOINT=your_oss_bucket.your_oss_region.aliyuncs.com
說明:由于使用阿里云 OSS 作為存儲引擎,所以不需要再將文件存儲到本地,因此將volumes中的data目錄配置去掉;environment新增了REGISTRY_STORAGE系列的環境變量配置,需要將該部分的值替換為對應的accesskey_id、accesskey_secret、region、bucket和endpoint等信息。
刪除data目錄并重新啟動服務:
$ rm -Rf data && docker-compose up
再執行剛才的命令上傳鏡像:
$ docker push 127.0.0.1:5000/test/registry
可以感覺到這次的上傳速度沒有第一次的快,因為它還需要上傳到阿里云 OSS。待上傳完畢,可以打開阿里云 OSS 的控制臺界面檢查文件是否被正確上傳上去了。
配置 SSL 證書
如果我們要在客戶端(不是在服務器端測試)pull或push鏡像時,docker使用的是https協議,因此會報unable to ping registry endpoint錯誤:
The push refers to a repository [registry.example.com:5000/test] (len: 1)
unable to ping registry endpoint https://registry.example.com:...
v2 ping attempt failed with error: Get https://registry.example.com:... dial tcp registry.example.com:5000: i/o timeout
v1 ping attempt failed with error: Get https://registry.example.com:... dial tcp 199.99.99.9:9000: i/o timeout
所以必須要配置 SSL 證書。
安裝
首先需要準備證書文件,分別保存到auth/domain.crt和auth/domain.key中。
新建 Nginx 的配置文件auth/nginx.conf:
upstream docker-registry {
server registry:5000;
}
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
"registry/2.0" "";
default registry/2.0;
}
server {
listen 443 ssl;
server_name myregistrydomain.com;
# SSL
ssl_certificate /etc/nginx/conf.d/domain.crt;
ssl_certificate_key /etc/nginx/conf.d/domain.key;
# Recommendations from https://raymii.org/s/tutorial...
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# 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/doc...
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. auth_basic "Registry realm"; auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd; ## If $docker_distribution_api_version is empty, the header will not be added. ## See the map directive above where this variable is defined. add_header "Docker-Distribution-Api-Version" $docker_distribution_api_version 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;
}
}
將文件docker-compose.yml改為如下內容:
nginx:
image: "nginx:1.9"
ports:
- 443:443
links:
- registry:registry
volumes:
- ./auth/:/etc/nginx/conf.d
registry:
restart: always
image: "registry:2"
ports:
- 127.0.0.1:5000:5000
environment:
- REGISTRY_STORAGE=oss - REGISTRY_STORAGE_OSS_ACCESSKEYID=your_oss_accesskey_id - REGISTRY_STORAGE_OSS_ACCESSKEYSECRET=your_oss_accesskey_secret - REGISTRY_STORAGE_OSS_REGION=your_oss_region - REGISTRY_STORAGE_OSS_BUCKET=your_oss_bucket - REGISTRY_STORAGE_OSS_ENDPOINT=your_oss_bucket.your_oss_region.aliyuncs.com
說明:刪除registry項目的environment中REGISTRY_AUTH開頭的變量以及volumes項,因為auth認證已經在 Nginx 中配置了。
執行以下命令啟動服務:
$ docker-compose up
說明:如果本地不存在名為nginx:1.9的鏡像,控制臺可能會打印出Pulling nginx (nginx:1.9)...并先下載該鏡像。
測試
假設剛才配置的證書域名為docker.ucdok.com,現在我們 在客戶端執行以下命令 登錄:
$ docker login docker.ucdok.com
生成新的鏡像:
$ docker pull ubuntu
$ docker tag ubuntu docker.ucdok.com/test/ubuntu
上傳新的鏡像:
$ docker push docker.ucdok.com/test/ubuntu
其他問題
增加用戶
可以執行htpasswd命令來創建,并將其保存到auth/htpasswd文件中:
$ htpasswd -Bbn username password >> auth/htpasswd
在后臺啟動服務
啟動服務時增加-d參數:
$ docker-compose up -d
停止后臺服務
在docker-compose.yml文件所在目錄執行以下命令:
$ docker-compose stop
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26943.html
摘要:包括兩個關鍵組成部分和。簡單理解,第一個是負責存儲的,第二個是負責管理鏡像的。使用阿里云的保存鏡像文件默認鏡像文件存到本地磁盤,這個可擴展性不是很好,我們可以把鏡像文件存到中。注查詢網址阿里云的其他參數查詢網址 Docker Registry簡介 Docker Registry是開源的軟件,可以進行存儲和分發Docker鏡像。Docker Registry包括兩個關鍵組成部分:Doc...
摘要:筆主很早就開始用阿里云存儲服務當做自己的圖床了。阿里云對象存儲文檔,本篇文章會介紹到整合阿里云存儲服務實現文件上傳下載以及簡單的查看。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂并且能夠在看完...
摘要:安裝號稱是世界上最流行的私服管理軟件可以搭建幾乎目前所有常見的倉庫如等更是增加了對倉庫的支持應該是搭建私服的唯一選擇有兩個版本和其中版本是免費專業版需要收費對于日常的倉庫管理已經足夠用支持二進制文件安裝和安裝這里選擇安裝簡單方便運行以下命令 安裝 Nexus號稱是世界上最流行的私服管理軟件(The worlds most popular repository),可以搭建幾乎目前所有常見...
摘要:本文章用于描述如何從零開始進行阿里云倉庫的搭建,以及過程中遇到的相關問題。涉及的內容包括,,,,。目標硬盤掛載阿里云額外購買的硬盤服務,需要僅掛載后才可以正常使用。域名代理免費代理的域名通過阿里云域名解析暴露到外網。 本文章用于描述如何從零開始進行阿里云倉庫的搭建,以及過程中遇到的相關問題。涉及的內容包括Docker,Nginx,Nexus,Gitlab,Https。 背景 需要搭建一...
閱讀 2247·2021-11-25 09:43
閱讀 2934·2019-08-30 15:52
閱讀 1885·2019-08-30 15:44
閱讀 974·2019-08-30 10:58
閱讀 752·2019-08-29 18:43
閱讀 3208·2019-08-29 18:36
閱讀 2310·2019-08-29 17:02
閱讀 1447·2019-08-29 17:01