本文是一篇指导快速演练的文章,将介绍在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. ajax

    常见的HTTP状态码状态码:200 请求成功.一般用于GET和POST方法 OK301 资源移动.所请求资源移动到新的URL,浏览器自动跳转到新的URL Moved Permanently304 未修 ...

  2. 页面中多个script块之间的关系

     一:函数声明与函数定义表达式在函数调用间的区别 <script type="text/javascript"> doA(); var doA = function(a ...

  3. pandas基础-Python3

    未完 for examples: example 1: # Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEM ...

  4. 听H3絮叨:何以让天下没有难用的流程

    最近朋友圈.网站新闻铺天盖地是"让天下没有难用的流程",有人就要问了,H3 BPM何德何能,为BPM站台,让天下没有难用的流程? 这是一个关于"办公室空想"的故 ...

  5. BPM配置故事之案例6-条件可见与条件必填

    小明兴奋的告诉大毛自己独立解决了必填和水印问题,腹黑的大毛决定给小明出一个进阶问题刷一下存在感. 大毛:我再考考你,我把表单改成了这样(下图).怎么做到,预算状态为"预算内"时,不 ...

  6. iOS10之Expected App Behaviors

    昨天上架到appStore的时候碰到个问题,构建好后上传到itunesconnect的的包都用不了, 显示错误为:此构建版本无效. 或者英文显示为:ITC.apps.preReleaseBuild.e ...

  7. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  8. Form 表单提交参数

    今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...

  9. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  10. Web应用多账号系统设计及微信扫码登录实现

    Web应用多账号系统设计及微信扫码登录实现 1   前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...