admin 管理员组文章数量: 887019
目录
介绍
先决条件
如何容器化现有项目
添加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/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 80
FROM 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 /app
FROM builder AS publish
RUN dotnet publish -c Release -o /app
FROM 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 OS:Linux。
添加的项目类型为“.dcproj”,并创建以下文件:
下一步是右键单击另一个项目,以相同的方式,选择Add - > Container Orchestrator Support - > Docker Compose - > Target OS:Linux。
假设您的两个项目被称为“CarClient”和“CarApi”,那么生成的docker-compose.yml如下所示:
version: '3.4'
services:
web:
image: ${DOCKER_REGISTRY}carclient
build:
context: .
dockerfile: CarClient/Dockerfile
api:
image: ${DOCKER_REGISTRY}carapi
build:
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}carclient
environment:
- 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}carapi
ports:
- 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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …
5c5c3a6fa376 carclient "dotnet CarClient.dll" 12 hours ago Up 12 hours 0.0.0.0:32781->80/tcp
20cf31344091 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网络的解决方案
cd到carapi
>>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.dockerwork.bridge.default_bridge": "true",
"com.dockerwork.bridge.enable_icc": "true",
"com.dockerwork.bridge.enable_ip_masquerade": "true",
"com.dockerwork.bridge.host_binding_ipv4": "0.0.0.0",
"com.dockerwork.bridge.name": "docker0",
"com.dockerwork.driver.mtu": "1500"
},
"Labels": {}
}
]
你看到carapi正在使用IP: 172.17.0.3。在docker run下面的CarApiUrl命令中使用此ip编号作为环境变量:
cd到carclient
>>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/Articles/1257705/Running-ASP-NET-Web-API-Solution-in-Docker
版权声明:本文标题:在Docker中运行ASP.NET Web API解决方案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726378933h948563.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论