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

相关文章
相关标签/搜索