傳統.NET 4.x應用容器化體驗(3)

上一篇我們自己通過編寫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的鏡像並成功運行。