1、背景
在 Docker 中,當(dāng)我們執(zhí)行 docker pull xxx 的時(shí)候,可能會(huì)比較好奇,docker 會(huì)去哪兒查找并下載鏡像呢?
它實(shí)際上是從 registry.hub.docker.com 這個(gè)地址去查找,這就是Docker公司為我們提供的公共倉(cāng)庫(kù),上面的鏡像,大家都可以看到,也可以使用。所以,我們也可以帶上倉(cāng)庫(kù)地址去拉取鏡像,如:docker pull registry.hub.docker.com/library/alpine,不過(guò)要注意,這種方式下載的鏡像的默認(rèn)名稱就會(huì)長(zhǎng)一些。
?如果要在公司中使用 Docker,我們基本不可能把商業(yè)項(xiàng)目上傳到公共倉(cāng)庫(kù)中,那如果要多個(gè)機(jī)器共享,又能怎么辦呢?
正因?yàn)檫@種需要,所以私有倉(cāng)庫(kù)也就有用武之地了。
所謂私有倉(cāng)庫(kù),也就是在本地(局域網(wǎng))搭建的一個(gè)類似公共倉(cāng)庫(kù)的東西,搭建好之后,我們可以將鏡像提交到私有倉(cāng)庫(kù)中。這樣我們既能使用 Docker 來(lái)運(yùn)行我們的項(xiàng)目鏡像,也避免了商業(yè)項(xiàng)目暴露出去的風(fēng)險(xiǎn)。
下面我們用官方提供的registry鏡像來(lái)搭建私有鏡像倉(cāng)庫(kù),當(dāng)然還有其它很多方法。
2、環(huán)境
準(zhǔn)備兩臺(tái)安裝好docker的服務(wù)器:
服務(wù)端機(jī)器 (主機(jī)名為registry):docker私有倉(cāng)庫(kù)服務(wù)器,運(yùn)行registry容器;
測(cè)試端機(jī)器 (主機(jī)名為node):普通的docker服務(wù)器,在這臺(tái)服務(wù)器上下載一個(gè)測(cè)試鏡像nginx,然后上傳到registry服務(wù)器進(jìn)行測(cè)試;
3、部署(服務(wù)端操作)
-
下載鏡像registry
# docker pull registry Using default tag: latest latest: Pulling from library/registry 81033e7c1d6a: Pull complete b235084c2315: Pull complete c692f3a6894b: Pull complete ba2177f3a70e: Pull complete a8d793620947: Pull complete Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54 Status: Downloaded newer image for registry:latest
查看鏡像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 3 months ago 25.8 MB
-
運(yùn)行registry容器
# docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
06a972de6218b1f1c3bf9b53eb9068dc66d147d14e18a89ab51db13e339d3dc9
參數(shù)說(shuō)明
-itd:在容器中打開一個(gè)偽終端進(jìn)行交互操作,并在后臺(tái)運(yùn)行;
-v:把宿主機(jī)的/data/registry目錄綁定 到 容器/var/lib/registry目錄(這個(gè)目錄是registry容器中存放鏡像文件的目錄),來(lái)實(shí)現(xiàn)數(shù)據(jù)的持久化;
-p:映射端口;訪問宿主機(jī)的5000端口就訪問到registry容器的服務(wù)了;
--restart=always:這是重啟的策略,假如這個(gè)容器異常退出會(huì)自動(dòng)重啟容器;
--name registry:創(chuàng)建容器命名為registry,你可以隨便命名;
registry:latest:這個(gè)是剛才pull下來(lái)的鏡像; -
測(cè)試鏡像倉(cāng)庫(kù)中所有的鏡像
# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
現(xiàn)在是空的,因?yàn)椴艅傔\(yùn)行,里面沒有任何鏡像內(nèi)容。
4、測(cè)試鏡像倉(cāng)庫(kù)(測(cè)試端操作)
-
修改源和鏡像倉(cāng)庫(kù)
# vim /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com"] } # systemctl restart docker
-
下載nginx鏡像
# docker pull nginx # docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 719cd2e3ed04 2 weeks ago 109MB
-
為鏡像打標(biāo)簽
# docker tag nginx:latest registry服務(wù)器:5000/nginx:kurisu
格式說(shuō)明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
nginx:lastest
這是源鏡像,也是剛才pull下來(lái)的鏡像文件;
registry服務(wù)器:5000/nginx:kurisu
這是目標(biāo)鏡像,也是registry私有鏡像服務(wù)器的IP地址和端口;查看效果
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry服務(wù)器:5000/nginx kurisu 719cd2e3ed04 2 weeks ago 109MB nginx latest 719cd2e3ed04 2 weeks ago 109MB
-
上傳到鏡像服務(wù)器
# docker push registry服務(wù)器:5000/nginx The push refers to repository [registry服務(wù)器:5000/nginx] Get https://registry服務(wù)器:5000/v2/: http: server gave HTTP response to HTTPS client
這是報(bào)錯(cuò)了,需要https的方法才能上傳,我們可以修改下daemon.json來(lái)解決:
[root@node ~]# vim /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com"], "insecure-registries": [ "registry服務(wù)器:5000"] }
添加私有鏡像服務(wù)器的地址,注意書寫格式為json,有嚴(yán)格的書寫要求,然后重啟docker服務(wù):
# systemctl restart docker
再次上傳:# docker push registry服務(wù)器:5000/nginx The push refers to repository [registry服務(wù)器:5000/nginx] d7acf794921f: Pushed d9569ca04881: Pushed cf5b3c6798f7: Pushed kurisu: digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe size: 948
-
測(cè)試下載鏡像
上傳測(cè)試沒問題了,我們接下來(lái)測(cè)試一下從registry服務(wù)器上下載剛才上傳的busybox鏡像,先刪除node主機(jī)上的鏡像:# docker rmi -f $(docker images -aq) Untagged: registry服務(wù)器:5000/nginx:kurisu Untagged: registry服務(wù)器:5000/nginx@sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe Untagged: nginx:latest Untagged: nginx@sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a Deleted: sha256:719cd2e3ed04781b11ed372ec8d712fac66d5b60a6fb6190bf76b7d18cb50105 Deleted: sha256:e9b6506fb887de50972aefd99d7c5eb56b1a8e757ed953cdfecb86b5359bcb22 Deleted: sha256:55d9d9692a9615a28d183a42bc3881a72a39393feba3664e669e7affb78daa76 Deleted: sha256:cf5b3c6798f77b1f78bf4e297b27cfa5b6caa982f04caeb5de7d13c255fd7a1e
查看一下node主機(jī)上的鏡像全部刪除了:
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE
然后,從registry服務(wù)器上下載nginx鏡像:
# docker pull registry服務(wù)器:5000/nginx:kurisu kurisu: Pulling from nginx fc7181108d40: Pull complete c4277fc40ec2: Pull complete 780053e98559: Pull complete Digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe Status: Downloaded newer image for registry服務(wù)器:5000/nginx:kurisu
查看node主機(jī)上的鏡像:
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry服務(wù)器:5000/nginx kurisu 719cd2e3ed04 2 weeks ago 109MB
查看遠(yuǎn)程倉(cāng)庫(kù)鏡像
- 列出所有鏡像:
# curl http://registry服務(wù)器:5000/v2/_catalog
{"repositories":["nginx"]}
- 列出nginx鏡像有哪些tag:
# curl http://registry服務(wù)器:5000/v2/nginx/tags/list
{"name":"nginx","tags":["kurisu"]}