개발환경에서 구동되어 테스트된 내용이 운영환경에서도 큰 차이없이 반영되는것은 중요한 전략중하나입니다.

도커를 통한 개발환경이 급부상하고 , 그 차이를 줄일이수 있는 중요 전략중 하나가 되었습니다.

여기서는 Asp.net Core에서 지원되는 몇가지 개발환경에 관련된 프로퍼티를 살펴보도록 하겠습니다.


기본환경설정 셋트

  • launchSetting.json : IDE툴에만 영향주며, 실행/디버깅시의 작동방식을 설정합니다.
  • appsettings.json : 실행시 사용될수있는 환경설정 파일입니다.
  • Dockerfile : 도커 이미지를 만드는 과정 ( 빌드/배포) 과정을 정의합니다.

launchSetting.json

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:61836",
      "sslPort": 0
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "accountapi": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api/account/sysinfo/akka",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000"
    },
    "Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://localhost:{ServicePort}/api/values"
    }
  }
}


appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}


Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["accountapi/accountapi.csproj", "accountapi/"]
RUN dotnet restore "accountapi/accountapi.csproj"
COPY . .
WORKDIR "/src/accountapi"
RUN dotnet build "accountapi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "accountapi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "accountapi.dll"]


DB설정을 분리하기

자신의 컴퓨터(local)에 설치된 DB와,  배포환경속에서 접속되는 DB 두가지가 있다고 가정해보면

DB를 각각 접근하는 방법은 명백하게  다르며 접속설정 문자가 외부환경으로 분리가될 필요가 있습니다.


ASPNETCORE_ENVIRONMENT 에 설정된 환경변수에 따라 개발환경 이름설정이 가능합니다.

  • appsettings.json - 기본
  • appsettings.{환경이름}.json

기본설정에 설정된 추가 환경설정을 덮어씀으로 최종 설정파일이 사용되게 됩니다.

일반적으로 환경에따른 차이가 없는 부분을 기본설정을 통해 공통으로 사용하고

환경에따른 차이점을 분리하는 전략을 사용하게됩니다. 


VS IDE에서는 편리상 관련 추가되는 환경을 트리형태로 표현을 하지만

환경설정파일은 최초 런타임시 로드를 하며 동일한 경로에 존재합니다.


{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "db_account": "server=localhost;Port=3306;database=db_account;user=psmon;password=db1234"
  }
}


도커에 브릿지 인스턴스를 추가하면 172.17.0.X의 IP를 자동할당 받게되며 브릿지를 사용하는 인스턴스 끼리 상호간 접속이 가능해집니다.

  • 로컬 - "db_account": "server=localhost;Port=3306;database=db_account;user=psmon;password=db1234"
  • 로컬2 - "db_account": "server=localhost;Port=32775;database=db_account;user=psmon;password=db1234" 
  • 개발 - "db_account": "server=172.17.0.3;Port=3306;database=db_account;user=psmon;password=db1234"


일반적인 환경 네이밍

  • Development : 개발
  • Staging : 준 프로덕트
  • Product : 프로덕트


설정을 런타임에서 사용하기

public Startup( IConfiguration configuration )
{
    Configuration = configuration;
    String dbstr = Configuration.GetConnectionString("db_account")
}

Configuration 을 사용하여 설정파일에 등록된 내용을 읽어올수가 있습니다.


가상 컨테이너에서의 실행환경


개발장비(윈도우)에서  닷넷코어서비스를 도커를 통해 리눅스에서 실행시키고, DB역시 도커에 컨터이너 형태로 올려서

로컬과 다름없는 원격 디버깅 + 개발환경과 큰차이없는 실행환경 두마리의 토끼를 잡을수가 있습니다.


가상개발 환경 테스트 환경을 구축을위해 다음을 필요로 한다고 가정해봅시다. 

  • 리눅스설치 2대
  • 리눅스 1에 서비스 복사및 실행 + 원격디버깅 port open
  • 리눅스 2에 mysql 설치
  • 리눅스 1+2 를 내부네트워크 가능하게 설정
  • 로컬에서 원격 포트를 통해 디버깅하기

위 과정은 VMware,VirtualBox같은 순수 VM기술로 개인장비에 모두 설정이 가능합니다.

리눅스 설치와 필요한 서버를 설치하고 우리가 만든 서비스를 배포하여 동일한 가상 네트워크에

상호연동이 가능하도록 할수가 있습니다. 도커 이전에는 그러한 환경을 로컬에 모두 구동하여

유지한다란것은 거의 불가능에 가깝습니다.



참고링크



  • No labels