1. 程式人生 > >docker 倉庫及鏡像的上傳下載

docker 倉庫及鏡像的上傳下載

ont left address 由於 重新啟動 serve 編輯 效果 格式

Docker 倉庫

倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混為一談,並不嚴格區分。實際上,倉庫註冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。

一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。

倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

當用戶創建了自己的鏡像之後就可以使用

push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。

一、搭建私有倉庫

下載registry鏡像

docker pull registry

下載完之後通過該鏡像啟動一個容器

[root@foundation12 ~]# docker run -d -p 5000:5000 --name registry registry:2.3.1
技術分享圖片

查看,端口已打開

技術分享圖片

查看存在鏡像

[root@foundation12 ~]# docker images
技術分享圖片



使用 docker tag 將 game2048 這個鏡像標記為 localhost:5000/game2048

格式為 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]


[root@foundation12 ~]# docker tag game2048 localhost:5000/game2048 給已存在的鏡像打上tag

技術分享圖片

[root@foundation12 ~]# docker images

技術分享圖片


使用 docker push 上傳標記的鏡像

[root@foundation12 ~]# docker push localhost:5000/game2048

技術分享圖片


curl 查看倉庫中的鏡像

[root@foundation12 ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["game2048"]}

以看到

{"repositories":["game2048"]},表明鏡像已經被成功上傳了


先刪除已有鏡像,再嘗試從私有倉庫中下載這個鏡像

[root@foundation12 ~]# docker rmi localhost:5000/game2048


技術分享圖片


拉取鏡像

[root@foundation12 ~]# docker pull localhost:5000/game2048

技術分享圖片

[root@foundation12 ~]# docker image ls

技術分享圖片


如果你不想使用 127.0.0.1:5000 作為倉庫地址,比如想讓本網段的其他主機也能把鏡像推送到私有倉庫。你就得把例如 192.168.122.1:5000 這樣的內網地址作為私有倉庫地址,這時你會發現無法成功推送鏡像。

這是因為 Docker 默認不允許非 HTTPS 方式推送鏡像。我們可以通過 Docker 的配置選項來取消這個限制,或者查看下一節配置能夠通過 HTTPS 訪問的私有倉庫。


再次上傳一個鏡像

技術分享圖片


技術分享圖片


這個問題可能是由於客戶端采用https,docker registry未采用https服務所致。一種處理方式是把客戶對地址“192.168.1.100:5000”請求改為http。

目前很多文章都是通過修改docker的配置文件“etc/systemconfig/docker",重啟docker來解決這個問題。但發現docker1.12.3版本並無此文件,根據網上創建此文件,並填入相應內容,重啟docker無效果,仍然報此錯誤。


解決方法:

在”/etc/docker/“目錄下,創建”daemon.json“文件。在文件中寫入:

{ "insecure-registries":["192.168.122.1:5000"] }

保存退出後,重啟docker。


編輯daemon文件 ,寫入本地ip和端口

[root@foundation12 docker]# vim daemon.json

技術分享圖片


重起服務 ,手動開啟registry

技術分享圖片

再次上傳

[root@foundation12 docker]# docker push 192.168.122.1:5000/nginx
技術分享圖片

關閉和刪除

技術分享圖片


二、生成自簽名證書


在服務器主機上生成自簽名證書,創建一個文件夾用於存放證書

[root@foundation12 docker]# pwd
/tmp/docker
[root@foundation12 docker]# mkdir certs
[root@foundation12 docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
Generating a 4096 bit RSA private key
................................................................................++
................................................................................++
writing new private key to 'certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shaanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:cara
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:mycara.com
Email Address []:[email protected]


certs文件夾就可以看到生成兩個文件

技術分享圖片


運行倉庫鏡像

[root@foundation12 docker]# docker run -d \
> --restart=always \
> --name registry \
> -v `pwd`/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
> -p 443:443 \
> registry:2.3.1


如下,容器啟動,端口打開
技術分享圖片


域名要有解析

[root@foundation12 docker]# vim /etc/hosts
技術分享圖片

配置客戶端

我做實驗的是一臺服務器,所以均在一臺主機上進行配置的。

如果你的服務器作為Docker倉庫使用,客戶端在另一臺主機上作為客戶端來上傳或拉取鏡像,則如下操作本應在客戶端執行;


創建目錄

[root@foundation12 certs]# mkdir -p /etc/docker/certs.d/mycara.com/
[root@foundation12 certs]# cp domain.crt /etc/docker/certs.d/mycara.com/ 服務器端生成的的.crt復制到客戶端服務器的/etc/docker/certs.d/mycara.com/ 目錄下

將打了tag的鏡像上傳

[root@foundation12 certs]# docker tag game2048 mycara.com/game2048
[root@foundation12 certs]# docker push mycara.com/game2048
技術分享圖片

拉取鏡像

[root@foundation12 certs]# docker pull mycara.com/game2048
技術分享圖片


刪除原啟動的倉庫容器,做下面實驗

技術分享圖片


三、私有倉庫認證

創建存放密碼賬號的文件

[root@foundation12 docker]# mkdir auth 建立目錄
[root@foundation12 docker]# ls
auth certs
[root@foundation12 docker]# docker run \
> --entrypoint htpasswd \
> registry:2.3.1 -Bbn admin cara > auth/htpasswd

[root@foundation12 docker]# cd auth/
[root@foundation12 auth]# ls
htpasswd
[root@foundation12 auth]# cat htpasswd
admin:$2y$05$LIb4zTANf0KCSPw0IrL2zOqO9zth5XpOYpdJRh/VTcILfX3hgU0P.

重新啟動容器


[root@foundation12 opt]# docker run -d --restart=always --name registryauth -v /tmp/docker/certs:/certs -v /opt/registryauth:/var/lib/registry -v /tmp/docker/auth:/auth -e REGISTRY_AUTH=htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2.3.1
9b12ab89f5a4c0434bad1b09e7bbde24c7c6a3d02a94d928719e85ff41c15339

技術分享圖片


現在客戶端再pull、push就會提示報錯,無法提交,需要登錄私有倉庫

技術分享圖片

[root@foundation12 opt]# docker tag nginx mycara.com/nginx
[root@foundation12 opt]# docker login -u admin -p cara mycara.com 登錄

Login Succeeded
[root@foundation12 opt]# cd
[root@foundation12 ~]# cd .docker/
[root@foundation12 .docker]# ls
config.json
[root@foundation12 .docker]# cat config.json
{
"auths": {
"mycara.com": {
"auth": "YWRtaW46Y2FyYQ=="
}
}
}



上傳成功

[root@foundation12 .docker]# docker push mycara.com/nginx
The push refers to a repository [mycara.com/nginx]
5f70bf18a086: Pushed
3f3324023e75: Pushed
f0d7d68f89e5: Pushed
917c0fc99b35: Pushed
latest: digest: sha256:e59bbe13ca0c309644d9bca972c1b660c170fbdee7ff81eda9ff966b86f14e63 size: 1978
[root@foundation12 .docker]# cd /opt/registryauth/docker/registry/v2/repositories/
[root@foundation12 repositories]# ls
nginx



退出登錄

[root@foundation12 opt]# docker logout mycara.com
技術分享圖片




docker 倉庫及鏡像的上傳下載