In diesem Artikel bereiten wir die Umgebung für die Ausführung von Containern unter Windows 10 vor und erstellen eine einfache containerisierte .NET-Anwendung.
Um alle folgenden Schritte ausführen zu können, benötigen Sie ein 64-Bit-System mit Version 2004 oder höher und Build 18362 oder höher. Überprüfen Sie die Version und Build-Nummer, indem Sie den Befehl in PowerShell ausführen winver
Wenn die Version niedriger als die erforderliche ist, müssen Sie aktualisieren und erst dann weiter gehen
WSL installieren 2
Aktivieren Sie zunächst die WSL-Komponente (Windows Subsystem for Linux). Starten Sie dazu PowerShell mit Administratorrechten und führen Sie den ersten Befehl aus
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
, shutdown -r -t 1
WSL 2 Linux wsl --set-default-version 2
, Linux Microsoft Store, , Ubuntu 20.04 LTS
Linux, PowerShell wsl --list --verbose
Linux, wsl --terminate Ubuntu-20.04
Linux \\wsl$
Docker
Docker Desktop Windows ,
Docker Desktop Docker Linux (WSL 2)
Docker PowerShell, Bash. docker version
, Docker , busybox,
docker run busybox echo "hello docker!!!"
. - . , rabbitmq
docker run --name rabbit1 -p 8080:15672 -p 5672:5672 rabbitmq:3.8.9-management
:
docker run
- . , Docker Hub
--name rabbit1
- rabbit1
-p 8080:15672
- . 8080 - , 15672 -
rabbitmq:3.8.9-management
- /,
RabbitMQ 5672 8080
, , docker container ls --all
docker ps -a
: docker stop rabbit1
. : docker start rabbit1
.NET
, .. , . bridge, .. , mynet bridge
docker network create mynet
redis . -d
docker run --name redis1 --network mynet -d redis
Visual Studio 2019 ASP.NET Core Web API,
Redis StackExchange.Redis Package Manager Console
Install-Package StackExchange.Redis -Version 2.2.4
,
RandomWeatherService.cs,
using System;
namespace WebApiFromDocker
{
public class RandomWeatherService
{
private Random _randomGenerator;
public RandomWeatherService()
{
_randomGenerator = new Random();
}
public int GetForecast(string city)
{
var length = city.Length;
var temperatureC = _randomGenerator.Next(-length, length);
return temperatureC;
}
}
}
RedisRepository.cs,
using StackExchange.Redis;
using System;
using System.Threading.Tasks;
namespace WebApiFromDocker
{
public class RedisRepository
{
private string _connectionString = "redis1:6379";
private TimeSpan _expiry = TimeSpan.FromHours(1);
public async Task SetValue(string key, string value)
{
using var connection = await ConnectionMultiplexer
.ConnectAsync(_connectionString);
var db = connection.GetDatabase();
await db.StringSetAsync(key.ToUpper(), value, _expiry);
}
public async Task<string> GetValue(string key)
{
using var connection = await ConnectionMultiplexer
.ConnectAsync(_connectionString);
var db = connection.GetDatabase();
var redisValue = await db.StringGetAsync(key.ToUpper());
return redisValue;
}
}
}
Startup
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<RandomWeatherService>();
services.AddScoped<RedisRepository>();
services.AddControllers();
}
, WeatherForecastController
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
namespace WebApiFromDocker.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
private RandomWeatherService _weather;
private RedisRepository _cache;
public WeatherForecastController(
RandomWeatherService weather,
RedisRepository cache)
{
_weather = weather;
_cache = cache;
}
//GET /api/weatherforecast/moscow
[HttpGet("{city}")]
public async Task<WeatherForecast> GetAsync(string city)
{
int temperatureC;
var cachedTemperatureCString = await _cache.GetValue(city);
if (!string.IsNullOrEmpty(cachedTemperatureCString))
{
temperatureC = Convert.ToInt32(cachedTemperatureCString);
}
else
{
temperatureC = _weather.GetForecast(city);
await _cache.SetValue(city, temperatureC.ToString());
}
var forecast = new WeatherForecast(
city, DateTime.UtcNow, temperatureC);
return forecast;
}
}
}
Dockerfile Docker.
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["WebApiFromDocker/WebApiFromDocker.csproj", "WebApiFromDocker/"]
RUN dotnet restore "WebApiFromDocker/WebApiFromDocker.csproj"
COPY . .
WORKDIR "/src/WebApiFromDocker"
RUN dotnet build "WebApiFromDocker.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApiFromDocker.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApiFromDocker.dll"]
, mynet
docker network connect mynet WebApiFromDocker
Dann stellen wir sicher, dass sich alle erforderlichen Container im selben Netzwerk befinden
docker network inspect mynet
Als Nächstes installieren wir Breakpoint in einer einzelnen Controller-Methode und senden eine Anfrage über Postman oder einen beliebigen Browser
http://localhost:49156/api/weatherforecast/moscow
Übrigens kann der in Ihrem Fall verwendete Port abweichen und im Fenster "Container" angezeigt werden
Ergebnis im Postbotenfenster
Stellen Sie außerdem sicher, dass der Wert für redis festgeschrieben ist, indem Sie eine Verbindung über die redis-cli-Konsole herstellen
Ok, alles hat wie vorgesehen funktioniert!