上一篇我們自己通過編寫Dockerfile來編譯部署一個ASP.NET MVC應用程式到Windows Container,這一篇我們來試著將.NET 4.x的映象推送到harbor私有映象倉庫。

1 準備工作

假設有兩臺伺服器,這裡我使用的是阿里雲ECS:

Node1:Windows Server 2019,Docker Client

Node2:CentOS 7.5,Harbor

其中,Node1作為客戶端,主要用來推送映象到harbor映象倉庫 和 從harbor拉取映象執行容器例項。Node2作為服務端,主要用來執行harbor映象倉庫對企業內部提供容器映象服務。

2 搭建Harbor映象倉庫

Why Harbor?

因為Harbor是目前最流行的企業級私有容器映象倉庫之一,而且它同時支援Linux Container 和 Windows Container 的映象,使得它比較符合我的需求。

快速搭建過程

我們在Node2(CentOS)上來快速地基於Harbor搭建一個私有映象倉庫。

step1.安裝docker compose

# curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose -version

step2.下載並解壓harbor離線安裝包

# wget https://github.com/vmware/harbor/releases/download/v1.10.1/harbor-offline-installer-v1.10.1.tgz
# tar xvf harbor-offline-installer-v1.10.1.tgz

step3.修改harbor.yml配置,主要修改hostname 和 admin初始密碼,註釋掉https的配置(生產環境建議開啟https,這裡只做快速演示)。

hostname: 47.108.111.236
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
# https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433
# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: EDC@123456

step4.安裝harbor

# ./install.sh

安裝完成後,確認沒有問題,通過瀏覽器訪問檢視harbor管理介面。

使用賬號 admin 和你配置的初始密碼 即可進入管理面板,這裡我們來建立一個專案,這裡我們暫且命名為dotnet:

後面的示例,我們就在客戶端推送映象到這個dotnet專案中。

3 推送映象到映象倉庫

在Node1,首先,配置一下hosts對映,這裡配置了一個Node2的內網地址:

172.10.10.100 reg.edisonzhou.cn

然後,修改一下docker的配置檔案,將 reg.edisonzhou.cn 作為可以使用http訪問的倉庫:

配置檔案:C:\ProgramData\docker\config\daemon.json

{
"insecure-registries" : [ "reg.edisonzhou.cn" ]
}

然後,就是熟悉的push映象過程了,還是原來的味道:

> docker login reg.edisonzhou.cn
> docker tag reg.edisonzhou.cn/samples:aspnetmvcapp reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp
> docker push reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp The push refers to repository [reg.edisonzhou.cn/dotnet/samples]
11d8e5abf6ac: Pushed
265452af5f33: Pushed
f9fe54bc871d: Pushed
ddaa4e132ef2: Pushed
0fd048ba07e9: Pushed
df61cb75b354: Pushed
825bd5d0379d: Pushed
0037a968c4d7: Pushed
6420f996a252: Skipped foreign layer
a7ba3db29ebb: Skipped foreign layer
4.8: digest: sha256:7da03aef9a9acb66678d5c14dda85c741268557bdcd55484e6351e373445157f size: 2779

最開始我以為.net 4.x的映象動不動就7~8個G,即使是內網推送也可能很慢,但是沒想到的是在阿里雲ECS的內網推送,如此大的映象也能很快的完成。

此外,建議先將.net 4.x sdk的基礎映象先推送到harbor,後續推送應用程式的映象會共享基礎映象層的檔案,因此速度也會加快很多。

當然,第一次push的過程還是需要耐心等待一下,速度取決於你的伺服器的配置和網路環境(如是否內網、頻寬等因素)如果出現以下錯誤:

received unexpected HTTP status: 500 Internal Server Error

你可以對harbor映象倉庫所在的linux伺服器關閉SELinux:

setenforce 0

push完成之後再看看harbor中的倉庫專案列表:

*.後面我又陸續push了sdk 和 runtime的映象。

4 拉取映象並執行

有了私有映象倉庫,又push了映象,我們來模擬一下在Node1(Windows Server 2019)中拉取私有倉庫中的映象來執行一下:

>docker run --name aspnet_mvc_sample --rm -it -d -p 8000:80 --cpus 1 -m 1024m reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp

成功執行後,通過瀏覽器訪問驗證一下:

可以看到,成功執行,完美!

對於如此巨大的容器映象,我跑了兩到三個相同的asp.net mvc sample容器例項,驗證發現磁碟空間會每個例項多佔用0.2G左右,記憶體會每個多佔用200M左右。當然,這也是因為這個asp.net mvc sample實在太簡單,沒有任何依賴互動,但是它也側面反映,看似龐大的asp.net容器映象,實則不會隨著容器例項的增多而重複佔用空間,而是共享Windows核心。

5 總結

本文介紹瞭如何快速搭建一個harbor私有映象倉庫,並通過在Windows Server客戶端推送ASP.NET應用程式的映象到harbor,最後在Windows Server客戶端拉取harbor的映象併成功執行。

作者:周旭龍

出處:https://edisonchou.cnblogs.com

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。