1. 理解Registry
一個(gè)registry是一個(gè)存儲(chǔ)和內(nèi)容交付系統(tǒng),其中維護(hù)著若干命名的Docker鏡像,這些鏡像有不同的標(biāo)記版本。(例如:有一個(gè)鏡像名字叫 hello/world,它有兩個(gè)tags分別是2.0和2.1)
用戶通過(guò)使用 docker push 和 docker pull 命令與 registry 進(jìn)行交互。(例如:docker pull registry-1.docker.io/hello/world:2.1)
A registry is a storage and content delivery system, holding named Docker images, available in different tagged versions. Users interact with a registry by using docker push and pull commands.
前面說(shuō)了,registry是一個(gè)存儲(chǔ)系統(tǒng),它存儲(chǔ)的是Docker鏡像。那么,鏡像到底存到哪里呢?存儲(chǔ)本身委托給驅(qū)動(dòng)程序。默認(rèn)的存儲(chǔ)驅(qū)動(dòng)程序是本地posix文件系統(tǒng),還支持其它基于云的存儲(chǔ)驅(qū)動(dòng)程序,例如 Aliyun OSS
由于保護(hù)對(duì)托管映像的訪問(wèn)至關(guān)重要,因此Registry本身支持TLS和基本身份驗(yàn)證。
1.1. 理解鏡像命名
docker pull ubuntu 指示docker從官方Docker Hub中拉取一個(gè)名字叫ubuntu的鏡像。這條命令其實(shí)是docker pull docker.io/library/ubuntu的簡(jiǎn)寫
docker pull myregistrydomain:port/foo/bar 指示docker拉取位于myregistrydomain:port的鏡像foo/bar
1.2. 用例
運(yùn)行你自己的Registry是與CI/CD系統(tǒng)集成并對(duì)其進(jìn)行補(bǔ)充的絕佳解決方案。在典型的工作流程中,對(duì)源版本控制系統(tǒng)的提交將觸發(fā)在CI系統(tǒng)上的構(gòu)建,如果構(gòu)建成功,則將新鏡像推送到你的Registry。然后,來(lái)自Registry的通知將觸發(fā)在暫存環(huán)境上的部署,或者通知其它系統(tǒng)有一個(gè)新鏡像可用。
如果要在大型計(jì)算機(jī)集群上快速部署新鏡像,它也是必不可少的組件。
這也是在隔離的網(wǎng)絡(luò)中分發(fā)鏡像的最佳方法。
2. 部署一個(gè)registry server
# Run a local registry docker run -d -p --restart=always --name registry registry:2
2.1. Copy an image from Docker Hub to your registry
你可以從Docker Hub上拉取一個(gè)鏡像,并把它推送到你自己的Registry上。下面的例子中,從Docker Hub上拉取鏡像ubuntu:16.04,并將其重新打標(biāo)記為my-ubuntu,然后將其推送到本地registry,最后,再將ubuntu:16.04和my-ubuntu刪除。
# 1. Pull the ubuntu:16.04 image from Docker Hub docker pull ubuntu:16.04 # 2. Tag the image as localhost:5000/my-ubuntu # (注意,當(dāng)tag的第一部分是主機(jī)名和端口時(shí),push時(shí)Docker會(huì)將其解釋為registry的位置) docker tag ubuntu:16.04 localhost:5000/my-ubuntu # 3. Push the image to the local registry running at localhost:5000 docker push localhost:5000/my-ubuntu # 4. Remove the locally-cached ubuntu:16.04 and localhost:5000/my-ubuntu images, so that you can test pulling the image from your registry. This does not remove the localhost:5000/my-ubuntu image from your registry. docker image remove ubuntu:16.04 docker image remove localhost:5000/my-ubuntu # 5. Pull the localhost:5000/my-ubuntu image from your local registry docker pull localhost:5000/my-ubuntu
停止本地registry
# stop the registry docker container stop registry # remove the container docker container stop registry && docker container rm -v registry
3. 基本配置
為了配置container,可以給docker run命令指定額外的選項(xiàng)參數(shù)
# 自動(dòng)重啟registry # -p選項(xiàng)的值,第一個(gè)是主機(jī)端口,第二個(gè)是容器端口。在容器中,registry默認(rèn)監(jiān)聽端口是5000 docker run -d -p 5000:5000 --restart=always --name registry registry:2 # 自定義存儲(chǔ)位置 docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/registry:/var/lib/registry registry:2
3.1. 運(yùn)行一個(gè)外部可訪問(wèn)的registry
運(yùn)行一個(gè)僅在本地主機(jī)上可訪問(wèn)的registry沒(méi)有什么用處,為了使你的registry可供外部主機(jī)訪問(wèn),必須首先使用TLS保護(hù)registry。
下面是一個(gè)將registry作為服務(wù)來(lái)運(yùn)行的例子:
首先,獲得一個(gè)證書
假設(shè)你的registry的URL是https://myregistry.domain.com/,同時(shí)假設(shè)的DNS,路由和防火墻設(shè)置允許通過(guò)端口443訪問(wèn)registry的主機(jī),再假設(shè)你已經(jīng)從CA那里獲得一個(gè)證書。
那么,接下來(lái)
創(chuàng)建一個(gè)certs目錄
從CA那里復(fù)制.crt和.key文件到certs目錄,假設(shè)分別重命名為domain.crt和domain.key
重啟registry,將其指向使用TLS證書
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
現(xiàn)在Docker客戶端就可以通過(guò)registry的外網(wǎng)地址進(jìn)行pull和push了
docker pull ubuntu:16.04 docker tag ubuntu:16.04 myregistry.domain.com/my-ubuntu docker push myregistry.domain.com/my-ubuntu docker pull myregistry.domain.com/my-ubuntu
將registry作為一個(gè)服務(wù)運(yùn)行
與獨(dú)立容器相比,swarm services具有多個(gè)優(yōu)點(diǎn)。它們使用聲明式模型,這意味著你定義了所需的狀態(tài),而Docker則將服務(wù)保持在該狀態(tài)。服務(wù)提供了自動(dòng)負(fù)載平衡擴(kuò)展,并具有控制服務(wù)分配的能力以及其他優(yōu)勢(shì)。服務(wù)還允許你秘密存儲(chǔ)敏感數(shù)據(jù),例如TLS證書。
下面這個(gè)例子將registry作為單副本服務(wù)啟動(dòng),可以在端口80上的任何群集節(jié)點(diǎn)上訪問(wèn)該registry,并假定使用的是與前面示例相同的TLS證書。
# 首先,保存TLS證書和key作為secret docker secret create domain.crt certs/domain.crt docker secret create domain.key certs/domain.key # 接下來(lái),將你想要在上面允許registry的node添加一個(gè)標(biāo)簽 docker node update --label-add registry=true node1 # 再接著,創(chuàng)建一個(gè)服務(wù),并授權(quán)它可以訪問(wèn)兩個(gè)secret,并將其限制為僅在標(biāo)簽為registry=true的節(jié)點(diǎn)上運(yùn)行 docker service create --name registry --secret domain.crt --secret domain.key --constraint 'node.labels.registry==true' --mount type=bind,src=/mnt/registry,dst=/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/run/secrets/domain.crt -e REGISTRY_HTTP_TLS_KEY=/run/secrets/domain.key --publish published=443,target=443 --replicas 1 registry:2
現(xiàn)在你可以在任何swarm節(jié)點(diǎn)的443端口上訪問(wèn)服務(wù)。Docker會(huì)將請(qǐng)求發(fā)送到運(yùn)行該服務(wù)的節(jié)點(diǎn)。
4. 文檔
# 啟動(dòng)registry docker run -d -p 5000:5000 --name registry registry:2 # 從Docker Hub上拉取鏡像 docker pull ubuntu # 給鏡像打tag docker image tag ubuntu localhost:5000/myfirstimage # 推送至你自己的registry docker push localhost:5000/myfirstimage # 再次從你自己的registry拉取鏡像 docker pull localhost:5000/myfirstimage # 停止registry并刪除所有數(shù)據(jù) docker container stop registry && docker container rm -v registry
https://docs.docker.com/regis...
https://docs.docker.com/regis...
掃碼二維碼 獲取免費(fèi)視頻學(xué)習(xí)資料
- 本文固定鏈接: http://www.wangchenghua.com/post/7584/
- 轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載必須在正文中標(biāo)注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費(fèi)視頻資料