目录

介绍

先决条件

如何容器化现有项目

添加docker-compose项目

带有docker-compose的容器化解决方案

添加环境变量

后端

前端

不使用Visual Studio运行您的应用程序

说明

使用Docker 网络运行您的应用程序

总结


本文介绍如何使用Visual Studio容器化ASP.NET WebApi解决方案,如何通过环境变量传递数据,以及如何在没有Visual Studio的情况下在docker中运行映像。

  • Github下载代码

介绍

在docker容器中运行带有Web API的Web解决方案时,棘手的部分是映射URL和端口,以便可以从外部访问docker容器内运行的代码。这是一个关于docker配置和小代码更改的问题。

先决条件

  • Visual Studio 2017最新发布的社区版
  • 您已在计算机上安装了“Docker For Windows”: https://download.docker.com/win/stable/Docker for Windows Installer.exe。
  • 您有一个现有的解决方案,其中包含Web API和Web“模型——视图——控制器”项目,MVC项目能够通过RESThttp接口与Web API进行通信。如果没有,您可以使用CarApi和CarClient项目(见下文)来实现您自己的解决方案。

本文的代码是本文中CarClient和CarApi的容器化版本。

在本文中,添加了docker支持,并且已更新docker配置文件,以便可以从CarClient前端和后端访问API 。

如何容器化现有项目

要为现有Web项目添加docker支持,例如,CarApi在Visual Studio中打开项目,右键单击该项目并选择Add - > Docker Support

创建一个docker配置文件“Dockerfile”,它看起来像这样:

# For more info see: http://aka.ms/VSContainerToolingDockerfiles
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80FROM microsoft/aspnetcore-build:2.0 AS builder
WORKDIR /src
COPY *.sln ./
COPY CarApi/CarApi.csproj CarApi/
RUN dotnet restore
COPY . .
WORKDIR /src/CarApi
RUN dotnet build -c Release -o /appFROM builder AS publish
RUN dotnet publish -c Release -o /appFROM base AS production
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "CarApi.dll"

对现有解决方案中的两个项目(即Web API和Web MVC项目)执行此操作。完成此操作后,您需要向解决方案添加docker-compose项目。

添加docker-compose项目

要将docker-compose项目添加到解决方案,请右键单击其中一个项目,然后选择Add - > Container Orchestrator Support - > Docker Compose - > Target OSLinux

添加的项目类型为“.dcproj”,并创建以下文件:

下一步是右键单击另一个项目,以相同的方式,选择Add - > Container Orchestrator Support - > Docker Compose - > Target OSLinux

假设您的两个项目被称为“CarClient”和“CarApi”,那么生成docker-compose.yml如下所示:

version: '3.4'services:web:image: ${DOCKER_REGISTRY}carclientbuild:context: .dockerfile: CarClient/Dockerfileapi:image: ${DOCKER_REGISTRY}carapibuild:context: .dockerfile: CarApi/Dockerfile

带有docker-compose的容器化解决方案

在将Dockerfiles添加到每个项目并将docker-compose项目添加到解决方案之后,该解决方案包含三个项目:Web MVC项目,Web API项目和docker-compose项目。

添加环境变量

要制作容器化版本功能,我们需要进行一些配置更改。

后端

在原始CarClient项目中,通过以下URL访问了Web API:

private static readonly Uri Endpoint = new Uri("http://localhost:54411/");

这里,URL是硬编码的,但我们也可以在launchSettings.json定义一个environment变量:

"profiles": {"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development","CarApiUrl": "http//localhost:54411/"}

该environment变量是这样写的:

var carApiUrl = Environment.GetEnvironmentVariable("CarApiUrl");

对于容器化解决方案,我们使用“dns发现”。Docker网络以及kubernetes处理所有这些魔力。使用docker-compose中所定义的服务的名称而不是localhost。要调用CarApi,请使用http://carapi。您无需设置端口号,因为端口号是外部属性。

我们将使用名为CarApiUrl的环境变量。这个变量在docker-compose.yml文件中定义,如下所示:

version: '3.4'services:
...carclient:image: ${DOCKER_REGISTRY}carclientenvironment:- CarApiUrl=http://carapi/build:context: .dockerfile: CarClient/Dockerfile

在文件Utils.cs读取环境变量:

private static readonly Uri Endpoint = new Uri(Environment.GetEnvironmentVariable("CarApiUrl"));

通过使用环境变量,我们无需在容纳解决方案时更改代码,只需更改配置。

前端

浏览器中运行的JavaScript使用端口54411。我们必须通过如下方式更改CarApi的docker配置文件来公开端口54411:

在Web API Dockerfile中,编写EXPOSE 54411:

# For more info see: http://aka.ms/VSContainerToolingDockerfiles
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 54411
...

docker-compose.yml,将外部端口54411映射到内部端口80:

version: '3.4'services:carapi:image: ${DOCKER_REGISTRY}carapiports:- 54411:80
...

保留原始JavaScript代码:

xmlhttp.open("GET", "http://localhost:54411/api/car", true);

这就是所需要的。您现在可以在Visual Studio中运行容器化解决方案。

不使用Visual Studio运行您的应用程序

使用带有Release配置的Visual Studio重建您的解决方案。使用F5 运行项目docker-compose以确保更新映像。

在Visual Studio之外,您需要使用docker-compose命令而不是docker run。在PowerShell中,cd到docker-compose.yml所在的解决方案文件夹。然后像这样运行docker-compose命令:

…> docker-compose --no-ansi up -d  --force-recreate --remove-orphans

然后检查docker ps,哪个端口carclient正在运行:

…> docker psCONTAINER ID    IMAGE     COMMAND                    CREATED          STATUS         PORTS   …5c5c3a6fa376     carclient  "dotnet CarClient.dll"   12 hours ago  Up 12 hours  0.0.0.0:32781->80/tcp20cf31344091    carapi       "dotnet CarApi.dll"       12 hours ago   Up 12 hours  54411/tcp, ….

Carclient在端口32781上运行。然后,该应用程序将在http://localhost:32781上访问。

说明

如果设置了Debug配置,则Visual Studio将创建空的不可工作映像。它手动将空容器映射到文件系统,以进行调试、“编辑并继续 ”功能等成为可能。因此,没有Visual Studio,dev图像就没用了。在Release配置中构建映像以使其可用。

完整的发布过程在文档中描述:用于Docker的Visual Studio工具。

使用Docker 网络运行您的应用程序

在没有YAML的情况下,可以通过docker网络进行容器通信。

首先是一些有用的docker命令:

Kill all, (start, run, rm all)

>>docker kill $(docker ps -aq)    

在容器内启动shell

>>docker exec -i -t container_name /bin/bash

运行没有docker-compose但使用docker网络的解决方案

cdcarapi

>>docker build -t carapi .>>docker run -e ASPNETCORE_ENVIRONMENT=Development -d -p 54411:80 --name carapi carapi

检查docker bridge网络以查找carapi所使用的IP地址;

>> docker network inspect bridge
[{"Name": "bridge","Id": "fce049eb23e5fb1a7b5c801a082d8809efd4d369f18de4693b35e6524f1d55c0","Created": "2019-03-04T15:13:40.1528498Z","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.17.0.0/16","Gateway": "172.17.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"cbf2ae63374659b4a9c8e341e22b20a7f3e6d7b6593d289d7ffa4db415d6e8b6": {"Name": "carapi","EndpointID": "0c25cdaa8403c928b12efc1e5f6bb40b71e76acc438f8b95d2ba7a135eb333e9","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""},"f1abe1fdb72a23b61f7160aa49aca06f9c849dd3fca9432257168175625589a2": {"Name": "carclient","EndpointID": "aa4dd99b8045e5a0c77f6dadd17ad9d3579c82c3cf7ee2af45461e6284523739","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""}},"Options": {"com.docker.network.bridge.default_bridge": "true","com.docker.network.bridge.enable_icc": "true","com.docker.network.bridge.enable_ip_masquerade": "true","com.docker.network.bridge.host_binding_ipv4": "0.0.0.0","com.docker.network.bridge.name": "docker0","com.docker.network.driver.mtu": "1500"},"Labels": {}}
]

你看到carapi正在使用IP: 172.17.0.3。在docker run下面的CarApiUrl命令中使用此ip编号作为环境变量:

cdcarclient

>>docker build -t carclient .>>docker run -e ASPNETCORE_ENVIRONMENT=Development -e CarApiUrl=http://172.17.0.3 -d -p 8080:80 --name carclient carclient

然后在浏览器中使用localhost:8080启动客户端。

现在,容器使用docker bridge网络在没有YAML的情况下进行通信。

总结

在本文中,我们讨论了如何使用Visual Studio容器化ASP.NET WebApi解决方案,如何通过环境变量传递数据,以及如何在没有Visual Studio的情况下在docker中运行映像。我们还了解如何使用docker网络作为docker-compose和YAML文件的替代方案。

原文地址:https://www.codeproject.com/Articles/1257705/Running-ASP-NET-Web-API-Solution-in-Docker

在Docker中运行ASP.NET Web API解决方案相关推荐

  1. [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API

    问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...

  2. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

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

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

  4. Asp.Net Web API 2第一课——入门

    前言 Http不仅仅服务于Web Pages.它也是一个创建展示服务和数据的API的强大平台.Http是简单的.灵活的.无处不在的.你能想象到几乎任何的平台都会有HTTP服务库.HTTP服务可以涉及到 ...

  5. ASP.NET Web API 安全筛选器

    原文:https://msdn.microsoft.com/zh-cn/magazine/dn781361.aspx 身份验证和授权是应用程序安全的基础.身份验证通过验证提供的凭据来确定用户身份,而授 ...

  6. ASP.NET Web API的Controller是如何被创建的?

    Web API调用请求的目标是定义在某个HttpController类型中的某个Action方法,所以消息处理管道最终需要激活目标HttpController对象.调用请求的URI会携带目标HttpC ...

  7. 使用ASP.NET Web API构建Restful API

    目录 介绍 这种方法有什么好处? Restful约定 构建API 测试API 一点困惑: 最佳实践: 数据传输对象(DTO) Automapper IHttpActionResult 使用Web AP ...

  8. 监控系统简介(二):使用 App Metrics 在 ASP.NET Web API 中记录指标

    回顾 在<监控系统简介:使用 Prometheus 与 Grafana>一文中,我们了解了什么是监控系统,Prometheus 这一监控工具及它提供的数据类型.PromQL 以及 Graf ...

  9. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

最新文章

  1. javascript中not defined、undefined、null以及NaN的区别
  2. 【HeadFirst 设计模式学习笔记】13 MVC分析
  3. c++中组数的替代方案
  4. Review meeting还开不开?
  5. 如何让apache支持.htaccess 解决Internal Server Error The server …错误
  6. centos安装virtualbox
  7. iview表单验证不生效问题注意点
  8. 自定义格式字符串随笔(IFormattable,IFormatProvider,ICustomFormatter三接口的实现)
  9. 让 AI 教机器自己玩俄罗斯方块
  10. 当微信遇上 10 万战绩的「跳一跳」外挂,程序员还能“逍遥”多久?
  11. 韦诺之战wesnoth没有声音
  12. 一文详解双目视觉目标检测
  13. 如果可以不上班《不上班的23种活法》免费下载及经典语录
  14. 微信隐藏功能系列:微信朋友圈三天可见怎么设置?
  15. html让登录框3d,CSS3实现3D旋转动态显示登录注册
  16. HEVC函数入门(22)——变换量化
  17. day027 jQuery第二天
  18. 统计遗传学:第三章,群体遗传
  19. 【C语言】深度理解 负数取余 取模
  20. anemometer mysql 500_Anemometer将Mysql慢查询日志可视化

热门文章

  1. decimal转换为int_“System.InvalidCastException 指定的转换无效”问题的反思和总结
  2. oracle一列有多个约束,在oracle中创建unique唯一约束(单列和多列)
  3. 插画素材模板 | 玩转电商促销季插画设计
  4. 国内人气设计师交流平台集设
  5. 设计师社区|你和设计大咖一起沟通的平台--集设
  6. 精选素材模板丨极简风简历模板
  7. python入门教授_南开大学教授强力推荐的5本Python入门书籍,附电子版
  8. C++类占字节数讲解
  9. 消逝波(表面波)Evanescent Wave
  10. Redhat或者Centos 手动安装htop