傳統.NET 4.x應用容器化體驗(3)
- 2021 年 7 月 21 日
- 筆記
- .NET, 【002】ASP.NET WebForm, 【003】ASP.NET MVC, 【005】雲原生, docker
上一篇我們自己通過編寫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的鏡像並成功運行。