把AspDotNetCoreMvc程序运营在Docker上

.net猿碰到了小鲸鱼,感到特别欢悦。本来.net猿只是在通过家里那田子窗看外面包车型地铁社会风气,不过望着海峡彼岸的苹果园越来越旺盛,实在不想再去做三只宅猿了。于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去探视。

接上一篇博文《把AspDotNetCoreMvc程序运维在Docker上-part2:修改容器以及宣布镜像》,此次大家看看哪些利用docker存款和储蓄数据。

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

 

… … 小编只可以憋出来那样多了,如故来干货吧。

背景


以前的亲自去做都独有四个网站使用,其出示的数目是投身内部存款和储蓄器中,能够查看DummyRepository的落到实处格局。那样的数额除了用于演示未有怎么用处。这一部分,将扩大数据存款和储蓄功效,用相比较实在的存款和储蓄方式,把数量保存到MySql数据库中。

今日,大家来看看哪些在macOS上应用 Visual Studio Code 开垦 Asp.net Core
应用,并运用Docker来开始展览付出调节和测量检验和布局。从前在行使 Visual Studio
的时候,大家看出了理想的集成性,IDE把具有的工具链全体配置好了,你要做的只是F5就能够了,后天大家来尝试一入手工业编写制定Dockerfile和Docker-Compose文件。另外,既然要开源,大家就干净一点,此次我们不再利用sqlite或许sql
server作为数据库,而使用开源界最风靡的mysql作为大家利用的后台数据库。

那正是说MySql数据库放在哪个地方吗?用守旧布局站点的方法,数据库应该布置在单独的服务器上,那么用于docker也相应有数据库专项使用的器皿。可能有的人会说,数据库放在跟应用站点容器中,不是更有利的吗?对于示例笔者想能够这么做,可是用于实战的话,会促成耦合,不易于对单身可能独立的数据库实行横向的扩大体积。所以这一部分的演示将会把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会给八个Infiniti制名字
  • -e: 配置容器的遭逢变量,这里本身安插了
    • MYSQL_ROOT_PASSWORubiconD : 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中的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两个表已经创办而且写入了演示数据。

图片 11

了解volume

采纳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目录中
  • WO奇骏KDIXC90 /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地址:四千端口,我们的运用就全盘在容器中跑起来了。

图片 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

此地我们任重(Ren Zhong)而道远修改了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

在演示此前,须求了然docker中的volume

volume从字面意思精通就是意味着容积、容积,它的功用将数据存款和储蓄独立于器皿之外,能够这么清楚:删除容器事后,数据还有大概会保留。这么看来不正是临近于数据库的成效吗?

 

volume示例

对于volume的接纳咱们得以譬喻来佛讲相比形象

在Docker服务器上创立如下文件Dockerfile.volumes,内容如下

 

FROM alpine:3.4

WORKDIR /data

ENTRYPOINT (test -e
message.txt && echo “File exists” || (echo “Creating File…” && echo
Hello, Docker $(date + ‘+%X’) > message.txt)) && cat
message.txt

 

这几个文件包括了创办容器的一声令下

1.拉取镜像alpine:3.4(这是一个非常小的Linux发行版)

2.设置WORKDIR

3.装置运行命令,一看就懂,正是看message.txt是还是不是存在,不设有则创设并写入创设时间,否则直接呈现内容

 

下一场创设镜像

docker build . -t
shenba/vtest -f Dockerfile.volumes

创立并运营多个器皿

docker run –name vtest
shenba/vtest

接下来在输出中能看到如下音信

Creating File…

Hello, Docker 07:10:05

注解是新建的

 

鉴于那几个容器其余什么也没干,全体运营完结之后就径直关闭了,大家调用运转命令

docker start -a
vtest

那时候的出口是

File exists

Hello, Docker 07:10:05

没难题,表明文件是保留在容器中了

 

那么大家把容器删掉再创设看看哪些成效

docker rm -f
vtest

docker run –name vtest
shenba/vtest

输出如下

Creating File…

Hello, Docker 07:13:56

成立了新文件,何况输出的时辰也变了,表达以前的文件已经官样文章了

 

接下去大家采取volume来化解删除容器后数据错失的标题

第一修改Dockerfile.volumes文件,在率先个指令之后插入如下命令

VOLUME /data

随后实行build命令更新镜像

docker build . -t
shenba/vtest -f Dockerfile.volumes

创办volume,在开立容器的时候会被用到

docker volume create
-name testdata

剔除在此之前的器皿

docker rm -f
vtest

双重创造容器,这里钦命了/data的数码是保留在testdata那些volume中

docker run –name vtest
-v testdata:/data shenba/vtest

长久以来能收看输出

Creating File…

Hello, Docker 07:25:27

那就是说大家先删除那一个容器,然后再次创建三个容器

docker rm -f
vtest

docker run –name vtest
-v testdata:/data shenba/vtest

那时的出口内容是

File exists

Hello, Docker 07:25:27

证明message.txt这么些文件是被保存在外表的volume中,不受容器删除的熏陶。

 

使用volume存储MySql数据

好了有了这么三个事例之后,大家接下去将大家的AspDotNetCoreMvc程序的多寡保存到MySql数据库中。(为啥用Mysql,而不是微软执政SqlServer,那是应该为这里用的是Linux
docker平台,SqlServer运转在Linux还太新了,还不了然,制止踩到坑)

既然要用MySql,那首先有个MySql的镜像。跟古板格局各异吧,不用自身安装MySql,直接拉个镜像下来(这几个命令必要些时间实行,可思量配备国内镜像)

 

docker pull
mysql:8.0.0

下一场成立一个volume

docker volume create
–name productdata

然后创设mysql的容器

docker run -p 3306:3306
-d –name mysql -v productdata:/var/lib/mysql -e
MYSQL_ROOT_PASSWORD=password -e bind-address=0.0.0.0
mysql:8.0.0

 

此处多少个参数说Bellamy下

-p 3304:3304
设置宿主机的3304端口映射到容器的3304端口,那样能够在宿主机访谈到容器里的mysql

-d 后台运转容器

-e
是设置情况变量,这里安装了八个变量,一个是密码,多少个是地方绑定

-v
钦定使用的volume,前边的/var/lib/mysql是依附mysql镜像里设置的路子配置的,要查阅那些门路能够运用如下命令
docker insepect mysql:8.0.0,在出口的内容中得以看看如下音讯

“Volumes”: {

“/var/lib/mysql”: {}

}

 

因为设置的是后台运维,所以看不到详细的日志,不过能够透过以下命令查看

docker log -f
mysql

从日记中大家得以见见如下字样

MySql is ready….

注解mysql服务已经打响运转了,整个经过比本人手动安装mysql简单多了(前提是docker遭逢已经搭好)

 

未焚徙薪好MySql的docker容器之后,接着更新我们的AspDotNetCoreMvc程序,让数据存储指向MySql,改造进程不详细描述,这里有变越来越好的代码分支

https://github.com/shenba2014/AspDotNetCoreMvcDocker/tree/mysql

 

代码拉取下来后实践如下修改

修改appsettings.json中DBHOST的IP地址,指向MySql容器所在宿主机器的IP,借使docker就安装在开垦机,那么可安装为localhost

 

下一场施行如下命令(确认保证mysql的器皿已健康运维)

dotnet restore

dotnet ef migrations add
Initial

dotnet ef database
update

 

实施完上述命令之后,就能够在MySql创立books数据库,何况创办了数码表Book.

作者们得以因此以下情势在docker容器上实践mysql命令来查阅大家新建的数据库和表

docker exec -it mysql
/bin/bash

然后进入到mysql容器下的bash命令,继续实践如下命令

mysql -uroot -p

输入密码(这里的密码在事先创立镜像的时候设置的)之后就能够议及展览开mysql的命令行

show databases;

use books;

show tables;

能够看来唯有二个表Book

 

接下去更新大家的shenba/aspdotnetcoremvc镜像

第一仍旧实践以下publish命令

dotnet publish
–framework netcoreapp2.0 –configuration Release –output dist

将dist文件夹拷贝docker所在服务器(假如开拓机就是docker服务器可忽略这步)

管教dist文件夹同等第的目录下有Dockerfile文件,那些文件具体内容在项目代码根目录下有

 

然后执行如下命令更新镜像

docker build . -t
shenba/aspdotnetcoremve -f Dockerfile

施行达成之后,还不能够即时成立那么些镜像的容器,因为我们的器皿是借助于MySql数据水库蓄水容量器,我们的接纳程序镜疑似通过docker内部的网络来探访MySql数据水库蓄水体量器。那么些网络,不是我们配备的localhost,其实际的拜谒地址是由docker设置好的

 

大家可以经过以下命令查看看docker的暗中同意设想network的IP地址音讯

docker network inspect
bridge

在输出结果中我们能够见到类似如下的出口

“Containers”: {

“d4e5cf975ad5e3ff11620c02f9b626fa4d0042faab83fa9d0ea86801d2cce452”:
{

“Name”: “mysql”,

“EndpointID”:
“39818b04606078f600a3ab55ef76949807d6528b978ec24d0f91cd5f4217b610”,

“MacAddress”:
“02:42:ac:11:00:02”,

“IPv4Address”:
“172.17.0.2/16”,

“IPv6Address”: “”

}

},

那是大家的mysql容器使用的网络布署音讯,IPv4Address正是给其余容器访问的IP地址。

翻开项目标Startup.cs的代码,大家的DBHOST是由此参数读取的。在运维ef
migrations命令时,大家是通过appsettings.json中的DBHOST来安装具体的MySql所在服务器地址,实际上就是docker宿主机器的IP地址,因为大家做了酷炫,所以实际访谈的是MySql容器。

 

接下来在运营阶段,大家得以由此指明情况变量的办法来设置那么些值

docker run -d –name
bookApp -p 3000:80 -e DBHOST=172.17.0.2 shenba/aspdotnetcoremvc

实行到位那些命令之后,就能够在mysql容器中插入一些种子数据。而且从出口音讯中能看到进行了创设种子数据的进程

Applying Migrations…

Creating Seed Data…

 

然后通过浏览器访谈

http://%7Bip%7D:3000就能够看出数据是从mysql里读取的

 

与此同一时候重新通过docker exec -it mysql
/bin/bash步向mysql可重新料定里面包车型客车数据

mysql -uroot -p

use books;

select * from
Books;

 

 

好了到此地早就实现了,近日落到实处了八个容器之间的报纸发表,叁个是包蕴web应用的器皿,贰个含有数据的mysql容器,说的可比啰嗦,实际上他们的构造图如下,未有虚拟的那么复杂。

图片 20