本章內容較多,請耐心閱讀,閱讀本文之前,請准備兩台雲服務器,或者兩台虛擬機,並且都已經提前裝好docker
一、官方標配:Registry私有鏡像倉庫
Docker Hub作為Docker默認官方公共鏡像,如果想要自己搭建私有鏡像倉庫,官方也提供Registry鏡像,使得我們搭建私有倉庫變得非常簡單。
所謂私有倉庫,也就是在本地(局域網)搭建的一個類似公共倉庫的東西,搭建好之后,我們可以將鏡像提交到私有倉庫中。這樣我們既能使用 Docker 來運行我們的項目鏡像,也避免了商業項目暴露出去的風險。
下面就是詳細的基於Registry搭建私有倉庫的步驟,首先我們可以准備兩台服務器,這里我有兩台Linux服務主機,他們的角色如下:
主機名 角色 備注
192.168.3.250 registry-server 部署registry容器
192.168.3.48 registry-consumer 從registry服務器上下載鏡像使用
1 搭建鏡像倉庫
首先,下載Registry鏡像並啟動
docker pull registry
然后,運行一個Registry鏡像倉庫的容器實例
點擊查看代碼
``` docker run -d -v /opt/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name gerry-registry registry ```最后,在客戶端查看鏡像倉庫中的所有鏡像
curl http://your-server-ip:5000/v2/_catalog
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
最后,開始正式上傳鏡像到服務端鏡像倉庫
docker push your-registry-server-ip:5000/your-image-name:tagname
1.3 下載鏡像
下載鏡像就很簡單了,使用pull命令即可:
docker pull your-server-ip:5000/your-image-name:tagname
如果想要知道要下載的鏡像都有哪些tag(或版本),可以通過下面這個api來獲取:
curl http://your-server-ip:5000/v2/your-image-name/tags/list
二、共享源頭:Docker Hub公共鏡像倉庫
程序員都喜歡用Git,如果把Registry私有倉庫比作GitLab的話,那么Docker Hub公共倉庫就類似於GitHub,這是一個公共的共享的鏡像倉庫平台,我們可以像在GitHub上隨意得clone公共的開源項目一樣pull鏡像到本地。下面就是基於Docker Hub建立公共倉庫的步驟:
2.1 注冊和創建倉庫
首先,你得去docker hub上注冊一個賬號:
這里注冊步驟就不過多介紹了
其次,注冊完成登錄之后就可以創建一個Repository
2.2 客戶端操作
創建完倉庫,我們就可以在客戶端上登錄:
方式一:docker login
方式二:docker login --username=your-account
登錄之后,就可以為鏡像打Tag:
docker tag xdp-service-runtime:2.2 edisonsaonian/xdp-service-runtime:2.2
打完Tag就可以推送到遠程倉庫啦:
docker push edisonsaonian/xdp-service-runtime:2.2
這時,便可以到docker hub上查看Repository的信息,
當然,我們可以在另外的客戶端上拉取這個剛剛上傳的鏡像了
三、企業最愛:Harbor企業級鏡像倉庫
Harbor是VMware公司開源的一個企業級Docker Registry項目,項目地址:https://github.com/goharbor/harbor
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.matt.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
(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的企業級特性更加適合此類型的團隊使用。