編程學(xué)習(xí)網(wǎng) > PHP技術(shù) > php高級(jí) > Docker Registry的最強(qiáng)實(shí)踐
2020
11-07

Docker Registry的最強(qiáng)實(shí)踐

attachments-2020-11-2LuK1gvl5fa60257f0425.png

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í)資料

Python編程學(xué)習(xí)

查 看2022高級(jí)編程視頻教程免費(fèi)獲取