.netcore项目docker化,以及docker之间通信
簡言:
最近剛完成公司的新系統(tǒng),系統(tǒng)使用的是微服務架構,由于領導說要將服務docker化。下面將我的研究結果分享出來,如若有錯誤的地方,還請各位大佬多多指點。
目錄:
什么是docker?
使用docker有什么好處?
docker的使用和docker之間的通信
1. 什么是docker?
Docker 是一個開源的應用容器引擎,讓開發(fā)者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發(fā)布到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱(沙箱:一個虛擬系統(tǒng)程序)機制,相互之間不會有任何接口。也就是說,我們可以用docker把我們系統(tǒng)和系統(tǒng)所需要的環(huán)境以及依賴的軟件都打包成一個安裝包,然后可以安裝到linux或windows上。
關于docker三個核心概念:
倉庫:存放鏡像的倉庫
鏡像:類似于系統(tǒng)鏡像
容器:鏡像的實例
小時候我特喜歡去河邊沙灘上玩耍,一般都帶著一個袋子,里面裝了許多形狀的摸具。把沙子打濕之后,拿模具一按,一個形狀塊就有了,記得小時候最喜歡就就是五角星的模具。偶爾有調皮搗蛋的小伙伴會把我做的形狀給弄散,當時我不哭也不惱,拿起模具迅速就再做出一個來,氣的他沒話可說。有時候突發(fā)奇想,想到一種新的形狀,然后把它做出來之后,我就會把它記下來,然后回家立馬弄個新形狀的模具出來。
在這里,我把docker比喻沙灘,而我的袋子就好比倉庫,而模具就是鏡像,容器自然就是拿模具做出來的形狀塊。而真正的程序開發(fā)中,你可以把鏡像理解為我們做的系統(tǒng)的安裝包,容器理解為安裝后的運行的系統(tǒng)。以上都是我自己個人對docker的理解,如果哪位大佬覺得不合理,還請多交流。
2.使用docker有什么好處?
以往的系統(tǒng)開發(fā)有這么一個問題,在開發(fā)人員的電腦上開發(fā)的系統(tǒng),跑到其他人的電腦上或者是服務器上,需要配環(huán)境、安裝一大堆的軟件。不同的操作系統(tǒng)安裝方法還有可能不一樣。等安裝完了之后,一啟動發(fā)現一大堆的報錯,而再自己的電腦上跑的好好的(這里我遇到過)。還有就是,有可能公司的文件服務器比較悠閑,運行多個系統(tǒng)又怕干擾(這里可以使用虛擬機,但性能不是很好)。
而使用docker,可以把開發(fā)好的系統(tǒng)以及系統(tǒng)所依賴的東西,打包成鏡像,然后可以發(fā)布到支持docker的平臺。并且docker能夠確保每個容器都擁有自己的資源,并且和其他容器是隔離的。你可以用不同的容器來運行使用不同堆棧的應用程序等等(docker好處實在太多,我就不一一列舉了)。
3.docker的使用和docker之間的通信
怎么安裝docker,去哪下載等等我就不講了,大家都不是編程小白。
第一步:首先下載dotnet core鏡像:docker run -it microsoft/dotnet ,這個是啟動命令,如果鏡像不存在則會自動下載。
第二步:創(chuàng)建項目
1.首先創(chuàng)建一個userservice的web api core項目并創(chuàng)建一個usercontroller?,并修改Program類中的CreateWebHostBuilder
[Route("api/[controller]")] ???[ApiController] ???public?class?UserController : ControllerBase ???{ ???????public?IActionResult Get() ???????{ ???????????return?Ok(new[] {?new?{Id=1,Name="li"?},?new?{ Id = 2, Name =?"lisi"?} }); ???????} ???} |
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:5000")
.UseStartup<Startup>();
2. 其次再創(chuàng)建一個emailservice的web? api core項目,并創(chuàng)建一個emailcontroller,在修改Program類中的CreateWebHostBuilder
[Route("api/[controller]")] ?[ApiController] ?public?class?EmailController : ControllerBase ?{ ?????public?IConfiguration Configuration {?get;?set; } ?????public?EmailController(IConfiguration Configuration) ?????{ ?????????this.Configuration = Configuration; ?????} ?????public?async Task<IActionResult> Post(long?userId) ?????{ ?????????using?(HttpClient client =?new?HttpClient()) ?????????{ ?????????????var?content = await client.GetAsync("http://user-service:5000/api/user"); //這里的user-service是docker的link機制,下面會講 ?????????????return?new?JsonResult(new?{ users= await content.Content.ReadAsStringAsync() ,constr= Configuration["databaseurl"] }); ?????????} ?????} ?} |
public?static?IWebHostBuilder CreateWebHostBuilder(string[] args) => ???????????WebHost.CreateDefaultBuilder(args) ???????????????.UseUrls("http://*:4001") ???????????????.UseStartup<Startup>(); |
最后,再分別發(fā)布下項目。
第三步:編寫Dockerfile
?分別在publish文件夾同級建一個Dockerfile。有關dockerfile里面的指令解釋,請閱讀:https://www.cnblogs.com/linjiqin/p/8735230.html
1.首先編寫emialservic的dockerfile:
? 2. 編寫userservice的dockerfile:
第四步:分別在目錄下運行cmd,然后輸入:docker build -t dotnet/emailservice .和 docker build -t dotnet/userservice .(注意后面的 . 號),然后鏡像就制作完成了。
第五步:因為emailservice依賴于userservice,所以emailservice和userservice要進行通信。
docker通信有三種方式:
通過docker容器ip加端口號。因為docker容器重啟之后ip地址會改變,不方便遷移。所以不推薦使用。(除非使用固定ip)
通過映射到主機的端口號。這種方式可以,但是會占用主機端口號
docker的link機制。docker的link機制可以通過一個name來和另一個容器通信,link機制方便了容器去發(fā)現其它的容器并且可以安全的傳遞一些連接信息給其它的容器。
我這采用link機制,首先編寫一個docker-compose.yml文件
然后emailservice可以通過:http://user-service:5000端口來訪問userservice服務 (我在前面的代碼中已經設置好了,所以就不用了)。運行命令:docker-compose up,就行了
結果圖如下:(我這里為了顯示結果,然后映射到主機端口。在微服務中只需要把網關的端口映射出來就行)
原文地址:https://www.cnblogs.com/norain/p/docker_comunication.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的.netcore项目docker化,以及docker之间通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#只用属性来解决兔子,不用方法和循环
- 下一篇: .NET CORE 多语言实现方案