SQL Server Docker コンテナーを構成およびカスタマイズするConfigure and customize SQL Server Docker containers

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

この記事では、お使いのデータの永続化、コンテナーからのファイルの移動、既定の設定の変更など、SQL Server Docker コンテナーを構成およびカスタマイズする方法について説明します。This article explains how you can configure and customize SQL Server Docker containers, such as persisting your data, moving files from and to containers, and changing default settings.

カスタマイズしたコンテナーを作成するCreate a customized container

独自の Dockerfile を作成して、カスタマイズされた SQL Server コンテナーを作成することができます。It is possible to create your own Dockerfile to create a customized SQL Server container. 詳しくは、SQL Server とノード アプリケーションを組み合わせたデモをご覧ください。For more information, see a demo that combines SQL Server and a Node application. 独自の Dockerfile を作成する場合は、フォアグラウンド プロセスに注意してください。このプロセスによってコンテナーの有効期間が制御されるためです。If you do create your own Dockerfile, be aware of the foreground process, because this process controls the life of the container. それが存在する場合、コンテナーはシャットダウンされます。If it exits, the container will shut down. たとえば、スクリプトを実行して SQL Server を開始する場合は、SQL Server プロセスが一番右のコマンドであることを確認します。For example, if you want to run a script and start SQL Server, make sure that the SQL Server process is the right-most command. その他のコマンドはすべてバックグラウンドで実行されます。All other commands are run in the background. 次のコマンドは、Dockerfile 内でのこのことを示しています。The following command illustrates this inside a Dockerfile:

/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr

前の例のコマンドを元に戻した場合、do-my-sql-commands.sh スクリプトの完了時にコンテナーはシャットダウンされます。If you reversed the commands in the previous example, the container would shut down when the do-my-sql-commands.sh script completes.

データを保持するPersist your data

docker stopdocker start を使用してコンテナーを再起動しても、SQL Server の構成変更とデータベース ファイルはコンテナーに保持されています。Your SQL Server configuration changes and database files are persisted in the container even if you restart the container with docker stop and docker start. 一方、docker rm を使用してコンテナーを削除すると、SQL Server とデータベースを含め、コンテナーの内容がすべて削除されます。However, if you remove the container with docker rm, everything in the container is deleted, including SQL Server and your databases. 次のセクションでは、関連付けられているコンテナーが削除された場合でも、データ ボリューム を使用してデータベース ファイルを保持する方法について説明します。The following section explains how to use data volumes to persist your database files even if the associated containers are deleted.

重要

SQL Server の場合、Docker 内でのデータの保持について理解しておくことが重要です。For SQL Server, it is critical that you understand data persistence in Docker. このセクションの説明に加えて、Docker コンテナー内でデータを管理する方法については、Docker のドキュメントをご覧ください。In addition to the discussion in this section, see Docker's documentation on how to manage data in Docker containers.

ホスト ディレクトリをデータ ボリュームとしてマウントするMount a host directory as data volume

1 つ目のオプションは、ホスト上のディレクトリをコンテナー内のデータ ボリュームとしてマウントすることです。The first option is to mount a directory on your host as a data volume in your container. これを行うには、docker run コマンドを -v <host directory>:/var/opt/mssql フラグと共に使用します。To do that, use the docker run command with the -v <host directory>:/var/opt/mssql flag. これにより、コンテナーの実行間でデータを復元できます。This allows the data to be restored between container executions.

注意

SQL Server 2019 コンテナーは自動的に非ルートとして起動するのに対し、SQL Server 2017 コンテナーは既定でルートとして起動します。SQL Server 2019 containers automatically start up as non-root, while SQL Server 2017 containers start as root by default. SQL Server コンテナーを非ルートとして実行する方法の詳細については、セキュリティの構成に関するページを参照してください。For more information on running SQL Server containers as non-root, see Configure security.

docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" -p 1433:1433 -v <host directory>/data:/var/opt/mssql/data -v <host directory>/log:/var/opt/mssql/log -v <host directory>/secrets:/var/opt/mssql/secrets -d mcr.microsoft.com/mssql/server:2019-latest

この手法では、Docker の外部にあるホスト上のファイルを共有して表示することもできます。This technique also enables you to share and view the files on the host outside of Docker.

重要

Windows 上の Docker のホスト ボリューム マッピングでは現在のところ、完全な /var/opt/mssql ディレクトリをマッピングできません。Host volume mapping for Docker on Windows does not currently support mapping the complete /var/opt/mssql directory. ただし、/var/opt/mssql/data など、サブディレクトリをホスト コンピューターにマッピングできます。However, you can map a subdirectory, such as /var/opt/mssql/data to your host machine.

現時点では、SQL Server on Linux イメージを使用した Mac 上の Docker のホスト ボリューム マッピングはサポートされていません。Host volume mapping for Docker on Mac with the SQL Server on Linux image is not supported at this time. 代わりにデータ ボリューム コンテナーを使用してください。Use data volume containers instead. この制限は、/var/opt/mssql ディレクトリに固有のものです。This restriction is specific to the /var/opt/mssql directory. マウントされたディレクトリからの読み取りは正常に機能します。Reading from a mounted directory works fine. たとえば、Mac 上で -v を使用してホスト ディレクトリをマウントし、ホスト上に存在する .bak ファイルからバックアップを復元することができます。For example, you can mount a host directory using -v on Mac and restore a backup from a .bak file that resides on the host.

データ ボリューム コンテナーを使用するUse data volume containers

2 つ目のオプションは、データ ボリューム コンテナーを使用することです。The second option is to use a data volume container. -v パラメーターを使用してホスト ディレクトリではなくボリューム名を指定して、データ ボリューム コンテナーを作成できます。You can create a data volume container by specifying a volume name instead of a host directory with the -v parameter. 次の例では、sqlvolume という名前の共有データ ボリュームを作成します。The following example creates a shared data volume named sqlvolume.

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

注意

実行コマンド内でデータ ボリュームを暗黙的に作成するためのこの手法は、以前のバージョンの Docker では動作しません。This technique for implicitly creating a data volume in the run command does not work with older versions of Docker. その場合は、Docker のドキュメント、「データ ボリューム コンテナーの作成とマウント」に概説されている明示的な手順を使用します。In that case, use the explicit steps outlined in the Docker documentation, Creating and mounting a data volume container.

このコンテナーを停止して削除しても、データ ボリュームは保持されます。Even if you stop and remove this container, the data volume persists. docker volume ls コマンドを使用して表示できます。You can view it with the docker volume ls command.

docker volume ls

その後、同じボリューム名を持つ別のコンテナーを作成すると、新しいコンテナーでは、ボリュームに含まれているのと同じ SQL Server データが使用されます。If you then create another container with the same volume name, the new container uses the same SQL Server data contained in the volume.

データ ボリューム コンテナーを削除するには、docker volume rm コマンドを使用します。To remove a data volume container, use the docker volume rm command.

警告

データ ボリューム コンテナーを削除すると、コンテナー内のすべての SQL Server データがすべて 完全に 削除されます。If you delete the data volume container, any SQL Server data in the container is permanently deleted.

バックアップと復元Backup and restore

これらのコンテナー手法に加えて、標準の SQL Server バックアップと復元の手法を使用することもできます。In addition to these container techniques, you can also use standard SQL Server backup and restore techniques. バックアップ ファイルを使用して、データを保護したり、別の SQL Server インスタンスにデータを移動したりすることができます。You can use backup files to protect your data or to move the data to another SQL Server instance. 詳細については、「Linux 上での SQL Server データベースのバックアップと復元」を参照してください。For more information, see Backup and restore SQL Server databases on Linux.

警告

バックアップを作成する場合は、必ずコンテナーの外部でバックアップ ファイルを作成またはコピーしてください。If you do create backups, make sure to create or copy the backup files outside of the container. そうしないと、コンテナーが削除された場合に、バックアップ ファイルも削除されます。Otherwise, if the container is removed, the backup files are also deleted.

コンテナーからファイルをコピーするCopy files from a container

コンテナーからファイルをコピーするには、次のコマンドを使用します。To copy a file out of the container, use the following command:

docker cp <Container ID>:<Container path> <host path>

コンテナー ID は、docker ps -a コマンドの実行で取得できます。You can get the Container ID by running the command docker ps -a.

例:Example:

docker cp d6b75213ef80:/var/opt/mssql/log/errorlog /tmp/errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog

コンテナーにファイルをコピーするCopy files into a container

コンテナーにファイルをコピーするには、次のコマンドを使用します。To copy a file into the container, use the following command:

docker cp <Host path> <Container ID>:<Container path>

例:Example:

docker cp /tmp/mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data

タイムゾーンを構成するConfigure the timezone

特定のタイムゾーンを持つ Linux コンテナー内で SQL Server を実行するには、TZ 環境変数を構成します。To run SQL Server in a Linux container with a specific timezone, configure the TZ environment variable. 適切なタイムゾーン値を検索するには、Linux bash プロンプトから tzselect コマンドを実行します。To find the right timezone value, run the tzselect command from a Linux bash prompt:

tzselect

タイムゾーンを選択すると、tzselect に次のような出力が表示されます。After selecting the timezone, tzselect displays output similar to the following:

The following information has been given:

        United States
        Pacific

Therefore TZ='America/Los_Angeles' will be used.

この情報を使用して、Linux コンテナー内で同じ環境変数を設定できます。You can use this information to set the same environment variable in your Linux container. 次の例は、Americas/Los_Angeles タイムゾーンのコンテナー内で SQL Server を実行する方法を示しています。The following example shows how to run SQL Server in a container in the Americas/Los_Angeles timezone:

sudo docker run -e 'ACCEPT_EULA=Y' -e 'A_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles'\
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2017-latest 
sudo docker run -e 'ACCEPT_EULA=Y' -e "SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 ^
-e "TZ=America/Los_Angeles" ^
-d mcr.microsoft.com/mssql/server:2017-latest 
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
   -p 1433:1433 --name sql1 \
   -e 'TZ=America/Los_Angeles'\
   -d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
   -p 1433:1433 --name sql1 `
   -e "TZ=America/Los_Angeles" `
   -d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
   -p 1433:1433 --name sql1 `
   -e "TZ=America/Los_Angeles" `
   -d mcr.microsoft.com/mssql/server:2019-latest

既定のファイルの場所を変更するChange the default file location

ご利用の docker run コマンド内にデータ ディレクトリを変更するための MSSQL_DATA_DIR 変数を追加してしてから、ご利用のコンテナーのユーザーがアクセスできるその場所にボリュームをマウントします。Add the MSSQL_DATA_DIR variable to change your data directory in your docker run command, then mount a volume to that location that your container’s user has access to.

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=MyStrongPassword' -e 'MSSQL_DATA_DIR=/my/file/path' -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e "SA_PASSWORD=MyStrongPassword" -e "MSSQL_DATA_DIR=/my/file/path" -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" -e "MSSQL_DATA_DIR=/my/file/path" -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=MyStrongPassword' -e 'MSSQL_DATA_DIR=/my/file/path' -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e "SA_PASSWORD=MyStrongPassword" -e "MSSQL_DATA_DIR=/my/file/path" -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=MyStrongPassword" -e "MSSQL_DATA_DIR=/my/file/path" -v /my/host/path:/my/file/path -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

次のステップNext steps

  • クイックスタートに従って、Docker 上で SQL Server 2017 のコンテナー イメージを開始するGet started with SQL Server 2017 container images on Docker by going through the quickstart
  • クイックスタートに従って、Docker 上で SQL Server 2019 のコンテナー イメージを開始するGet started with SQL Server 2019 container images on Docker by going through the quickstart