本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述。对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容。对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文。

先决条件

要完成本文所介绍的演练任务,需要准备以下环境:

  • Visual Studio 2015,或者Visual Studio Code,用于创建ASP.NET Core的Web API应用程序。本文使用Visual Studio 2015
  • 如果使用Visual Studio 2015,则需要安装.NET Core 1.0.0 – VS 2015 Tooling Preview 2。请点击此处安装
  • Microsoft .NET Core SDK,可以到微软官方网站下载安装
  • 一台装有Ubuntu 14.04.4 LTS的机器,可以是虚拟机。在Ubuntu中安装docker CLI。可以按照docker网站上的步骤进行安装
  • 如果希望在Windows下使用docker,请确保Windows机器满足下面的需求:
    • 64位Windows 10 Pro、Enterprise或者Education版本(Build 10586以上版本,需要安装1511 November更新)
    • 在系统中启用Hyper-V。如果没有启用,Docker for Windows在安装过程中会自动启用Hyper-V(这个过程需要重启系统)

有关Docker for Windows的内容,我会在另外的文章中介绍。

演练步骤

使用Visual Studio 2015创建一个ASP.NET Core的Web API应用程序

打开Visual Studio 2015,在新建项目的对话框中选择.NET Core分类下的ASP.NET Core Web Application (.NET Core)项目模板,给项目命名为DockerWebAPI,然后单击确定按钮。

在New ASP.NET Core Web Application (.NET Core)对话框中,选择Web API,然后点击确定按钮。

项目成功创建后,在解决方案浏览器中可以看到如下项目结构:

在此也不对ASP.NET Core的应用程序结构做过多介绍了。接下来,我们修改一下自动产生的ValuesController,使得GET方法返回当前机器的机器名,如下:

打开Program.cs文件,在构建WebHostBuilder的连贯方法链中,加入UseUrls调用,以便我们的应用程序可以接受来自任何IP的请求。这就使得应用程序在docker容器中也能接受HTTP请求:

OK,编译后,在命令行使用dotnet run运行这个应用程序:

打开浏览器,测试一下我们的应用,运行成功:

将ASP.NET Core Web API应用程序编译成Docker Image

首先,进入项目根目录(也就是包含有project.json文件的这个目录),使用dotnet publish命令发布应用程序。这就会把编译后的DLL连同依赖项一起,全部复制到bin/Debug/netcoreapp1.0/publish目录下。此时,使用WinSCP类似的软件,将该目录下的所有内容全部复制到Ubuntu的机器上(当然,如果是在Windows 10下使用Docker,也就不需要这个复制的步骤)。复制完成后,在Ubuntu系统中可以看到所有的这些文件:

我们顺便在Ubuntu中测试一下这个应用程序,看ASP.NET Core Web API是否能够在Linux的系统中与Windows下有着相同的用户体验。此时,在这个目录下运行dotnet DockerWebAPI.dll命令(要运行dotnet命令,就需要在Ubuntu中安装.NET Core CLI,也可以到微软官方网站下载安装,但对于本文的演练来说,这一步是不一定需要的),可以看到下面的界面:

使用curl命令测试一下:

测试成功。

接下来,在这个包含有DockerWebAPI.dll文件的目录下,新建一个Dockerfile文件,使用vim或者nano等文本编辑器,输入以下内容(#开头的行为注释行,可以不输入):

# 基于microsoft/dotnet:latest构建Docker Image
FROM microsoft/dotnet:latest # 进入docker中的/usr/local/src目录
RUN cd /usr/local/src # 创建DockerWebAPI目录
RUN mkdir DockerWebAPI # 设置工作路径
WORKDIR /usr/local/src/DockerWebAPI # 将当前文件夹下的所有文件全部复制到工作目录
COPY *.* ./ # 向外界暴露5000端口
EXPOSE 5000 # 执行dotnet DockerWebAPI.dll命令
CMD ["dotnet", "DockerWebAPI.dll"]

关于Dockerfile的定义,我们暂不讨论,请参考Docker的官方文档。

仍然在当前目录下,执行以下命令,创建Docker Image:

docker build -t daxnet/docker-webapi .

注意,千万别省略了最后一个点号,它表示采用当前路径的Dockerfile来生成Docker Image。如果是第一次生成,由于需要下载microsoft/dotnet:latest这个Docker Image作为基础Image,所以会比较慢(国内网速原因,你懂的)。如果成功的话,大致可以看到以下画面:

在Docker Container中运行ASP.NET Core Web API应用程序

现在,我们就可以使用docker run来执行刚才产生的Docker Image了。docker run会把Docker Image加载到Docker Container中,然后执行由Dockerfile指定的命令(也就是dotnet DockerWebAPI.dll命令)。docker run的命令如下:

docker run -it -p 8080:5000 daxnet/docker-webapi

在这条命令中:

  • -it参数表示需要提供一个模拟的shell环境,并要求有用户交互功能,这样当我们按下Ctrl+C的时候,就可以停止我们的应用程序
  • -p 8080:5000参数表示需要将Docker Container的5000端口映射到主机环境的8080端口,也就是客户端可以直接通过8080端口访问我们的应用程序
  • daxnet/docker-webapi参数指定了需要运行的Docker Image。此处采用默认的latest标签

运行后,可以看到如下界面:

让我们测试一下,在Linux中使用curl命令调用我们的服务,注意,与之前的测试相比,端口号需要由5000改为8080:

当然,也可以在另一台机器的浏览器中调用:

事实上,这时返回的机器名,已经是Docker容器的ID值了:

总结

本文通过快速地对各个步骤的描述,介绍了使用Visual Studio 2015创建ASP.NET Core WebAPI应用程序,并在Docker中运行该应用程序的方法。有些地方可能描述得不是很清楚,如有疑问欢迎留言讨论。今后争取能够更多地分享Visual Studio 2015、Docker、.NET Core等相关的实践经验。

在docker中运行ASP.NET Core Web API应用程序的更多相关文章

  1. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  2. docker中运行ASP.NET Core Web API

    在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...

  3. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  4. 在Docker中运行asp.net core 跨平台应用程序

    概述 Docker已经热了有一两年了,而且我相信这不是一个昙花一现的技术,而是一个将深远影响我们日后开发和部署.运营应用系统的一种创新(很多人将其作为devops的一种非常重要的基石).学习docke ...

  5. 【原创】 Docker 中 运行 ASP.NET Core 站点

    一. 建立 .NetCore 项目  a.新建项目 b.选择项目类型 c.添加控制器 d.添加视图 e.修改默认请求 f.发布 二. 准备 CentOS 环境 a.准备虚拟机 b.安装 docker ...

  6. Gitlab CI 自动部署 asp.net core web api 到Docker容器

    为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成. ...

  7. Docker容器环境下ASP.NET Core Web API

    Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...

  8. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  9. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...

随机推荐

  1. DDR的前世与今生(一)

    作者:一博科技 DDR SDRAM全称为Double Data Rate SDRAM,中文名为"双倍数据率SDRAM".DDR是在原有的SDRAM的基础上改进而来,严格的说DDR应 ...

  2. HTML DOM 对象

    本篇主要介绍HTML DOM 对象:Document.Element.Attr.Event等4个对象. 目录 1. Document 对象:表示文档树的根节点,大部分属性和方法都是对元素进行操作. 2 ...

  3. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  4. [C#] C# 知识回顾 - 学会处理异常

    学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...

  5. MySQL中interactive_timeout和wait_timeout的区别

    在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...

  6. Android公共title的应用

    我们在开发Android应用中,写每一个页面的时候都会建一个title,不是写一个LinearLayout就是写一个RelativeLayout,久而久之就会觉得这样繁琐,尤其几个页面是只是标题不一样 ...

  7. 一个诡异的COOKIE问题

    今天下午,发现本地的测试环境突然跑不动了,thinkphp直接跑到异常页面,按照正常的排错思路,直接看thinkphp的log 有一条 [ error ] [2]setcookie() expects ...

  8. Unity3D框架插件uFrame实践记录(二)

    5.创建属性和命令 本小节主要内容包括: 在Element节点上创建属性数据 在Element节点上创建命令数据 5.1.在Element节点上创建属性数据 在这里,我们首先为Login节点中的属性( ...

  9. WebSocket - ( 一.概述 )

    说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...

  10. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题

    现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...