クイック スタート:Docker を使用して SQL Server コンテナー イメージを実行する

適用対象: はいSQL Server (サポートされているすべてのバージョン) - Linux

注意

次に示す例では、docker.exe の使用を示していますが、これらのコマンドの多くは Podman でも機能します。 Docker コンテナー エンジンと同様の CLI が提供されています。 Podman の詳細は、こちらをご覧ください。

このクイック スタートでは、Docker を使用して SQL Server 2017 コンテナー イメージ mssql-server-linux をプルして実行します。 次に、sqlcmd と接続して最初のデータベースを作成し、クエリを実行します。

ヒント

SQL Server 2019 のコンテナーを実行する場合は、この記事の SQL Server 2019 バージョンを参照してください。

注意

  • SQL Server 2019 CU3 以降では、Ubuntu 18.04 がサポートされています。
  • SQL Server 2019 CU10 以降では、Ubuntu 20.04 がサポートされています。

このクイック スタートでは、Docker を使用して SQL Server 2019 コンテナー イメージ mssql-server-linux をプルして実行します。 次に、sqlcmd と接続して最初のデータベースを作成し、クエリを実行します。

ヒント

このクイック スタートでは、SQL Server 2019 のコンテナーを作成します。 SQL Server 2017 のコンテナーを作成する場合は、この記事の SQL Server 2017 バージョンを参照してください。

このイメージは、Ubuntu 20.04 に基づく Linux で実行されている SQL Server で構成されます。 イメージは Linux の Docker エンジン 1.8+ または Mac/Windows 用 Docker で使用することができます。 このクイックスタートでは特に、Linux イメージで SQL Server を使用することを中心に取り上げます。 Windows イメージについては言及しませんが、mssql-server-windows-developer Docker Hub ページで詳細を確認できます。

前提条件

2017 コンテナー イメージをプルし、実行する

次の手順を開始する前に、この記事で上述した推奨シェル (bash、PowerShell、または cmd) を選択していることを確認してください。

  1. Microsoft コンテナー レジストリから SQL Server 2017 Linux コンテナー イメージをプルします。

    sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
    
    docker pull mcr.microsoft.com/mssql/server:2017-latest
    
    docker pull mcr.microsoft.com/mssql/server:2017-latest
    

    ヒント

    SQL Server 2019 のコンテナーを実行する場合は、この記事の SQL Server 2019 バージョンを参照してください。

    前のコマンドから、最新の SQL Server 2017 コンテナー イメージがプルされます。 特定のイメージをプルしたい場合、コロンとタグ名 (たとえば mcr.microsoft.com/mssql/server:2017-GA-ubuntu) を追加します。 利用可能なすべてのイメージを表示するには、mssql-server Docker Hub のページを参照してください。

    この記事の bash コマンドには、sudo が使用されています。 macOS では、sudo が不要な場合があります。 Linux では、sudo を使用して Docker を実行したくない場合は、docker グループを構成して、そのグループにユーザーを追加できます。 詳細については、「Linux でのインストール後の手順」を参照してください。

  2. Docker でコンテナー イメージを実行する場合は、Bash シェル (Linux/macOS) または管理者特権での PowerShell コマンド プロンプトから次のコマンドを使用することができます。

    sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
       -p 1433:1433 --name sql1 -h sql1 \
       -d \
       mcr.microsoft.com/mssql/server:2017-latest
    

    注意

    PowerShell Core を使用している場合、二重引用符を一重引用符に置換します。

    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
       -p 1433:1433 --name sql1 -h sql1 `
       -d `
       mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
       -p 1433:1433 --name sql1 -h sql1 `
       -d `
       mcr.microsoft.com/mssql/server:2017-latest
    

    注意

    パスワードは SQL Server の既定のパスワード ポリシーに従う必要があります。従わない場合、コンテナーで SQL Server をセットアップできず、動作が停止します。 既定で、パスワードは 8 文字以上の長さにする必要があり、次の 4 つのセットのうち 3 つから文字を含める必要があります。大文字、小文字、10 進数、記号です。 docker ログ コマンドを実行することでエラー ログを調査することができます。

    既定では、これにより SQL Server 2017 Developer Edition のコンテナーが作成されます。 コンテナーで実稼働エディションを実行するためのプロセスは若干異なります。 詳細については、「Run production container images」(実稼働のコンテナー イメージを実行する) を参照してください。

    次の表は、前の docker run の例のパラメーターについて説明しています。

    パラメーター 説明
    -e "ACCEPT_EULA=Y" ACCEPT_EULA 変数を任意の値に設定し、使用許諾契約書の承諾を確定します。 SQL Server イメージの設定が必要です。
    -e "SA_PASSWORD=<YourStrong@Passw0rd>" 8 文字以上の、SQL Server のパスワード要件を満たす強力なパスワードを指定します。 SQL Server イメージの設定が必要です。
    -p 1433:1433 ホスト環境の TCP ポート (最初の値) とコンテナーの TCP ポート (2 番目の値) をマップします。 この例では、SQL Server がコンテナー内の TCP 1433 上でリッスンしており、これがホスト上のポート 1433 に公開されています。
    --name sql1 ランダムに生成された名前ではなく、コンテナーのカスタム名を指定します。 複数のコンテナーを実行する場合は、この同じ名前を再利用することはできません。
    -h sql1 コンテナーのホスト名を指定していない場合にこれを明示的に設定するために使用されます。既定では、ランダムに生成されたシステム GUID であるコンテナー ID に設定されています。
    -d コンテナーをバックグラウンド (デーモン) で実行します
    mcr.microsoft.com/mssql/server:2017-latest SQL Server 2017 Linux コンテナー イメージ。
  3. Docker コンテナーを表示するには、docker ps コマンドを使用します。

    sudo docker ps -a
    
    docker ps -a
    
    docker ps -a
    

    次のスクリーンショットのような出力が表示されます。

    Docker ps コマンドの出力

  4. [STATUS] 列に [Up] の状態が表示されている場合、SQL Server はコンテナーで実行されており、 [PORTS] 列に指定されたポートでリッスンしています。 SQL Server コンテナーの [STATUS] 列に [Exited] と表示されている場合は、構成ガイドのトラブルシューティングのセクションを参照してください。 SQL Server のエラー ログに SQL Server is now ready for client connections. This is an informational message; no user action is required というメッセージが表示されたら、接続の準備が整います。 次のコマンドを使用して、コンテナー内の SQL Server のエラー ログを確認できます。

    docker exec -t sqlrhel cat /var/opt/mssql/log/errorlog | grep connection
    

前述の -h (ホスト名) パラメーターは、コンテナーの内部名をカスタム値に変更します。 これは、次の Transact-SQL クエリで返される名前です。

SELECT @@SERVERNAME,
    SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
    SERVERPROPERTY('MachineName'),
    SERVERPROPERTY('ServerName')

ターゲット コンテナーを特定しやすくするため、-h--name を同じ値に設定することをお勧めします。

  1. 最後の手順として、SA_PASSWORDps -eax 出力に表示され、同じ名前の環境変数に格納されるため、SA パスワードを変更します。 以下の手順を参照してください。

2019 コンテナー イメージをプルし、実行する

次の手順を開始する前に、この記事で上述した推奨シェル (bash、PowerShell、または cmd) を選択していることを確認してください。

  1. Microsoft コンテナー レジストリから SQL Server 2019 Linux コンテナー イメージをプルします。

    sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
    

    注意

    PowerShell Core を使用している場合、二重引用符を一重引用符に置換します。

    docker pull mcr.microsoft.com/mssql/server:2019-latest
    
    docker pull mcr.microsoft.com/mssql/server:2019-latest
    

    ヒント

    このクイック スタートでは、SQL Server 2019 の Docker イメージを使用します。 SQL Server 2017 のイメージを実行する場合は、この記事の SQL Server 2017 バージョンを参照してください。

    上記のコマンドでは、Ubuntu に基づいて SQL Server 2019 のコンテナー イメージをプルします。 代わりに RedHat に基づくコンテナーイメージを使用するには、RHEL ベースのコンテナー イメージの実行に関するページを参照してください。 利用可能なすべてのイメージを表示する方法は、mssql-server-linux Docker Hub ページを参照してください。

    この記事の bash コマンドには、sudo が使用されています。 macOS では、sudo が不要な場合があります。 Linux では、sudo を使用して Docker を実行したくない場合は、docker グループを構成して、そのグループにユーザーを追加できます。 詳細については、「Linux でのインストール後の手順」を参照してください。

  2. Docker でコンテナー イメージを実行する場合は、Bash シェル (Linux/macOS) または管理者特権での PowerShell コマンド プロンプトから次のコマンドを使用することができます。

    sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
       -p 1433:1433 --name sql1 -h sql1 \
       -d mcr.microsoft.com/mssql/server:2019-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
       -p 1433:1433 --name sql1 -h sql1 `
       -d mcr.microsoft.com/mssql/server:2019-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" `
       -p 1433:1433 --name sql1 -h sql1 `
       -d mcr.microsoft.com/mssql/server:2019-latest
    

    注意

    パスワードは SQL Server の既定のパスワード ポリシーに従う必要があります。従わない場合、コンテナーで SQL Server をセットアップできず、動作が停止します。 既定で、パスワードは 8 文字以上の長さにする必要があり、次の 4 つのセットのうち 3 つから文字を含める必要があります。大文字、小文字、10 進数、記号です。 docker ログ コマンドを実行することでエラー ログを調査することができます。

    既定では、これにより SQL Server 2019 Developer Edition のコンテナーが作成されます。

    次の表は、前の docker run の例のパラメーターについて説明しています。

    パラメーター 説明
    -e "ACCEPT_EULA=Y" ACCEPT_EULA 変数を任意の値に設定し、使用許諾契約書の承諾を確定します。 SQL Server イメージの設定が必要です。
    -e "SA_PASSWORD=<YourStrong@Passw0rd>" 8 文字以上の、SQL Server のパスワード要件を満たす強力なパスワードを指定します。 SQL Server イメージの設定が必要です。
    -p 1433:1433 ホスト環境の TCP ポート (最初の値) とコンテナーの TCP ポート (2 番目の値) をマップします。 この例では、SQL Server がコンテナー内の TCP 1433 上でリッスンしており、これがホスト上のポート 1433 に公開されています。
    --name sql1 ランダムに生成された名前ではなく、コンテナーのカスタム名を指定します。 複数のコンテナーを実行する場合は、この同じ名前を再利用することはできません。
    -h sql1 コンテナーのホスト名を指定していない場合にこれを明示的に設定するために使用されます。既定では、ランダムに生成されたシステム GUID であるコンテナー ID に設定されています。
    mcr.microsoft.com/mssql/server:2019-latest SQL Server 2019 Ubuntu Linux コンテナー イメージ。
  3. Docker コンテナーを表示するには、docker ps コマンドを使用します。

    sudo docker ps -a
    
    docker ps -a
    
    docker ps -a
    

    次のスクリーンショットのような出力が表示されます。

    Docker ps コマンドの出力

  4. [STATUS] 列に [Up] の状態が表示されている場合、SQL Server はコンテナーで実行されており、 [PORTS] 列に指定されたポートでリッスンしています。 SQL Server コンテナーの [STATUS] 列に [Exited] と表示されている場合、「SQL Server Docker コンテナーのトラブルシューティング」を参照してください。

前述の -h (ホスト名) パラメーターは、コンテナーの内部名をカスタム値に変更します。 これにより、コンテナーの内部名がカスタム値に変更されます。 これは、次の Transact-SQL クエリで返される名前です。

SELECT @@SERVERNAME,
    SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
    SERVERPROPERTY('MachineName'),
    SERVERPROPERTY('ServerName')

ターゲット コンテナーを特定しやすくするため、-h--name を同じ値に設定することをお勧めします。

  1. 最後の手順として、SA_PASSWORDps -eax 出力に表示され、同じ名前の環境変数に格納されるため、SA パスワードを変更します。 以下の手順を参照してください。

SA パスワードの変更

SA アカウントは、セットアップ時に作成される SQL Server インスタンスのシステム管理者です。 SQL Server のコンテナーを作成した後、そのコンテナーで echo $SA_PASSWORD を実行すると、指定した環境変数 SA_PASSWORD が検索できるようになります。 セキュリティのため、SA のパスワードを変更してください。

  1. SA ユーザーに使用する強力なパスワードを選択します。

  2. docker exec を使用して sqlcmd を実行し、Transact-SQL でパスワードを変更します。 次の例では、古いパスワードと新しいパスワードはユーザー入力から読み込まれます。

    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
    -S localhost -U SA \
     -P "$(read -sp "Enter current SA password: "; echo "${REPLY}")" \
     -Q "ALTER LOGIN SA WITH PASSWORD=\"$(read -sp "Enter new SA password: "; echo "${REPLY}")\""
    
    
  1. SA ユーザーに使用する強力なパスワードを選択します。

  2. 次の例では、古いパスワード <YourStrong@Passw0rd> と新しいパスワード <YourNewStrong@Passw0rd> を実際のパスワード値に置き換えます。

    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourStrong@Passw0rd>" `
       -Q "ALTER LOGIN SA WITH PASSWORD='<YourNewStrong@Passw0rd>'"
    
  1. SA ユーザーに使用する強力なパスワードを選択します。

  2. 次の例では、古いパスワード <YourStrong@Passw0rd> と新しいパスワード <YourNewStrong@Passw0rd> を実際のパスワード値に置き換えます。

    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourStrong@Passw0rd>" `
       -Q "ALTER LOGIN SA WITH PASSWORD='<YourNewStrong@Passw0rd>'"
    

SQL Server への接続

次の手順では、SQL Server コマンドライン ツールの sqlcmd をコンテナー内で使用し、SQL Server に接続します。

  1. 実行中のコンテナー内で対話型の Bash シェルを開始するには、docker exec -it コマンドを使用します。 次の例の sql1 は、コンテナーを作成したときに --name パラメーターによって指定された名前です。

    sudo docker exec -it sql1 "bash"
    
    docker exec -it sql1 "bash"
    
    docker exec -it sql1 "bash"
    
  2. コンテナー内では sqlcmd とローカル接続してください。 既定では sqlcmd はパスにないため、完全なパスを指定する必要があります。

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "<YourNewStrong@Passw0rd>"
    

    ヒント

    コマンド ラインでパスワードを省略すると、入力を求められます。

  3. 成功すると、sqlcmd コマンド プロンプト 1> が表示されます。

データの作成とクエリ

後続のセクションでは sqlcmd と Transact-SQL to を使用し、新しいデータベースを作成し、データを追加し、クエリを実行します。

新しいデータベースの作成

次の手順では、TestDB という名前の新しいデータベースを作成します。

  1. sqlcmd のコマンド プロンプトに次の Transact-SQL コマンドを貼り付け、テスト データベースを作成します。

    CREATE DATABASE TestDB
    
  2. 次の行に、サーバー上のすべてのデータベースの名前を返すクエリを記述します。

    SELECT Name from sys.Databases
    
  3. 前の 2 つのコマンドは、すぐに実行されていません。 新しい行に「GO」と入力し、前のコマンドを実行します。

    GO
    

データの挿入

次に、新しいテーブル Inventory を作成し、2 つの新しい行を挿入します。

  1. sqlcmd のコマンド プロンプトで、コンテキストを新しい TestDB データベースに切り替えます。

    USE TestDB
    
  2. Inventory という名前の新しいテーブルを作成します。

    CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
    
  3. 新しいテーブルにデータを挿入します。

    INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
    
  4. GO」と入力して前のコマンドを実行します。

    GO
    

データの選択

ここで、Inventory テーブルからデータを返すクエリを実行します。

  1. sqlcmd のコマンド プロンプトで、数量が 152 より大きいInventory テーブルから行を返すクエリを入力します。

    SELECT * FROM Inventory WHERE quantity > 152;
    
  2. 次のコマンドを実行します。

    GO
    

sqlcmd コマンド プロンプトの終了

  1. sqlcmd セッションを終了するには、「QUIT」と入力します。

    QUIT
    
  2. コンテナー内で対話型のコマンド プロンプトを終了するには、exit と入力します。 コンテナーは、対話型の Bash シェルを終了した後も引き続き実行されます。

コンテナーの外からの接続

SQL 接続をサポートする外部の Linux、Windows、macOS ツールから、Docker コンピューターの SQL Server インスタンスに接続することもできます。

次の手順ではコンテナーの外で sqlcmd を使用して、コンテナーで実行されている SQL Server に接続します。 この手順は、コンテナーの外に SQL Server コマンド ライン ツールがインストール済みであることを前提としています。 他のツールを使用する場合にも同じ原則が適用されますが、接続するプロセスはツールごとに固有です。

  1. コンテナーをホストしているコンピューターの IP アドレスを探します。 Linux の場合、 ifconfig または ip addr を使用します。Windows の場合、ipconfig を使用します。

  2. この例では、sqlcmd ツールをクライアント マシン上にインストールします。 詳細については、Windows 上での sqlcmd のインストールまたは Linux 上での sqlcmd のインストールに関するページを参照してください。

  3. コンテナーのポート 1433 にマップされた IP アドレスとポートを指定して sqlcmd を実行します。 この例では、ホスト マシン上の同じポート 1433 です。 ホスト マシン上でマップされた別のポートを指定した場合は、ここにそれを使用します。 ファイアウォールで適切な受信ポートを開き、接続を許可する必要もあります。

    sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
    
    sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
    
    sqlcmd -S <ip_address>,1433 -U SA -P "<YourNewStrong@Passw0rd>"
    
  4. Transact-SQL コマンドを実行します。 終わったら、QUIT と入力します。

SQL Server に接続するその他の一般的なツールは次のとおりです。

コンテナーの削除

このチュートリアルで使用した SQL Server のコンテナーを削除する場合は、次のコマンドを実行します。

sudo docker stop sql1
sudo docker rm sql1
docker stop sql1
docker rm sql1
docker stop sql1
docker rm sql1

警告

コンテナーを完全に停止して削除すると、コンテナー内のすべての SQL Server データが削除されます。 データを保持する必要がある場合は、コンテナーからバックアップ ファイルを作成してコピーするか、コンテナー データを永続化する手法を使用します。

Docker のデモ

Docker の SQL Server コンテナー イメージを使用すると、開発とテストの改善のためにどのように Docker を使用できるかを知りたくなるかもしれません。 次のビデオは、継続的インテグレーションと展開シナリオでどのように Docker を使用できるかを説明しています。

次のステップ

データベース バックアップファイルをコンテナーに復元する方法については、「Restore a SQL Server database in a Linux Docker container」(Linux の Docker コンテナーで SQL Server データベースを復元する) を参照してください。 複数のコンテナーの実行、データ永続化トラブルシューティングなど、その他のシナリオを試してください。

リソース、フィードバック、既知の問題について、mssql-docker GitHub リポジトリも参照してください。