Synology docker ASP.net Core + mssql 연동

Synology 2019.11.18 댓글 Plorence

저의 블로그 게시글 중에 Synology docker로 asp.net core 배포하기를 따라 하고, EF Core를 사용하신다면 아래와 같은 오류가 발생합니다.

System.PlatformNotSupportedException: LocalDB is not supported on this Platform.
or
System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 35 - An internal exception was caught) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (00000005, 6): No such device or address

이와 같은 문제를 해결하려면 리눅스용 mssql-server를 설치하고 ASP.net Core 컨테이너에서 링크를 걸어야 합니다.

해결 방법은 도커 퀵스타트 문서에도 나와있지만 여기서는 docker-compose방법으로 사용합니다.

확실히 이게 한번 해두면 덜 귀찮기야 하겠지만, 아직 방법도 찾아보지 못했고 Nas에서 빌드할 일은 없을 것 같아 다른 방법으로 해보자 합니다.

 

mssql-server 설치

도커 레지스트리 탭

'mssql'를 키워드로 검색해 빨간 줄 친 'microsoft/mssql-server-linux' 이미지를 다운로드합니다.

도커 이미지 탭에서 설치한 mssql-server 더블클릭시 뜸

"높은 권한을 사용하여 컨테이너 실행"에 체크합니다.

그리고 아래에 고급 설정 버튼을 누릅니다.

고급설정 환경 탭

ACCEPT_EULA는 쓰지 않으면 사용 불가능합니다. (실행하면 EULA 동의 안 하는 걸로 간주해서 꺼지기 때문)

SA_PASSWORD는 로그인할 계정의 비밀번호를 입력하시면 됩니다.

'자동 재시작 활성화'는 어차피 해당 컨테이너가 링크 용도로 걸리기 때문에, ASP.net Core 컨테이너가 실행될 때 같이 실행됩니다.

 

ASP.net Core 프로젝트에서 코드 수정

appsettings.json 코드 수정

"ConnectionStrings": {
    "...": "...",
    "MsSql-Linux-Docker": "Server=db;Database=디비이름;User=sa;Password=비밀번호;"
    //예)"MsSql-Linux-Docker": "Server=db;Database=plodb;User=sa;Password=qweasdzxc123!;"
  }

도커에서 사용할 mssql를 위해 ConnectString을 작성합니다.

Startup.cs > ConfigureServices메서드 코드 수정

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

#if DEBUG
//프로젝트 플랫폼이 Debug일 경우
            services.AddDbContext<Context>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("...")));
#elif RELEASE
//프로젝트 플랫폼이 Release일 경우
                       services.AddDbContext<CleanEsportsContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("MsSql-Linux-Docker")));
#endif


        }

저 같은 경우 개발과 디버깅은 Windows 10에서 하고 있습니다.

connectionString이 리눅스용과 다르기 때문에 구분해놨습니다.

 

프로젝트 빌드하고 배포하기

제가 알려드린 배포 방법으로 따라 하셨으면 똑같이 publish.ps1를 실행해 img파일을 생성합니다.

그리고 똑같이 Nas에 업로드해 컨테이너를 생성합니다.

 

ASP.net Core 컨테이너 설정

컨테이너 설정에서 링크탭

'+'를 누르고 mssql-server컨테이너를 선택합니다.

그리고 별칭은 db로 하고 적용 누르면 됩니다.

이때 앞에서 만든 mssql-server 컨테이너와 이미 생성한 ASP.net Core 컨테이너는 종료 상태에서 해야 합니다.

그리고 ASP.net Core 컨테이너를 실행하면 mssql-server 컨테이너도 자동으로 실행됩니다.

 

혹시나 동일한 에러가 발생한다면, ASP.net Core 컨테이너와 mssql-server 컨테이너 둘다 끄고 ASP.net core 컨테이너를 다시 실행해보세요.

댓글