docker4dotnet #3 在macOS上使用Visual Studio Code和Docker開發asp.net core和mysql應用

.net猿遇到了小鯨魚,以爲愈來愈興奮。原本.net猿只是在透過家裏那田子窗看外面的世界,可是看着海峽對岸的蘋果園愈來愈茂盛,實在不想再去作一隻宅猿了。因而,.net猿決定搭上小鯨魚的渡輪到蘋果園去看看。javascript

.net猿上了小鯨魚渡輪就先問了一個問題,蘋果園上有能用來編寫c#代碼的和Visual Studio同樣強大的IDE麼?這時,天空閃過一道Gamma射線,艾瑞克神說,給你一個 Visual Studio Code,去玩吧。因而.net猿搭這小鯨魚的快船順利的抵達了蘋果山,開始了他的吃蘋果之旅。css

… … 小編只能憋出來這麼多了,仍是來乾貨吧。html


今天,咱們來看看如何在macOS上使用 Visual Studio Code 開發 Asp.net Core 應用,並使用Docker來進行開發調試和部署。以前在使用 Visual Studio 的時候,咱們看到了良好的集成性,IDE把全部的工具鏈所有配置好了,你要作的只是F5就能夠了,今天咱們來嘗試一下手工編寫Dockerfile和Docker-Compose文件。另外,既然要開源,咱們就完全一點,此次咱們再也不使用sqlite或者sql server做爲數據庫,而採用開源界最流行的mysql做爲咱們應用的後臺數據庫。前端

準備開發環境

首先咱們須要下載和安裝幾個工具java

1. Visual Studio Code 和 .Net Corenode

Visual Studio Code 是微軟爲廣大開發人員提供的免費開源的跨平臺代碼編輯器,和其它流行的代碼編輯器,如:Sublime, Atom同樣,它很是小,運行速度快,同時經過各類插件支持不一樣開發語言的編寫。不一樣的地方在於,VSC的插件不只僅提供靜態的語言高亮,自動語法檢測和完成功能外;還提供更加高級的編譯器服務支持,這使得VSC能夠在必定程度上替代IDE的功能,進行代碼的編譯,調試和發佈操做。mysql

d4d-3-vscode

下載地址:https://code.visualstudio.com
(一樣你們能夠在公衆號中輸入d4dtools獲取最新版本的code安裝包,提供Windows/Mac/Linux不一樣版本)git

Asp.net Core 是一個跨平臺的 asp.net 開發環境,能夠經過如下地址下載macOS上的安裝包github

d4d-3-netcore

下載地址:http://dot.netweb

注:若是你以前安裝過asp.net 5或者 rc版的.net core,須要在運行以上安裝命令以前先卸載,在d4dtools網盤中下載 dotnet-uninstall-pkgs.sh,運行便可。

2. Node.JS和NPM,以及 bower, gulp 和 grunt 等前端工具

Node.js是一個javascript的運行引擎,提供服務端的javascript運行能力,同時也包含了npm這個包管理器,能夠用來安裝 bower, glup,grunt等前端工具。

d4d-3-node

下載地址:http://nodejs.org
(d4dtools中包含v4.4.7 LTS安裝包的Windows和Mac版本)

安裝完成後,讓經過如下命令安裝前端工具

npm install bower gulp grunt-cli -g

3. 安裝項目模版生成工具 yeoman 和 asp.net generator

YEOMAN是用來建立項目模版的工具,用慣了Visual Studio的開發人員必定都很喜歡新建項目的引導工具,選擇本身要用的項目類型就能夠建立出一個可運行的基本項目框架,這讓啓動一個項目或者學習編程都變的很是容易。Yeman提供了一樣的功能。

d4d-3-yeoman

運行如下命令就能夠完成yeoman的安裝

npm install yo -g

在yeoman中提供了不一樣的generator(模版生成器)來提供不一樣類型的項目的生成,爲了可以生成asp.net core應用,咱們須要安裝aspnet generator

npm install generator-aspnet -g

安裝好之後就能夠建立項目了

你也能夠本身建立generator,參考 aspnet generator 的 github 源代碼來學習。
https://github.com/omnisharp/generator-aspnet

4. Docker for Mac

與 Docker for Windows 同樣,咱們能夠在macOS上安裝Docker for Mac來支持Docker環境的管理。

d4d-3-docker-for-mac

下載地址:https://www.docker.com/products/docker
(d4dtools網盤:Docker.dmg)

至此,咱們的開發環境就準備完畢了。

建立asp.net core webapp

使用以上這些工具,咱們就能夠很順暢的創建應用程序了

1. 建立項目模版

首先建立一個應用目錄,源代碼目錄

mkdir aspnet-mysql
cd aspnet-mysql
mkdir src

而後進入src目錄使用yoman建立項目

cd src
yo aspnet

選擇 Web Application [without Membership and Authorization]做爲項目類型,Bootstrap做爲前端框架,並給出應用名稱aspnet-mysql

d4d-3-yo-aspnet

回車後,yoman建立項目中的代碼文件結構,並運行 bower install 完成所須要的javascript/css的安裝

而後運行如下命令,完成asp.net的nuget依賴包安裝

cd aspnet-mysql
dotnet restore

最後,鍵入如下命令打開 Visual Studio Code

code .

這時,VSC會自動生成如下配置文件,用於配置VSC中的開發調試工具鏈

.vscode/launch.json
.vscode/task.json

如今,你就能夠切換到調試視圖,並點擊運行按鈕開始調試你的應用了,你也能夠在代碼中設置斷點,像在Visual Studio中同樣進行單步調試,查看變量數值的變化。

d4d-3-yo-vsc-debug

2. 建立mysql容器做爲開發數據庫

數據庫的開發通常會要求咱們先安裝一個數據庫引擎在本身的機器上,如今使用docker,咱們能夠在容器中運行一個數據庫引擎。這樣作有不少好處,1)本身的機器能夠很乾淨,不用擔憂各類程序之間互相沖突;2)數據庫隨用隨開,不用的時候就關掉,沒必要佔用資源;3)能夠每次都用乾淨的數據庫進行調試,不用操心恢復數據狀態;若是須要的話,也能夠把容器中的數據卷內容同步到本機上。

要這樣作,首先你須要一臺容器化主機,能夠參考本系列第二篇 《docker4dotnet #2 容器化主機》中的作法

這裏我使用了一臺運行在本地的vmwarefusion中的docker主機

d4d-3-dockervm

首先經過如下命令將docker命令重定向到這臺主機中

eval $(docker-machine env {machine-name})

運行如下命令啓動一臺mysql數據庫容器,建立一個叫作ef的數據,並將3306端口暴露給本地環境

docker run --name mysql-dev -e MYSQL_ROOT_PASSWORD=P2ssw0rd -e MYSQL_DATABASE=ef -p 3306:3306 -d mysql

參數說明:

  • name: 給容器起個名字叫作mysql-dev,這樣便於後邊管理用,若是不給名字的話docker會給一個隨機名字
  • -e: 配置容器的環境變量,這裏我配置了
    • MYSQL_ROOT_PASSWORD : root用戶密碼
    • MYSQL_DATABASE: 新數據庫名稱,mysql容器會按照要求建立一個ef爲名稱的空數據庫
  • -p: 暴露端口,將3306端口暴露出來,便於管理

若是你本地沒有mysql的鏡像,docker會到docker hub去下載,若是已經有了鏡像那麼啓動真的是毫秒級的,啓動完成後你就可使用管理工具鏈接到這個容器上,這裏我用的MySQL Workbench

d4d-3-mysqlbench

你能夠看到 ef 數據庫已經建立好了。

3. 配置asp.net應用使用mysql做爲Entity Framework數據源

默認的asp.net 應用程序在Windows上使用sql server或者localdb做爲數據源,在非windows系統上使用的是sqlite。這裏,localdb和sqlite都只能做爲開發調試用途,若是須要投入生產就須要使用sql server,對應到開源產品,咱們能夠選用mysql做爲sql server的替代品。在上一步中咱們已經配置好了用於開發的mysql服務器(容器),如今咱們須要對應用程序進行配置,讓Entity Framework可使用mysql做爲數據源。

這裏,咱們使用的是由國內開發人員貢獻的開源庫,github地址以下:
https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

首先在 project.json 文件的 dependencies 配置節中加入如下引用:

"Pomelo.EntityFrameworkCore.MySql": "1.0.0-prerelease-20160726"

同時添加一個nuget.config配置文件,並在裏面添加Pomelo的源地址,這主要是由於這個nuget庫如今尚未正式發佈,發佈之後就不用進行這個配置了

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <packageSources>
 <add key="NuGet official package source" value="https://nuget.org/api/v2/" />
 <add key="PomeloMysql" value="https://www.myget.org/F/pomelo/api/v2/"/>
 </packageSources>
</configuration>

 

而後再次運行 dotnet restore,此次須要添加 –configfile nuget.config這個參數確保dotnet restore能夠正確使用nuget源

dotnet restore --configfile nuget.config

4. 添加 MVC Model到項目中

如今咱們就能夠在項目中建立咱們的實體類了,而且爲了演示方便,我在還添加了一些示例數據。

代碼文件 https://github.com/ups216/aspnet-mysql/blob/master/src/aspnet-mysql/Models/Blog.cs

 

而後在starup.cs中的ConfigureServices方法中添加依賴注入代碼

services.AddDbContext(options=>
 options.UseMySql(Configuration.GetConnectionString("Mysql")));

在Configure方法中調用SampleData.InitDB來建立示例數據

await SampleData.InitDB(app.ApplicationServices);

代碼文件:https://github.com/ups216/aspnet-mysql/blob/master/src/aspnet-mysql/Startup.cs

在 appsetting.json 中建立名爲Mysql的鏈接字符串

"ConnectionStrings": {
 "DefaultConnection": "Data Source=aspnetweb01.db",
 "Mysql": "Server={docker machine ip};database=ef;uid=root;pwd=P2ssw0rd;"
 }

代碼文件:https://github.com/ups216/aspnet-mysql/blob/master/src/aspnet-mysql/appsettings.json

確保 uid及pwd參數與docker run命令中的MYSQL_DATABASE,MYSQL_ROOT_PASSWORD一致
[docker machine ip]地址能夠經過如下命令獲取

docker-machine ip

如今,再次使用VSC啓動應用進行調試,你能夠看到在mysql中的ef數據中Blogs和Users兩個表已經建立而且寫入了示例數據。

d4d-3-yo-vsc-debug-1

使用Docker打包發佈應用

以上咱們已經完成了asp.net應用的建立,而且使用了一個運行在容器中的mysql進行開發調試,如今咱們須要將這個應用使用docker打包並運行在容器中。

1. 建立Dockerfile

使用yoman建立的應用自己就已經包含了一個Dockerfile,咱們只須要進行簡單修改便可
文件內容以下

FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore", "--configfile", "nuget.config"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
ENTRYPOINT ["dotnet", "run", "--server.urls", "http://0.0.0.0:5000"]

代碼連接:https://github.com/ups216/aspnet-mysql/blob/master/src/aspnet-mysql/Dockerfile

這個文件很簡單,咱們來看看它都作了些什麼:

  • FROM microsoft/dotnet:latest 告訴docker build使用microsoft/dotnet這個鏡像的最新版做爲咱們的base image
  • COPY . /app 將本機上Dockerfile所在目錄的全部文件拷貝到容器的/app目錄中
  • WORKDIR /app 設置容器使用/app做爲工做目錄,這樣後續的操做就都在這個目錄中進行
  • RUN dotnet restore 和 RUN dotnet build告訴docker build要執行dotnet restore和dotnet build兩個命令,同時使用nuget.config做爲restore的配置文件
  • EXPOSE 5000/tcp 暴露5000端口
  • ENTRYPOINT [「dotnet」, 「run」, 「–server.urls」, 「http://0.0.0.0:5000」],設置容器入口爲dotnet run命令,這個命令將啓動咱們應用

2. 構建容器鏡像並運行容器

如今,咱們就能夠運行如下命令完成容器構建了

docker build -t {image name}.

其中 {image name} 你能夠隨便起,我這裏用的是ups216/aspnet-mysql,這是我後面要上傳到docker hub上所用的名字

d4d-3-docker-build-1

d4d-3-docker-build-2

這裏在dotnet restore這一步會比較慢,由於須要下載全部的依賴包。

注:在平常開發中,你能夠將先用經常使用包建立一個本身的base image,替換Dockerfile中的microsoft/dotnet,這樣就不用每次都從新下載包了。

如今鍵入docker images命令就能夠看到咱們新建立的image了

d4d-3-docker-images

運行

docker run --name aspnet-msyql-dev -p 5000:5000 ups216/aspnet-msyql

d4d-3-docker-run

你能夠看到咱們的容器如今也正確鏈接到了mysql容器的對外端口上了。在瀏覽器中輸入docker主機的ip地址:5000端口,咱們的應用就徹底在容器中跑起來了。

d4d-3-docker-run-app

在docker ps中看到的2個容器是這樣的

d4d-3-docker-ps

3. 生產部署打包

以上過程當中咱們已經將應用部署到了容器中,而且鏈接到另一個容器中運行的mysql服務。可是,咱們這個鏈接是經過mysql容器暴露給主機的端口來鏈接的,這樣作在開發過程當中會比較方便,由於你能夠容器的實用工具鏈接到mysql進行操做,可是若是要進行對外發布就不是個好主意了。

同時,我但願可以將web應用和mysql容器一同部署,造成一個完整的應用部署包。這時,就須要藉助docker-compose來完成了。

首先,咱們建立一個用於生產環境的配置文件,appsettings.Production.json,內容以下:

{
 "ConnectionStrings": {
       "DefaultConnection": "Data Source=aspnetweb01.db",
       "Mysql": "Server=db;database=ef;uid=ef;pwd=P2ssw0rd;"
 },
 "Logging": {
      "IncludeScopes": false,
           "LogLevel": {
           "Default": "Debug",
           "System": "Information",
           "Microsoft": "Information"
           }
      }
 }

代碼連接:https://github.com/ups216/aspnet-mysql/blob/master/src/aspnet-mysql/appsettings.Production.json

這裏咱們主要修改了Mysql的鏈接字符串,使用db做爲數據庫,並使用ef做爲鏈接用戶。

而後,咱們建立一個 docker-compose.yml 文件,內容以下:

version: '2'
 services:
   db:
     image: mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: P2ssw0rd
       MYSQL_DATABASE: ef
       MYSQL_USER: ef
       MYSQL_PASSWORD: P2ssw0rd

   web:
     build: .
     depends_on:
       - db
     links:
       - db
     ports:
       - "5000:5000"
     restart: always
     environment:
     ASPNETCORE_ENVIRONMENT: Production

裏面的內容基本上能夠從字面意思讀懂,這裏主要建立了db和web兩個容器,web容器依賴db容器,並經過db這個名字連接過去,同時設置asp.net core的environment環境變量爲Production。

對應以上咱們在appsettings.Production.json文件中作的修改,你就能夠理解咱們經過Production這個環境變量配置咱們的應用去到一個叫作db的mysql服務器上連接名爲ef的數據庫,而且使用ef做爲用戶名。

如今,你只須要運行如下這一個命令就能夠完成這兩個容器的啓動了

docker-compose up

d4d-3-docker-compose-up

以上代碼都已經發布到個人github上,地址以下:

https://github.com/ups216/aspnet-mysql/

若是你按照本文的第一部分安裝了全部工具,那麼你應該能夠直接用行docker-compose up來啓動這個應用;如下我錄製了一段簡單的視頻(3分鐘)來演示這個過程。

 

相關文章:


 

請關注微信公衆號 【devopshub】,獲取更多關於DevOps研發運維一體化的信息

qrcode_for_gh_b7c158df1fd1_430

相關文章
相關標籤/搜索