web-dev-qa-db-ja.com

DockerコンテナーからSQL Serverデータベースに接続する

マシンにインストールされているWindows用のdockerがあります。別のVMで実行されているSQL Serverデータベースにアクセスしようとする.net core 1.0.0をターゲットとするコンソールアプリケーションがあります。マシンからSQL Serverを実行しているVMをpingできます。

私のマシンのコマンドプロンプトからdotnet runを使用してコンソールアプリケーションを実行しようとすると、正常に動作します。しかし、同じアプリケーションがdockerコンテナー内で実行されると、メッセージが表示されます

SQL Serverへの接続を確立中に、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからなかったか、アクセスできませんでした。インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認してください。 (プロバイダー:TCPプロバイダー、エラー:40-SQL Serverへの接続を開けませんでした)

使ってみた

docker run --add-Host sqldemo:<VM running sql server ip here>

しかし、それは違いはありませんでした。

17
Learning Docker

仮定

  • Microsoft SQL Server 2016
  • Windows 10 Anniversary Update
  • Windowsコンテナー
  • ASP.NET Coreアプリケーション

SQLデータベースにSQLユーザーを追加します。

  • MS SQLでデータベースを展開します
  • 「セキュリティ/ログイン」を右クリックします
  • 「新規ログイン」を選択します
  • ユーザー名とパスワードを作成します。
  • 「サーバーの役割」を割り当てます...テストしているだけなのでsysadminを使用しました
  • 「ユーザーマッピング」で、データベースに新しいユーザーを追加し、スキーマに「dbo」を使用しました。

SQL Server認証モードを許可するようにSQL認証を変更する

データベースを右クリックして、「プロパティ/セキュリティ/サーバー認証/ SQL ServerおよびWindows認証モード」ラジオボタンを選択します。 MS SQLサービスを再起動します。

新しいユーザー名とパスワードでappsettings.jsonを更新します

"ConnectionStrings": {
        "DefaultConnection": "Server=YourServerName;Database=YourDatabaseName;MultipleActiveResultSets=true;User Id=UserNameYouJustAdded;Password=PassordYouJustCreated"
},

必ず削除してくださいTrusted_Connection=True

Dockerファイルを作成する

私のサンプルDockerファイル

FROM Microsoft/dotnet:nanoserver
ARG source=.
WORKDIR /app 
EXPOSE 5000 
EXPOSE 1433 
ENV ASPNETCORE_URLS http://+:5000 
COPY $source .

アプリケーションを公開

昇格されたPowerShellのDockerファイルと同じ場所から実行する

dotnet publish

docker build bin\Debug\netcoreapp1.0\publish -t aspidserver

docker run -it  aspidserver cmd

コンテナーを実行して、PowerShellで実行中の出力を確認したかったのです。

コマンドプロンプトでコンテナがコンテナ内で起動して実行されると、アプリケーションを開始しました。

dotnet nameOfApplication.dll

すべてが計画どおりに進んだ場合、1つが稼働しているはずです。

7
ben

ネットワーク設定をHostに設定してdockerコンテナーを実行できます。このようなコンテナはネットワークスタックをdockerホストと共有し、コンテナの観点からは、localhost(または127.0.0.1)はdockerホストを参照します。

docker run --net=Host ... 

次に、ホストから行うのと同じように、Dockerコンテナー内からSQL Serverデータベースを取得する必要があります。

2
Camilo Silva

この答えのように

Linux DockerのSQL Serverインスタンス文字列接続

Saurabh Singhによる Microsoftから:

インスタンス名のサポートは、.Net Core v 1.1で利用可能です。 .Net Core v1.0では、インスタンス名はWindows以外のOSではサポートされていません。

したがって、Linuxで実行されている.Net Core 1.0からインスタンス名を使用してSQL Serverに接続できるとは思いません。

あなたの選択は次のようです:

don't use instance name
wait for .Net Core 1.1 (planned for "Fall 2016")
use pre-release version of .Net Core 1.1
0