.NET Core微服務之ASP.NET Core on Docker


Tip: 此篇已加入.NET Core微服務基礎系列文章索引 和 .NET Core on K8S學習實踐系列文章索引,可以點擊查看更多微服務或容器化技術相關系列文章。

一、Docker極簡介紹

1.1 總體介紹

  Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。

簡而言之> 容器是一個打包了應用服務的環境,它是一個輕量級的虛擬機,每一個容器由一組特定的應用和必要的依賴庫組成。

  Docker和傳統虛擬化之間最大的區別在於:容器是在操作系統層面上實現虛擬化,即直接復用本地主機的操作系統;而傳統虛擬化則是在硬件層面實現,如VMware vShpere, Xen及Citrix等。

  

  

1.2 Docker結構

  Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。

  Docker 容器通過 Docker 鏡像來創建。

  容器與鏡像的關系類似於面向對象編程中的對象與類。  

  Docker的架構如下圖所示,Client 通過接口與Server進程通信實現容器的構建,運行和發布。Client和Server可以運行在同一台集群,也可以通過跨主機實現遠程通信。

  具體詳細內容,請瀏覽:《幾張圖幫你理解Docker基本原理及快速入門

二、Docker的安裝

  (1)准備一台Linux主機,這里以CentOS 7.2為例。當然,你也可以使用Windows,不過你得確保是Windows 10 pro版本及以上,且安裝了Hyper-V等一系列的相關軟件。

  (2)安裝docker

  # yum install docker

  

  (3)啟動docker服務

  # systemctl start docker.service

  

  (4)配置開機啟動並驗證

  # systemctl enable docker.service

  

  驗證:查看docker版本信息 

  # docker version

  

  (5)配置docker加速器 => 原因你懂得,不設置慢死你,雲服務器除外

  # vim /etc/docker/daemon.json

{

"registry-mirrors": ["https://d8b3zdiw.mirror.aliyuncs.com"]

}  

  然后重啟docker服務

  # systemctl daemon-reload

  # systemctl restart docker

  (6)Hello World

  # docker run hello-world

  

三、ASP.NET Core on Docker配置

  (1)拉取dotnet/aspnetcore的最新鏡像,這里以aspnetcore 2.0為例

  # docker pull microsoft/aspnetcore:2.0

  

  PS:如果要拉取最新版本(比如.net core 2.1),可以將版本號改為aspnetcore:latest

  如果你想要拉取更多microsoft的鏡像,那么搜索一下把:# docker search microsoft

  

  拉取了不想要的鏡像,那么刪除一個吧,如:# docker rmi imagesID

  

  拉取之后,驗證一下是否拉取成功了:# docker images

  

  (2)現在我們進入VS中為我們的一個ASP.NET Core WebAPI編輯一個Dockerfile

# 父鏡像
FROM microsoft/aspnetcore:2.0

# 設置工作目錄
WORKDIR /app

# 復制發布文件到/app下
COPY . /app

# 設置端口
EXPOSE 8810

# 使用dotnet Manulife.DNC.MSAD.NB.AgentService.dll來運行ASP.NET Core項目,注意大小寫
ENTRYPOINT ["dotnet", "Manulife.CD.MSAD.NB.AgentService.dll", "--server.urls", "http://*:8810"]

  (3)發布這個ASP.NET Core WebAPI,並將Release文件傳送到Linux服務器中(你可以選擇xFTP或者WinScp等工具)

  

  (4)進入上圖的AgentService目錄中,開始打包docker鏡像

  # docker build -t agentservice-container:1.0 . => 不要忘記后面還有一個點.

  

  此刻再次驗證:# docker images

  

  (5)萬里長征最后一步:運行docker

  # docker run --name agentservice -d -p 8810:8810 agentservice-container:1.0

  

  這里的兩個端口號分別是宿主機和容器的映射,前一個是你在外部訪問的端口號,后一個是你要映射到docker容器中的端口號,切記和我們在Dockerfile中暴露出來的端口號保持一致。

  PS:這里如果docker run失敗后再次運行會提示名稱已存在,可以使用以下命令來刪除容器

  # docker rm -f [dockername]

  如果想要docker容器在非正常退出后自動重啟,可以加上--restart選項,例如下面:

  # docker run --name agentservice -d -p 8810:8810 agentservice-container:1.0 --restart=always

  (6)驗證docker運行效果

  方式一:在宿主機驗證

  

  方式二:在遠程客戶端通過瀏覽器訪問

  

四、Supervisor守護進程

  

  此部分主要針對於在Linux上的dotnet core應用程序,保證程序在異常或者是電腦重啟的時候仍然能夠正常訪問。大家可以瀏覽楊曉東的《ASP.NET Core Linux下為dotnet創建守護進程》以及focus-lei的《在docker上運行.net core程序》來學習,這里就不再贅述了。

參考資料

(1)菜鳥教程,《Docker教程

(2)楊曉東,《ASP.NET Core Docker部署》,《ASP.NET Core Linux下為dotnet創建守護進程

(3)李朝強,《Docker打包ASP.NET Core應用,在CentOS上運行

(4)聖傑,《.NET Core容器化@Docker

(5)focus-lei,《在Docker上運行.net core程序

(6)Esofar,《CentOS7 部署 ASP.NET Core應用程序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM