天天看點

Docker部署私有倉庫(registry&Harbor)

倉庫(Repository)是集中存放鏡像的地方。

一個容易混淆的概念是注冊伺服器(registry)。實際上注冊伺服器是管理倉庫的具體伺服器,每個伺服器上可以有多個倉庫,而每個倉庫下面有多個鏡像。從這方面來說,倉庫可以被認為是一個具體的項目或目錄。例如對于倉庫位址docker.sina.com.cn/centos:centos7來說,docekr.sian.com.cn是注冊伺服器位址,centos是倉庫名,centos7是倉庫的tag(标簽)。

Docker Hub 官方倉庫

目前docker官方維護了一個公共倉庫,Docker Hub,其中已經包括了超過1500的鏡像。大部分需求,都可以通過在Docker Hub中直接下載下傳鏡像來實作。

部署私有倉庫:

1, 通過官方的registry鏡像來部署私有倉庫:

項目環境:

兩台主機(centos7):docker01:172.16.1.30

docker02:172.16.1.40**

docker01:

(1)基于registry鏡像運作一個容器:

[root@sqm-docker01 ~]# docker run -d --name registry --restart=always -p 5000:5000 -v /data/registry:/var/lib/registry registry:latest

參數說明:
#registry服務預設監聽的是5000端口
-v = --volume 資料卷,進行一個挂載:主控端:容器内           

(2)命名私有倉庫鏡像:

##如果不對私有倉庫命名的話,預設走的是公共倉庫(docker hub),是以需要命名鏡像。

私有倉庫鏡像的命名規則:主控端ip位址:端口号/xxxx(需要更改的名稱)

以nignx鏡像為例,下載下傳nginx鏡像:

[root@sqm-docker01 ~]# docker pull nginx

[root@sqm-docker01 ~]# docker tag  nginx:latest 172.16.1.30:5000/nginx:latest           

注意:當你對源鏡像(nginx:latest)進行命名後,命名後的鏡像名稱也視為一個标簽,因為id号是相同的。

如果當源鏡像(nginx:latest)删除,命名後的鏡像依然會存在,因為删除的是一個标簽。

(3)修改docker主配置檔案:

[root@sqm-docker01 ~]# vim /usr/lib/systemd/system/docker.service

指定本地倉庫的ip位址+端口号:

Docker部署私有倉庫(registry&Harbor)

重新加載程序并重新開機docker服務:

[root@sqm-docker01 ~]# systemctl daemon-reload
[root@sqm-docker01 ~]# systemctl restart docker           

(4)将本地鏡像push到私有倉庫中:

[root@sqm-docker01 ~]# docker push 172.16.1.30:5000/nginx:latest

Docker部署私有倉庫(registry&Harbor)

//檢視私有倉庫中的鏡像:

[root@sqm-docker01 ~]# curl 172.16.1.30:5000/v2/_catalog
{"repositories":["nginx"]}           

//檢視倉庫中鏡像的标簽:

[root@sqm-docker01 ~]#  curl 172.16.1.30:5000/v2/nginx/tags/list
{"name":"nginx","tags":["latest"]}           

//如果需要删除私有倉庫中的鏡像,因為我有嘗試用官方的第三方工具(deletedockerregistryimage)來進行删除鏡像,但最終并沒有把倉庫中的鏡像删除。是以我采取在運作registry時挂載在本地的目錄[/data/registry]中,找到指定的鏡像存放的目錄來進行删除。

[root@sqm-docker01 ~]# cd /data/registry/docker/registry/v2/
[root@sqm-docker01 v2]# ls
blobs  repositories
[root@sqm-docker01 v2]# cd repositories/
[root@sqm-docker01 repositories]# ls
nginx
[root@sqm-docker01 repositories]# rm -rf nginx/           
删除後再次檢視私有倉庫中的鏡像是否還存在:
[root@sqm-docker01 ~]# curl http://172.16.1.30:5000/v2/_catalog
{"repositories":[]}           

可以看到倉庫中的鏡像已被成功删除。

docker02:

連接配接docker01,從docker01的倉庫中拉取鏡像:(記得先把鏡像上傳到私有倉庫中)

(1)修改docker的配置檔案:

[root@sqm-docker02 ~]# vim /usr/lib/systemd/system/docker.service

Docker部署私有倉庫(registry&Harbor)

重新開機docker服務:

[root@sqm-docker02 ~]# systemctl daemon-reload
[root@sqm-docker02 ~]# systemctl restart docker           

(2)從私有倉庫中拉取鏡像:

[root@sqm-docker02 ~]# docker pull 172.16.1.30:5000/nginx

#使用pull指令進行拉取

Docker部署私有倉庫(registry&Harbor)

(3)部署nginx服務:

[root@sqm-docker02 ~]# mkdir html
[root@sqm-docker02 ~]# echo "welcome to nginx web" > html/index.html           

[root@sqm-docker02 ~]# docker run -itd --name nginx -p 80:80 -v /root/html:/usr/share/nginx/html 172.16.1.30:5000/nginx

Docker部署私有倉庫(registry&Harbor)

通路nginx頁面:

Docker部署私有倉庫(registry&Harbor)

2,部署Harbor(哈勃)私有倉庫:

registry是官方的一個私有倉庫,而harbor是第三方的一個私有倉庫。

(1)下載下傳compose:

安裝依賴:

[root@sqm-docker01 ~]# yum -y install yum-utils device-mapper-persistent-data lvm2

從github官網上進行下載下傳:

URL:https://github.com/docker/compose/releases

Docker部署私有倉庫(registry&Harbor)
Docker部署私有倉庫(registry&Harbor)

[root@sqm-docker01 ~]# curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-

uname -s

-

uname -m

-o /usr/local/bin/docker-compose

[root@sqm-docker01 ~]# chmod +x /usr/local/bin/docker-compose

檢視compose版本:

[root@sqm-docker01 ~]# docker-compose -version
docker-compose version 1.24.0, build 0aa59064           

(2)下載下傳harbor安裝包并進行解壓:

[root@sqm-docker01 ~]# tar zxf harbor-offline-installer-v1.7.4.tgz -C /usr/local/
[root@sqm-docker01 ~]# cd /usr/local/harbor/           
Docker部署私有倉庫(registry&Harbor)

編寫harbor配置檔案:

[root@sqm-docker01 harbor]# vim harbor.cfg

Docker部署私有倉庫(registry&Harbor)

執行腳本:

[root@sqm-docker01 harbor]# ./install.sh

Docker部署私有倉庫(registry&Harbor)

進入網站:使用者admin,密碼:Harbor12345(在harbor配置檔案中可以檢視到)

URL:http://172.16.1.30

[root@sqm-docker01 harbor]# vim harbor.cfg

Docker部署私有倉庫(registry&Harbor)
Docker部署私有倉庫(registry&Harbor)

登陸界面如下:

Docker部署私有倉庫(registry&Harbor)

(3)我們在網頁上建立一個項目:

Docker部署私有倉庫(registry&Harbor)
Docker部署私有倉庫(registry&Harbor)
Docker部署私有倉庫(registry&Harbor)

##修改docker配置檔案:

[root@sqm-docker01 ~]# vim /usr/lib/systemd/system/docker.service

Docker部署私有倉庫(registry&Harbor)

//重新加載docker:

[root@sqm-docker01 ~]# systemctl daemon-reload
[root@sqm-docker01 ~]# systemctl restart docker           

//重新開機compose:

注意:因為剛剛已經重新開機了docker服務,是以我們需要将所有容器給重新啟動。

[root@sqm-docker01 harbor]# docker ps -a -q | xargs docker start

[root@sqm-docker01 harbor]# docker-compose stop

Docker部署私有倉庫(registry&Harbor)

[root@sqm-docker01 harbor]# docker-compose start

Docker部署私有倉庫(registry&Harbor)

(4)在本地終端上連接配接harbor:

[root@sqm-docker01 harbor]# docker login -u admin -p Harbor12345 172.16.1.30:80

Docker部署私有倉庫(registry&Harbor)

(5)将需要上傳到harbor私有倉庫的鏡像進行push:

#例如将本地的一個nginx鏡像指令并且push到倉庫:

[root@sqm-docker01 harbor]# docker tag nginx:latest 172.16.1.30:80/sunqiuming/nginx:latest

[root@sqm-docker01 harbor]# docker push 172.16.1.30:80/sunqiuming/nginx:latest

#push到剛才在網頁上建立的項目

Docker部署私有倉庫(registry&Harbor)

push成功後,我們在網頁上進行檢視:

Docker部署私有倉庫(registry&Harbor)
Docker部署私有倉庫(registry&Harbor)

docker02進行連接配接harbor:

(1)為了在docker02不再進入配置檔案進行修改,将docker01上的docker配置檔案拷貝給docker02:

#免密登陸:

[root@sqm-docker01 ~]# ssh-keygen

Docker部署私有倉庫(registry&Harbor)

[root@sqm-docker01 ~]# ssh-copy-id 172.16.1.40

[root@sqm-docker01 ~]# scp /usr/lib/systemd/system/docker.service [email protected]:/usr/lib/systemd/system/docker.service

[root@sqm-docker02 ~]# systemctl daemon-reload

[root@sqm-docker02 ~]# systemctl restart docker

(2)連接配接harbor私有倉庫:

Docker部署私有倉庫(registry&Harbor)