天天看點

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

作者:opendotnet

在Windows下使用Docker,我們選擇Docker Desktop這個軟體,非常友善。

Docker Desktop介紹及安裝

Docker Desktop是适用于Mac、Linux或Windows環境的一鍵安裝應用程式,使您能夠建構和共享容器化應用程式和微服務。

它提供了一個簡單的GUI(圖形使用者界面),允許您直接從機器管理容器、應用程式和圖像。Docker Desktop既可以單獨使用,也可以作為CLI的補充工具。

Docker Desktop減少了在複雜設定上花費的時間,是以您可以專注于編寫代碼。它負責端口映射、檔案系統問題和其他預設設定,并定期更新錯誤修複和安全更新。

安裝Docker Desktop後,預設安裝了以下元件:

  • Docker Engine
  • Docker CLI client
  • Docker Buildx
  • Extensions
  • Docker Compose
  • Docker Content Trust
  • Kubernetes
  • Credential Helper

Docker Desktop可與您選擇的開發工具和語言配合使用,并使您能夠通路Docker Hub中的大量認證圖像和模闆庫。這使開發團隊能夠擴充他們的環境,以便使用安全的存儲庫快速自動建構、持續內建和協作。

官網位址

項目編譯

釋出項目運作架構為.net6.0,運作環境為linux-x64

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

Dockerfile内容及國内鏡像源

Dockerfile是用來建構docker鏡像的建構檔案,它其實就像一個腳本檔案,裡面可以執行一些指令,通過它就可以指定或下載下傳建構的鏡像所需要的一些元件,然後打包成鏡像檔案。

下面是本教程使用的Dockerfile腳本檔案内容,指定了使用asp.net6.0的運作時環境,并且在鏡像系統的5000端口上提供http服務。同時更新sources.list使用國内鏡像源,這裡沒有用阿裡的鏡像源,因為測試過程中阿裡的鏡像源在apt-get install -y libgdiplus的時候會提示找不到這個元件(坑)。因為使用的有基于System.Drawing繪制的驗證碼圖檔,是以需要在建構的時候把libgdiplus元件引用到鏡像檔案中,最後把鏡像系統中的時區改成亞洲的時區。

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /WhiteList
EXPOSE 5000
COPY . .

RUN touch /etc/apt/sources.list
RUN echo "" > /etc/apt/sources.list \ 
 && echo "deb http://mirrors.163.com/debian/ buster main non-free contrib" >> /etc/apt/sources.list \ 
 && echo "deb http://mirrors.163.com/debian/ buster-updates main non-free contrib" >> /etc/apt/sources.list \ 
 && echo "deb http://mirrors.163.com/debian/ buster-backports main non-free contrib" >> /etc/apt/sources.list \ 
 && echo "deb-src http://mirrors.163.com/debian/ buster main non-free contrib" >> /etc/apt/sources.list \ 
 && echo "deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib" >> /etc/apt/sources.list \ 
 && echo "deb-src http://mirrors.163.com/debian/ buster-backports main non-free contrib" >> /etc/apt/sources.list \ 
 && echo "deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" >> /etc/apt/sources.list \ 
 && echo "deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" >> /etc/apt/sources.list

ENV TZ=Asia/Shanghai
RUN apt-get update -y 
#RUN apt-get upgrade -y
RUN apt-get install -y libgdiplus
RUN apt-get clean
RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
 && echo ${TZ} > /etc/timezone

ENV ASPNETCORE_URLS http://+:5000
ENTRYPOINT ["dotnet", "WhiteList.dll"]
           

同時可以添加.dockerignore檔案來排除一些不需要打包到鏡像裡的檔案,比如忽略到bin或者obj目錄裡的檔案。

[b|B]in [O|o]bj

最後,千萬不要忘記把wwwroot複制到釋出的目錄中,要不然通路的時候會沒有樣式。以上Dockerfile中的有些腳本指令可合并成一行。

Docker鏡像打包釋出

把Dockerfile和.dockerignore檔案複制到釋出目錄中,然後運作PowShell,cd指令到釋出目錄(本文使用目錄為bin\Release\net6.0\linux-x64)。

然後執行打包指令

docker build --tag whitelist:1.0 .

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

如一切正常,按上圖的進度執行完成後,就可以在Docker Desktop中看到打包的鏡像檔案。

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

Docker Desktop中的Linux系統

我們點選鏡像的運作按鈕,填寫好鏡像名稱,綁定端口(本機通過此端口用浏覽器可以通路到容器内的服務),綁定的本地檔案夾(可選)和其它參數(可選)後點選RUN按鈕,如果沒有端口沖突和名稱沖突,就會得到一個運作成功的容器。

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下
.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

我們可以進入到容器的作業系統中檢視一下系統資訊。

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

cat /etc/issue

Debian GNU/Linux 10

cat /proc/version

Linux version 5.15.90.1-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220)

Docker鏡像導出

現在我們已經得到了一個基于Docker Desktop在Windows系統上建構的鏡像檔案,在使用中,我們需要把這個鏡像運作在Linux系統中(比如CentOS),是以需要把鏡像導出來進行分發(這裡使用的是本地導出,不是導出到雲鏡像伺服器)。

在Windows系統的PowerShell中執行下面指令,把鏡像(whitelist):Tag名(1.0)導出到本地的d盤,檔案名是whitelist.tar,

docker save -o d:\whitelist.tar whitelist:1.0

CentOS安裝Docker

首先安裝一下Docker所依賴的元件

yum install -y yum-untils device-mapper-persistent-data lvm2

然後配置資料源為國内的阿裡雲資料源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安裝Docker

yum install docker-ce

啟動Docker

systemctl start docker

設定Docker為開機自啟

systemctl enable docker

檢視Docker的版本資訊

docker --version

Docker version 24.0.2, build cb74dfc

檢視目前Docker中的鏡像

docker images

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

這裡看到,目前Docker中沒有任何鏡像

CentOS Docker鏡像導入

把鏡像檔案上傳到/usr/data目錄下,然後執行導入鏡像的指令

docker load -i /usr/data/whitelist.tar

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

導入成功後,再檢視Docker中的鏡像,就會看到我們剛導入的鏡像檔案了。

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

随後我們執行運作鏡像的指令,把CentOS系統的8080端口和容器的5000端口做映射。

docker run -d -p 8080:5000 --name whitelist whitelist:1.0

運作成功後會傳回一個類似GUID的容器編号,然後我們可以檢視一下目前運作的容器。

docker ps

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下

如果防火牆沒有放行8080端口,可用以下指令放開8080端口。

firewall-cmd --zone=public --add-port=8080/tcp --permanent

firewall-cmd --reload

最後我們本機打開浏覽器通路CentOS系統的IP并帶上8080端口,就可看到我們從Windows上打包的Docker鏡像已經成功運作在了CentOS系統的Docker環境下了。

.NET 6項目在Windows下建構Docker鏡像并本地導出分發到CentOS系統下