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