【Step By Step】将Dotnet Core部署到Docker下
一、使用.Net Core構(gòu)建WebAPI并訪問(wèn)Docker中的Mysql數(shù)據(jù)庫(kù)
這個(gè)的過(guò)程大概與我之前的文章《嘗試.Net Core—使用.Net Core + Entity FrameWork Core構(gòu)建WebAPI(一)》一致。
但是在我們這里,由于docker中無(wú)法部署sql server,所以我采用了Mysql數(shù)據(jù)庫(kù),順便吐槽一下 SQL Server真的太貴了,阿里云的Mysql實(shí)例價(jià)格和SQL Server實(shí)例價(jià)格差10倍,真的好夸張。
Mysql官方的EF Core支持剛剛出來(lái),由于文章是后續(xù)補(bǔ)充的,在我嘗試的時(shí)候官方驅(qū)動(dòng)還沒(méi)有出,所以我使用的是第三方的驅(qū)動(dòng):Pomelo.EntityFrameworkCore.MySql,據(jù)說(shuō)是國(guó)內(nèi)一個(gè)90后的小伙兒寫(xiě)的,非常牛X. ?
引用之后,就和EF訪問(wèn)SQL Server沒(méi)有什么區(qū)別了,但是:由于我們的Mysql實(shí)例是安裝在Docker容器中的,那兩個(gè)Docker容器之間怎么互相通信呢?
首先在啟動(dòng)API Image的時(shí)候,需要使用--link 命令,來(lái)建立API和Mysql 容器之間的訪問(wèn)通道,大概命令如下:
docker run -it -p 9100:9100 --name testapi --link msyqldb:msyqldb testapi
在Link的時(shí)候我們給需要連接的容器起了一個(gè)別名,這個(gè)別名就是一個(gè)主機(jī)名一樣,可以直接用來(lái)訪問(wèn),這個(gè)時(shí)候我們的連接字符串就類似于:
Data Source=mysqldb;port=3306;Initial Catalog=數(shù)據(jù)庫(kù)名稱;Integrated Security=False;Persist Security Info=False;User ID=用戶名;Password=密碼 這里,我們的DataSource,也就是實(shí)例的名稱,就直接寫(xiě)主機(jī)名,也就是我們?cè)贚ink的時(shí)候起的那個(gè)別名,就OK啦~只要你突破了這點(diǎn),那訪問(wèn)基本上就沒(méi)有什么問(wèn)題了。
Coding 工作結(jié)束之后,發(fā)布你的API,并且最終打包成Image,啟動(dòng)容器,這一系列過(guò)程可以參考我的上一篇文章:《【Step By Step】將Dotnet Core部署到Docker上》
二、使用.Net Core構(gòu)建一個(gè)Web程序并訪問(wèn)Docker中的WebAPI
在Docker中的Web程序訪問(wèn)另外一個(gè)Docker容器中的API, 需要解決的問(wèn)題如下:
1.API的路徑是啥?
2.跨域問(wèn)題
其中第一個(gè)問(wèn)題的解決思路和我們上面連接數(shù)據(jù)庫(kù)的解決思路是完全一致的,只要在Link的時(shí)候,加上別名,就可以用http://別名:端口號(hào)?來(lái)訪問(wèn)你的api即可。
第二個(gè)問(wèn)題不僅僅是在docker中會(huì)遇到的問(wèn)題,在平時(shí)我們開(kāi)發(fā)Web程序時(shí),也會(huì)遇到這樣子的問(wèn)題,常用的解決方案有以下幾種:
A.避免用js訪問(wèn)API,而采用后端代碼去調(diào)用,就沒(méi)有跨域這一說(shuō)了
B.后端API HttpHeader增加Access-Control-Allow-Origin:*?Access-Control-Allow-Headers:Content-type ?Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS三個(gè)選項(xiàng)
C.Jsonp,就是把數(shù)據(jù)當(dāng)做一個(gè)js文件來(lái)加載~
這里我采用方法A來(lái)解決跨域問(wèn)題(簡(jiǎn)單、暴力、最徹底):
第一步:通過(guò)Nuget引用Orion.ApiClientLight類庫(kù),這是一個(gè)封裝了一系列調(diào)用api方法的類庫(kù),我們可以通過(guò)他很方便的調(diào)用API并序列化結(jié)果
第二步:在Controller中初始化APIClient對(duì)象,JsonApiClientLight apiClient = new JsonApiClientLight();
第三步:調(diào)用方法來(lái)訪問(wèn)API。
下面的代碼是我調(diào)用一個(gè)CRUD的API來(lái)訪問(wèn)API的簡(jiǎn)單實(shí)現(xiàn):
public class HomeController : Controller{JsonApiClientLight apiClient = new JsonApiClientLight();public async Task<IActionResult> Index(){var list = await apiClient.GetAsync<List<Member>>("http://jb91api:9103/api/mermbers/mermber/list");return View(list.Response);}[HttpGet]public IActionResult Create(){return View();}[HttpPost,ActionName("Create")]public async Task<IActionResult> CreatePost(CreateMember model){if(ModelState.IsValid){var member = await apiClient.PostAsync("http://jb91api:9103/api/mermbers/mermber/", model);return RedirectToAction("Index");}return View(model);}public async Task<IActionResult> Delete(int id){if (id > 0){await apiClient.DeleteAsync("http://jb91api:9103/api/mermbers/mermber?id=" + id.ToString());}return RedirectToAction("Index");}}
?
轉(zhuǎn)載于:https://www.cnblogs.com/baiyunchen/p/5881360.html
總結(jié)
以上是生活随笔為你收集整理的【Step By Step】将Dotnet Core部署到Docker下的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一桶水多少钱啊?
- 下一篇: Codeforces Round #37