Docker 倉庫


一、官方標配:Registry私有鏡像倉庫

  Docker Hub作為Docker默認官方公共鏡像,如果想要自己搭建私有鏡像殘酷,官方也提供Registry鏡像,使得我們搭建**私有倉庫**變得非常簡單。

  所謂**私有倉庫**,也就是在本地(局域網)搭建的一個類似公共倉庫的東西,搭建好之后,我們可以將鏡像提交到私有倉庫中。這樣我們既能使用 Docker 來運行我們的項目鏡像,也避免了商業項目暴露出去的風險。

  下面就是詳細的基於Registry搭建私有倉庫的步驟,首先我們可以准備兩台服務器,這里我有兩台Linux服務主機,他們的角色如下:

主機名 角色 備注
192.168.3.250 registry-server 部署registry容器
192.168.3.48 registry-consumer 從registry服務器上下載鏡像使用

1.1 搭建鏡像倉庫

  首先,下載Registry鏡像並啟動

docker pull registry

  img

  然后,運行一個Registry鏡像倉庫的容器實例

docker run -d -v /opt/images/registry:/var/lib/registry \
-p 5000:5000 \
--restart=always \
--name gerry-registry registry \

  img

  最后,在客戶端查看鏡像倉庫中的所有鏡像

curl http://your-server-ip:5000/v2/_catalog

  img

  這里返回的json數據代表暫無任何倉庫,因為我們還沒有上傳任何鏡像。

1.2 上傳鏡像

  首先,為了讓客戶端服務器能夠快速地訪問剛剛在服務端搭建的鏡像倉庫(默認情況下是需要配置HTTPS證書的),這里簡單在客戶端配置一下私有倉庫的可信任設置讓我們可以通過HTTP直接訪問:# vim /etc/docker/daemon.json

  加上下面這一句,這里的“your-server-ip”請換為你的服務器的外網IP地址:

{ 
    "insecure-registries" : [ "your-server-ip:5000" ] 
}

PS:如果不設置可信任源,又沒有配置HTTPS證書,那么會遇到這個錯誤:**error: Get https://ip:port/v1/_ping: http: server gave HTTP response to HTTPS client.**

  為了使得配置生效,重新啟動docker服務:# systemctl restart docker

  其次,為要上傳的鏡像打Tag

docker tag your-image-name:tagname your-server-ip:5000/your-image-name:tagname

  img

  最后,開始正式上傳鏡像到服務端鏡像倉庫

docker push your-registry-server-ip:5000/your-image-name:tagname

  img

  這時我們可以再次通過訪問API驗證鏡像倉庫的內容:

  img

1.3 下載鏡像

  下載鏡像就很簡單了,使用pull命令即可:

docker pull your-server-ip:5000/your-image-name:tagname

  示例:

  img

  如果想要知道要下載的鏡像都有哪些tag(或版本),可以通過下面這個api來獲取:

curl http://your-server-ip:5000/v2/your-image-name/tags/list

  img

二、共享源頭:Docker Hub公共鏡像倉庫

  程序員都喜歡用Git,如果把Registry私有倉庫比作GitLab的話,那么Docker Hub公共倉庫就類似於GitHub,這是一個公共的共享的鏡像倉庫平台,我們可以像在GitHub上隨意得clone公共的開源項目一樣pull鏡像到本地。下面就是基於Docker Hub建立公共倉庫的步驟:

2.1 注冊和創建倉庫

  首先,你得去docker hub上注冊一個賬號

  image-20210906110107525

  其次,注冊完成登錄之后就可以創建一個Repository,例如這里我創建了一個名為xdp-service-runtime的倉庫:

  image-20210906110134054

2.2 客戶端操作

  創建完倉庫,我們就可以在客戶端上登錄:

方式一:docker login
方式二:docker login --username=your-account

  img

  登錄之后,就可以為鏡像打Tag:

docker tag xdp-service-runtime:2.2 edisonsaonian/xdp-service-runtime:2.2

  img

  打完Tag就可以推送到遠程倉庫啦:

docker push edisonsaonian/xdp-service-runtime:2.2

  img

  這時,便可以到docker hub上查看Repository的信息:

  img

  當然,我們可以在另外的客戶端上拉取這個剛剛上傳的鏡像了:

  img

  怎么樣,是不是很Easy,**Enjoy**!

三、企業最愛:Harbor企業級鏡像倉庫

  Harbor是VMware公司開源的一個企業級Docker Registry項目,項目地址:https://github.com/goharbor/harbor

  img

  Harbor作為一個企業級私有Registry服務器,提供了更好的性能和安全,提升了用戶使用Registry構建和運行環境傳輸鏡像的效率。雖然Harbor和Registry都是私有鏡像倉庫的選擇,但是Harbor的企業級特性更強,因此也是更多企業級用戶的選擇。

  Harbor實現了基於角色的訪問控制機制,並通過項目來對鏡像進行組織和訪問權限的控制,也常常和K8S中的namespace結合使用。此外,Harbor還提供了圖形化的管理界面,我們可以通過瀏覽器來瀏覽,檢索當前Docker鏡像倉庫,管理項目和命名空間。

  有關Harbor的架構,可以參考閱讀這一篇《Harbor整體架構》一文,里面講述了Harbor的6大核心組件構成,有興趣的朋友可以一讀。

  下面列出了Harbor的搭建過程,主要參考自Harbor的github文檔:

3.1 一些准備工作

  (1)下載離線安裝包

  Harbor提供了兩種安裝方式:一種是在線安裝包,因此包很小;另一種是離線安裝包,因此包很大(>=570MB)。這里選擇下載離線安裝包,下載地址:https://github.com/goharbor/harbor/releases

  這里選擇版本為***v1.7.0***,下載完成后傳輸到你的服務器上並解壓:

tar zvxf harbor-offline-installer-v1.7.0.tgz

  (2)安裝docker

  如果還沒有安裝docker,那么請先安裝docker,已安裝則跳過。

# yum install docker
# systemctl start docker.service

  (3)安裝docker-compose

  這里選擇Github源:

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

  驗證:

docker-compose -version

  img

 ***PS:***如果想要卸載docker-compose,請執行以下命令

sudo rm /usr/local/bin/docker-compose

3.2 自簽TLS證書

  雖然對於所有要求配置HTTPS的要求我都是比較抵觸的,不過考慮到去年公司官網被攻擊並且還被Google列入黑名單導致公司官網好幾天不可用,我們信息中心遭受了很大的壓力,因此還是老老實實地為所有有需要的地方配上HTTPS吧。當然,這里演示的只是我們自己創建的證書,實際生產環境中我們切記還是需要去阿里雲或者其他雲服務器廠商申請免費或收費的證書。

  此小節內容主要參考自Harbor的HTTPS配置文檔

  (1)創建存放證書的目錄

mkdir -p /data/cert/
cd   /data/cert/

  (2)創建自簽名證書key文件並生成證書請求:

  ***注意:***這里reg.edisonedu.com需要替換為你的域名,我這里是隨便取的,會在后面更改DNS。

openssl genrsa -out reg.edisonedu.com.key 4096
openssl req -x509 -new -nodes -sha512 -days 365 \
    -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=reg.edisonedu.com" \
    -key reg.edisonedu.com.key \
    -out reg.edisonedu.com.crt

3.3 Harbor安裝與配置

  在解壓的harbor目錄中編輯harbor.cfg文件,修改以下內容:

......
#hostname = 192.168.3.243
hostname = www.gerry.com
ui_url_protocol = https
ssl_cert = /data/cert/reg.edisonedu.com.crt
ssl_cert_key = /data/cert/reg.edisonedu.com.key
harbor_admin_password = admin
......

  以上只是一些最基本的配置,你還可以配置例如SMTP郵件的設置,可以自己去摸索。

  接下來就是執行准備這個harbor.cfg了,在harbor目錄下執行以下命令:

./prepare

  然后再執行install這個shell腳本進行install:

./install.sh

  它會經歷好幾個步驟:加載Harbor鏡像(初次安裝耗時較長)、准備運行環境、通過docker-compose啟動harbor(有興趣的童鞋可以看看harbor目錄下的docker-compose.yml文件)等。

  我們可以通過docker-compose ps命令查看啟動起來的docker實例:

  img

  可以看到,整個harbor容器實例群包括了管理服務、數據庫服務、Job服務、日志服務以及Portal網頁入口(默認是80端口)服務等。

  為了能在你的開發機上能夠訪問到我們這個域名,你需要改一下Windows的hosts文件(C:/Windows/System32/drivers/etc/hosts),如果你用的阿里雲,那么你可能還需要開放一下端口號,80和443端口:

# your server ip
192.168.3.243 www.gerry.com

  這下我們可以在本地開發機上打開瀏覽器訪問reg.edisonedu.com了,可以看到Harbor的管理平台登錄頁面了:

  img

  使用剛剛在配置文件里面配置的密碼登錄之后,可以看到如下管理界面:

  img

  為了進行后面的演示,這里我們創建一個私有項目:

  img

  然后再創建一個項目管理員用戶:

  img

  最后,為test項目添加新創建的這個用戶作為項目管理員(由於我們后續會演示鏡像上傳,所以這里設為管理員,如果只是拉取鏡像,可以設為開發人員角色,如果只是看看那可以只設置為游客角色):

  img

  接下來我們就會在另一台主機中訪問這台服務器上部署的Harbor私有鏡像倉庫了。

3.4 Docker主機訪問Harbor

  (1)首先,由於我們這里是自簽證書,不是受信任的,所以我們要做一些准備工作才能在普通主機上訪問到剛剛部署的Harbor鏡像倉庫。(注意:這一部分的操作在另外的一台主機上,非我們剛剛部署的Harbor的服務器上面)

  准備工作一:創建Harbor服務域名的證書文件夾

mkdir /etc/docker/certs.d/reg.edisonedu.com -p

  准備工作二:設置Hosts匹配我們設置的假域名

vim /etc/hosts

  加上一行:

47.22.232.200 reg.edisonedu.com #替換為你的Harbor服務器外網IP

  准備工作三:將Harbor服務器上的證書拷貝要訪問Harbor倉庫的主機上

  這一工作你可以選擇直接通過SFTP軟件將reg.edisonedu.com.crt從Harbor服務器上拷貝到客戶機剛剛創建的文件夾中(/etc/docker/certs.d/reg.edisonedu.com

),也可以通過scp命令去拷貝,總之拷貝過來就行。這里我通過scp去拷貝:

scp root@47.22.232.200:/data/cert/reg.edisonedu.com.crt /etc/docker/certs.d/reg.edisonedu.com

  (2)其次,登錄到Harbor鏡像倉庫(由於Docker的默認源是docker hub,所以剛剛我們需要改host,這里需要登錄自己的源倉庫)

docker login reg.edisonedu.com

  (3)然后,就跟剛剛我們在docker hub中的步驟一樣了,假設我們要push一個鏡像到鏡像倉庫,首先打個Tag:

docker tag xdp-service-runtime:2.2 reg.edisonedu.com/test/xdp-service-runtime:2.2

  ***PS:***這里我們打的tag加上了私有項目名test

  打完Tag,就可以push到鏡像倉庫了:

docker push reg.edisonedu.com/test/xdp-service-runtime:2.2

  推送完后,我們可以到Harbor的Web管理界面中驗證:

  img

  img

  (4)推送完之后,我們想在其他docker主機中pull下來呢?

docker pull reg.edisonedu.com/test/xdp-service-runtime:2.2

  (5)如果想退出我們的私有倉庫

docker logout reg.edisonedu.com

3.5 其他補充

  如果想要繼續更改harbor配置,那么改完后需要重新初始化Harbor:

docker-compose down -v # 暫停Harbor實例群
./prepare  # 生成配置文件,根據 harbor.cfg 配置生成docker-compose文件。
docker-compose up -d  # 后台啟動Harbor實例群

  想要暫停和重啟Harbor:

docker-compose  stop # 暫停 Harbor
docker-compose  start # 啟動 Harbor

  不用Harbor了,那么可以徹底刪除Harbor的數據和鏡像文件:

# 徹底地刪除 Harbor 的數據和鏡像
 rm -r /data/database
 rm -r /data/registry

四、小結

 本文總結了流行的幾個鏡像倉庫的搭建步驟,並給出了基本使用示例。個人感覺:對於個人開發者或開源社區而言,docker hub主要提供的是類似於github的共享公共倉庫(當然docker hub也有提供私有倉庫)。對於小團隊而言,官方提供的Registry項目可以幫助小團隊快速地構建起自己的鏡像倉庫把精力更多放在快速迭代上面。而對於中大規模的團隊,Harbor的企業級特性更加適合此類型的團隊使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM