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應用程序》