docker4dotnet #3 在macOS上应用Visual Studio Code和Docker开发asp.net core和mysql应用

.net猿碰着了小鲸鱼,觉得越来越兴奋。本来.net猿只是在通过家里这田子窗看外面的社会风气,可是看着海峡对岸的苹果园越来越旺盛,实在不想再去做一只宅猿了。于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去探望。

.net猿上了小鲸鱼渡轮就先问了一个题材,苹果园上有能用来编写c#代码的和Visual
Studio一样强大的IDE么?这时,天空闪过一道Gamma射线,艾瑞克神说,给你一个
Visual Studio
Code,去玩吧。于是.net猿搭这小鲸鱼的快船顺利的抵达了苹果山,开首了她的吃苹果之旅。

… … 小编只可以憋出来这么多了,仍旧来干货吧。


明天,我们来看看如何在macOS上运用 Visual Studio Code 开发 Asp.net Core
应用,并行使Docker来进展支付调试和配备。在此以前在动用 Visual Studio
的时候,大家看看了两全其美的集成性,IDE把拥有的工具链全体部署好了,你要做的只是F5就足以了,后天大家来尝试一出手工编制Dockerfile和Docker-Compose文件。另外,既然要开源,大家就根本一点,这一次大家不再动用sqlite或者sql
server作为数据库,而使用开源界最风靡的mysql作为我们接纳的后台数据库。

未雨绸缪开发环境

率先大家需要下载和装置多少个工具

1. Visual Studio Code 和 .Net Core

Visual Studio Code
是微软为科普开发人员提供的免费开源的跨平台代码编辑器,和其它流行的代码编辑器,如:Sublime,
Atom一样,它特别小,运行速度快,同时经过各种插件协助不同开发语言的编撰。不同的地点在于,VSC的插件不仅仅提供静态的语言高亮,自动语法检测和姣好功效外;还提供更为高档的编译器服务补助,那使得VSC可以在自然水准上代表IDE的功能,举办代码的编译,调试和宣布操作。

图片 1

下载地址:https://code.visualstudio.com
(同样我们可以在万众号中输入d4dtools获取最新版本的code安装包,提供Windows/Mac/Linux不同版本)

Asp.net Core 是一个跨平台的 asp.net
开发环境,可以透过以下地点下载macOS上的安装包

图片 2

下载地址:http://dot.net

注:虽然您前边设置过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等前端工具。

图片 3

下载地址: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提供了相同的效应。

图片 4

运转以下命令就足以成功yeoman的装置

npm install yo -g

在yeoman中提供了不同的generator(模版生成器)来提供不同门类的花色的变化,为了可以生成asp.net
core应用,大家需要设置aspnet generator

npm install generator-aspnet -g

安装好将来就足以创制项目了

图片 5

您也得以自己创制generator,参考 aspnet generator 的 github
源代码来学习。
https://github.com/omnisharp/generator-aspnet

4. Docker for Mac

与 Docker for Windows 一样,我们可以在macOS上设置Docker for
Mac来支撑Docker环境的保管。

图片 6

下载地址: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

图片 7

回车后,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中平等进行单步调试,查看变量数值的变更。

图片 8

2. 成立mysql容器作为支付数据库

数据库的开销一般会要求大家先安装一个数据库引擎在和谐的机械上,现在应用docker,我们得以在容器中运行一个数据库引擎。那样做有众多便宜,1)自己的机器能够很干净,不用操心各个程序之间相互争辨;2)数据库随用随开,不用的时候就关闭,不必占用资源;3)可以每一趟都用干净的数据库举办调节,不用顾虑苏醒数据状态;假诺需要的话,也可以把容器中的数据卷内容同步到本机上。

要这样做,首先你需要一台容器化主机,可以参考本序列第二篇
《docker4dotnet #2
容器化主机》
中的做法

此处我利用了一台运行在本地的vmwarefusion中的docker主机

图片 9

先是通过以下命令将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

图片 10

你可以看到 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中的Configure瑟维斯(Service)s方法中增长依赖注入代码

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

在Configure方法中调用萨姆pleData.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五个表已经创建并且写入了示范数据。

图片 11

行使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上所用的名字

图片 12

图片 13

这边在dotnet restore这一步会相比慢,因为急需下载所有的看重包。

注:在平凡开销中,你可以将先用常用包创设一个和谐的base
image,替换Dockerfile中的microsoft/dotnet,这样就绝不每一趟都重复下载包了。

近来键入docker images命令就可以见见大家新创制的image了

图片 14

运行

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

图片 15

你可以看到我们的器皿现在也不利连接到了mysql容器的对外端口上了。在浏览器中输入docker主机的ip地址:5000端口,我们的采取就全盘在容器中跑起来了。

图片 16

在docker ps中来看的2个容器是如此的

图片 17

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

图片 18

如上代码都早就发表到自身的github上,地址如下:

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

如果你遵照本文的首先片段设置了装有工具,那么您应当可以直接用行docker-compose
up来启动那个动用;以下我录制了一段简单的录像(3分钟)来演示这多少个进程。

 

连带随笔:


 

请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的新闻

图片 19

网站地图xml地图