SQL Server Linux コンテナーをデプロイして接続する

適用対象:SQL Server - Linux

この記事では、SQL Server Linux コンテナーをデプロイして接続する方法について説明します。

その他の展開シナリオは次のとおりです。

注意

この記事では特に mssql-server-linux イメージを使用することに焦点を当てます。 Windows コンテナー内の SQL Server のデプロイはサポートの対象外です。 開発やテストの目的で、独自のカスタム コンテナー イメージを作成し、Windows コンテナー内で SQL Server を操作することはできます。 サンプル ファイルは GitHub で入手できます。 サンプル ファイルは参照目的にのみ使用してください。

重要

運用環境のユース ケースで SQL Server コンテナーを実行する前に、SQL Server コンテナーのサポート ポリシーを読み、サポートされる構成で実行していることを確認してください。

この 6 分間のビデオでは、コンテナーでの SQL Server の実行について説明します。

コンテナー イメージのプルと実行

SQL Server 用の Docker コンテナー イメージをプルして実行するには、次のクイックスタートの前提条件と手順に従います。

この構成記事では、以下のセクションで追加の使用シナリオを示します。

接続とクエリ

コンテナーの外部またはコンテナーの内部から、コンテナー内の SQL Server に接続してクエリを実行できます。 次のセクションでは、両方のシナリオについて説明します。

コンテナーの外部のツール

SQL 接続をサポートする外部の Linux、Windows、macOS ツールから、コンテナー ホスト上の SQL Server インスタンスに接続することができます。 いくつかの一般的なツールを次に示します。

次の例では、sqlcmd を使用して、コンテナー内で実行されている SQL Server に接続します。 接続文字列内の IP アドレスは、コンテナーを実行しているホスト マシンの IP アドレスです。

注意

新しいバージョンの sqlcmd (mssql-tools18) は、既定でセキュリティで保護されています。 バージョン 18 以降を使用している場合は、No オプションを sqlcmd に追加して、暗号化が必須ではなくオプションであることを指定する必要があります。

sqlcmd -S 10.3.2.4 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4 -U SA -P "<YourPassword>"

既定の 1433 ではないホスト ポートをマップした場合は、そのポートを接続文字列に追加します。 たとえば、docker run コマンド内で -p 1400:1433 を指定した場合は、ポート 1400 を明示的に指定して接続します。

sqlcmd -S 10.3.2.4,1400 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1400 -U SA -P "<YourPassword>"

コンテナーの内部のツール

SQL Server 2017 (14.x) 以降では、SQL Server のコマンドライン ツールがコンテナー イメージに含まれています。 対話型のコマンド プロンプトを使用してイメージにアタッチすると、ツールをローカルで実行できます。

  1. 実行中のコンテナー内で対話型の Bash シェルを開始するには、docker exec -it コマンドを使用します。 次の例では、e69e056c702d はコンテナー ID です。

    docker exec -it e69e056c702d "bash"
    

    ヒント

    常にコンテナー ID 全体を指定する必要はありません。 一意に識別するのに十分な文字を指定するだけでかまいません。 したがって、この例では、完全な ID ではなく e6 または e69 を使用すれば十分な可能性があります。 コンテナー ID を確認するには、docker ps -a コマンドを実行します。

  2. コンテナー内では、完全なパスで sqlcmd とローカル接続します。

    /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'
    

    注意

    sqlcmd の新しいバージョンは、既定でセキュリティで保護されています。 接続の暗号化の詳細については、Windows 用「sqlcmd ユーティリティ 」および Linux および macOS 用「sqlcmdを使用した接続」をご覧ください。 接続が成功しない場合は、 -No オプションを sqlcmd に追加して、暗号化が必須ではなくオプションであることを指定できます。

  3. sqlcmd が終了したら、「exit」と入力します。

  4. 対話型コマンド プロンプトでの操作が完了したら、「exit」と入力します。 コンテナーは、対話型の Bash シェルを終了した後も引き続き実行されます。

コンテナーのバージョンを確認する

実行中のコンテナー内の SQL Server のバージョンを知りたい場合は、次のコマンドを実行して表示します。 <Container ID or name> はターゲット コンテナーの ID または名前で置き換えます。 <YourStrong!Passw0rd> はシステム管理者 (SA) アカウントの SQL Server パスワードで置き換えます。

sudo docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P '<YourStrong!Passw0rd>' \
-Q 'SELECT @@VERSION'

注意

sqlcmd の新しいバージョンは、既定でセキュリティで保護されています。 接続の暗号化の詳細については、Windows 用「sqlcmd ユーティリティ 」および Linux および macOS 用「sqlcmdを使用した接続」をご覧ください。 接続が成功しない場合は、 -No オプションを sqlcmd に追加して、暗号化が必須ではなくオプションであることを指定できます。

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd `
-S localhost -U SA -P "<YourStrong!Passw0rd>" `
-Q "SELECT @@VERSION"

注意

sqlcmd の新しいバージョンは、既定でセキュリティで保護されています。 接続の暗号化の詳細については、Windows 用「sqlcmd ユーティリティ 」および Linux および macOS 用「sqlcmdを使用した接続」をご覧ください。 接続が成功しない場合は、 -No オプションを sqlcmd に追加して、暗号化が必須ではなくオプションであることを指定できます。

docker exec -it <Container ID or name> /opt/mssql-tools/bin/sqlcmd ^
-S localhost -U SA -P "<YourStrong!Passw0rd>" ^
-Q "SELECT @@VERSION"

注意

sqlcmd の新しいバージョンは、既定でセキュリティで保護されています。 接続の暗号化の詳細については、Windows 用「sqlcmd ユーティリティ 」および Linux および macOS 用「sqlcmdを使用した接続」をご覧ください。 接続が成功しない場合は、 -No オプションを sqlcmd に追加して、暗号化が必須ではなくオプションであることを指定できます。

ターゲットのコンテナー イメージの SQL Server バージョンとビルド番号を特定することもできます。 次のコマンドでは、mcr.microsoft.com/mssql/server:2022-latest イメージの SQL Server バージョンとビルド情報が表示されます。 これは、環境変数 PAL_PROGRAM_INFO=1 を使用して新しいコンテナーを実行することで行われます。 結果のコンテナーはすぐに終了し、docker rm コマンドによって削除されます。

sudo docker run -e PAL_PROGRAM_INFO=1 --name sqlver \
-ti mcr.microsoft.com/mssql/server:2022-latest && \
sudo docker rm sqlver
docker run -e PAL_PROGRAM_INFO=1 --name sqlver `
-ti mcr.microsoft.com/mssql/server:2022-latest; `
docker rm sqlver
docker run -e PAL_PROGRAM_INFO=1 --name sqlver ^
-ti mcr.microsoft.com/mssql/server:2022-latest && ^
docker rm sqlver

上記のコマンドでは、次の出力のようなバージョン情報が表示されます。

sqlservr
  Version 16.0.1000.6
  Build ID d81e9b6de06534e649bd57dd609aa3050f5e380f361b7f8a80a80eeb71e7422c
  Build Type release
  Git Version 2aede92f
  Built at Tue Nov 01 06:11:40 GMT 2022

PAL
  Build ID 754097e8f0db68f559e1cbc9d46952ac9fd518b5da9f12964ef40fc9033720e3
  Build Type release
  Git Version d88e3e1130
  Built at Tue Nov 01 06:08:02 GMT 2022

Packages
  system.security                         mssql-16.0.1000.6_26_official-release
  system.certificates                     mssql-16.0.1000.6_26_official-release
  sqlagent                                16.0.1000.6
  system.wmi                              10.0.17763.2061.202107231
  system.netfx                            4.7.0.0.202104262
  system                                  mssql-16.0.1000.6_26_official-release
  system.common                           10.0.17763.2061.202107231
  sqlservr                                16.0.1000.6
  secforwarderxplat                       16.0.1000.6

特定の SQL Server コンテナー イメージを実行する

注意

  • SQL Server 2019 (15.x) CU3 以降では、Ubuntu 18.04 がサポートされています。
  • SQL Server 2019 (15.x) CU10 以降では、Ubuntu 20.04 がサポートされています。
  • mssql/server で使用可能なタグの一覧は、https://mcr.microsoft.com/v2/mssql/server/tags/list でご確認ください。

最新の SQL Server コンテナー イメージを使用したくないシナリオもあります。 特定の SQL Server コンテナー イメージを実行するには、次の手順を使用します。

  1. 使用するリリースの Docker tagを特定します。 使用可能なタグを表示するには、Microsoft アーティファクト レジストリを参照してください。

  2. タグを使用して SQL Server コンテナー イメージをプルします。 たとえば、2019-CU18-ubuntu-20.04 イメージをプルするには、次のコマンドの <image_tag>2019-CU18-ubuntu-20.04 に置き換えます。

    docker pull mcr.microsoft.com/mssql/server:<image_tag>
    
  3. そのイメージを使用して新しいコンテナーを実行するには、docker run コマンド内でタグ名を指定します。 次のコマンド内の <image_tag> を、実行するバージョンに置き換えます。

    重要

    SA_PASSWORD 環境変数は非推奨です。 代わりに MSSQL_SA_PASSWORD を使用してください

    docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:<image_tag>
    

これらの手順は、既存のコンテナーをダウングレードするためにも使用できます。 たとえば、実行中のコンテナーをロールバックまたはダウングレードして、トラブルシューティングやテストを行うことができます。 実行中のコンテナーをダウングレードするには、データ フォルダーの永続化手法を使用する必要があります。 アップグレードのセクションで説明したのと同じ手順に従いますが、新しいコンテナーを実行するときに、古いバージョンのタグ名を指定します。

RHEL ベースのコンテナー イメージを実行する

SQL Server Linux コンテナー イメージに関するドキュメントは、Ubuntu ベースのコンテナーを指しています。 SQL Server 2019 (15.x) 以降では、Red Hat Enterprise Linux (RHEL) に基づくコンテナーを使用できます。 RHEL のイメージの例は、mcr.microsoft.com/mssql/rhel/server:2019-CU15-rhel-8 のようになります。

たとえば、次のコマンドでは、RHEL 8 を使用する SQL Server 2019 (15.x) コンテナー用 Cumulative Update 18 をプルします。

sudo docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4
docker pull mcr.microsoft.com/mssql/rhel/server:2019-CU18-rhel-8.4

実稼働のコンテナー イメージを実行する

前のセクションのクイックスタートでは、Microsoft アーティファクト レジストリから SQL Server の無償の Developer エディションが実行されます。 Enterprise Edition、Standard Edition、Web Edition などの実稼働のコンテナー イメージを実行する場合でも、ほとんどの情報が適用されます。 しかし、違う点もいくつかあります。それをここで概説します。

  • 有効なライセンスを持っている場合にのみ、運用環境内で SQL Server を使用できます。 無償の SQL Server Express 運用ライセンスはこちらで入手できます。 SQL Server Standard Edition と Enterprise Edition のライセンスは、Microsoft ボリューム ライセンスを通じて入手できます。

  • Developer コンテナー イメージは、実稼働エディションを実行するように構成することもできます。

運用エディションを実行するには、要件を確認して、クイックスタートの手順を実行します。 MSSQL_PID 環境変数を使用して、実稼働エディションを指定する必要があります。 次の例は、Enterprise Core エディションの最新の SQL Server 2022 (16.x) コンテナー イメージを実行する方法を示しています。

docker run --name sqlenterprise \
-e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-e 'MSSQL_PID=EnterpriseCore' -p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run --name sqlenterprise `
-e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-e "MSSQL_PID=EnterpriseCore" -p 1433:1433 `
-d "mcr.microsoft.com/mssql/server:2022-latest"
docker run --name sqlenterprise ^
-e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-e "MSSQL_PID=EnterpriseCore" -p 1433:1433 ^
-d "mcr.microsoft.com/mssql/server:2022-latest"

重要

Y を環境変数 ACCEPT_EULA に渡し、エディション値を MSSQL_PID に渡すことによって、使用する予定の SQL Server のエディションとバージョンに対して有効な既存のライセンスがあることを示しています。 また、コンテナー イメージ内で実行されている SQL Server ソフトウェアの使用は SQL Server ライセンスの条項によって管理されることに同意します。

注意

MSSQL_PID に使用できる値の完全な一覧については、「Linux 上の SQL Server の設定を環境変数で構成する」を参照してください。

複数の SQL Server コンテナーを実行する

Docker には、同じホスト マシン上で複数の SQL Server コンテナーを実行する方法が用意されています。 このアプローチは、同じホスト上に複数の SQL Server インスタンスを必要とするシナリオで使用します。 各コンテナーは、異なるポート上で公開される必要があります。

次の例では、2 つの SQL Server 2017 (14.x) コンテナーを作成して、ホスト マシン上のポート 14011402 にマップします。

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2017-latest

次の例では、2 つの SQL Server 2019 (15.x) コンテナーを作成して、ホスト マシン上のポート 14011402 にマップします。

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2019-latest

次の例では、2 つの SQL Server 2022 (16.x) コンテナーを作成して、ホスト マシン上のポート 14011402 にマップします。

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1401:1433 -d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1402:1433 -d mcr.microsoft.com/mssql/server:2022-latest

これで、SQL Server の 2 つのインスタンスが別々のコンテナー内で実行されるようになりました。 クライアントは、コンテナー ホストの IP アドレスとコンテナーのポート番号を使用して、各 SQL Server インスタンスに接続できます。

注意

新しいバージョンの sqlcmd (mssql-tools18) は、既定でセキュリティで保護されています。 バージョン 18 以降を使用している場合は、No オプションを sqlcmd に追加して、暗号化が必須ではなくオプションであることを指定する必要があります。

sqlcmd -S 10.3.2.4,1401 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1402 -U SA -P '<YourPassword>'
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1401 -U SA -P "<YourPassword>"
sqlcmd -S 10.3.2.4,1402 -U SA -P "<YourPassword>"

コンテナー内の SQL Server をアップグレードする

Docker を使用してコンテナー イメージをアップグレードするには、まず、アップグレードするリリースのタグを特定します。 docker pull コマンドを使用して、このバージョンをレジストリからプルします。

docker pull mcr.microsoft.com/mssql/server:<image_tag>

これにより、作成した新しいコンテナーの SQL Server イメージが更新されますが、実行中のコンテナー内で SQL Server は更新されません。 これを行うには、最新の SQL Server コンテナー イメージを使用して新しいコンテナーを作成し、その新しいコンテナーにデータを移行する必要があります。

  1. 既存の SQL Server コンテナーに対してデータの保持手法の 1 つを使用していることを確認します。 これにより、同じデータを使用して新しいコンテナーを開始できます。

  2. docker stop コマンドを使用して SQL Server コンテナーを停止します。

  3. docker run を使用して新しい SQL Server コンテナーを作成し、マップされたホスト ディレクトリまたはデータ ボリューム コンテナーを指定します。 SQL Server のアップグレードには、必ず特定のタグを使用してください。 新しいコンテナーでは、新しいバージョンの SQL Server が既存の SQL Server データと共に使用されるようになります。

    重要

    現時点では、アップグレードは RC1、RC2、GA の間でのみサポートされます。

  4. 新しいコンテナー内のデータベースとデータを確認します。

  5. 必要に応じて、docker rm を使用して古いコンテナーを削除します。

  • クイックスタートに従って、Docker 上で SQL Server 2017 (14.x) のコンテナー イメージを開始する
  • クイックスタートに従って、Docker 上で SQL Server 2019 (15.x) のコンテナー イメージを開始する
  • クイックスタートに従って、Docker 上で SQL Server 2022 (16.x) のコンテナー イメージを開始する

SQL ドキュメントへの投稿

SQL コンテンツを自分で編集できることはご存じですか。 これにより、ドキュメントが改善されるだけでなく、ページの共同作成者としてもクレジットされます。

詳細については、「SQL Server のドキュメントに投稿する方法」を参照してください。