Windows10にDockerをインストールして使用する別の方法

この記事では、Windows 10でコンテナーを実行するための環境を準備し、単純なコンテナー化された.NETアプリケーションを作成します。





以下のすべての手順を完了するには、バージョン2004以降の64ビットシステムとビルド18362以降が必要です。PowerShellでコマンドを実行して、バージョンとビルド番号を確認してください。 winver











バージョンが必要なバージョンよりも低い場合は、更新してから先に進む必要があります





WSL2のインストール

まず、Windows Subsystem for Linux(WSL)コンポーネントを有効にしましょう。これを行うには、管理者権限でPowerShellを起動し、最初のコマンドを実行します





dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
      
      







dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
      
      



, shutdown -r -t 1







Linux





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$







WSL





WSL





Docker

Docker Desktop Windows ,





Docker Desktop Docker Linux (WSL 2)





Docker PowerShell, Bash. docker version







Docker Desktop





, 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







Docker





.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
      
      



次に、必要なすべてのコンテナが同じネットワーク上にあることを確認します





docker network inspect mynet
      
      



次に、Breakpointを単一のコントローラーメソッドにインストールし、Postmanまたは任意のブラウザーを介してリクエストを送信します。





http://localhost:49156/api/weatherforecast/moscow 
      
      



ちなみに、あなたのケースで使用されているポートは異なる場合があり、[コンテナ]ウィンドウで表示できます





Postmanウィンドウの結果





さらに、redis-cliコンソールを使用して接続し、値がredisにコミットされていることを確認します





わかりました、すべてが意図したとおりに機能しました!








All Articles