目錄
介紹
先決條件
如何容器化現有項目
添加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 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.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編号作為環境變量:
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.com/Articles/1257705/Running-ASP-NET-Web-API-Solution-in-Docker