SQL Server エンジニア のための
コンテナ入門
2019年09月25日
NEC Solution Innovators, Ltd.
太田 智行
太田 智行
Walkmanと同い年
データベース技術ひと筋
SQL on Linux のアーキテクチャ
Linux向けにポーティングされたものではない
“SQLPAL”により長年稼働してきたWindowsコードを共有
SQL Platform Abstraction Layer
(SQLPAL)
RDBMS SSIS SSAS SSRS
Windows Linux
Windows Host Ext.
Linux Host
Extension
SQL Platform Abstraction Layer
(SQLPAL)
Host extension mapping to OS system calls
(IO, Memory, CPU scheduling)
Win32-like APIsSQL OS API
SQL OS v2
All other systems
System resource & latency
sensitive code paths
on Linux
on Container
on Kubernetes
Popular and Commonly Used
Portable, Lightweight, Immutable, Efficient
Orchestration, Scalable, Self Healing
lib
app
lib
app
lib
app
lib
app
lib
app
アプリを
動かしたい
ライブラリ
入手
サーバ(OS)
構築
HW
調達
課題
• HWパワーが足りなければイチカラ組みなおし。逆にHWが暇でも部分返品不可。
• 対応OSが異なるアプリを動かしたければ別途HW調達から必要。
課題解決:HW仮想化により都度のHW調達を削減
• 仮想マシンに割りあてるHWパワーを増減可能
• 必要OSが異なるなら別途仮想サーバーをたてればよい(HW調達不要)
• OSレベルの可搬性が生まれた(新しい仮想基盤への引っ越しが可能)
HW削減
lib
app
lib
app
lib
app
lib
app
lib
app
アプリを
動かしたい
ライブラリ
入手
サーバ(OS)
構築
HW
調達
さらなる課題
• 仮想サーバ内部の負荷凸凹をもっと最適化できないものか(仮想サーバを減らしOS
分のオーバーヘッドをカットしたい)
• HW調達の問題は根本解決に至っていない(仮想基盤HWのパワー不足、パワー余剰)
アプリを
動かしたい
ライブラリ
入手
サーバ(OS)
構築
HW
調達
HW削減
lib
app app app
lib lib
app
lib
app
lib
課題解決:アプリに可搬性を持たせ集積度を高めることでサーバを削減
• OSを含まないので可搬性が高く起動も早い≒必要な時に”どこかのリソース”を
使って稼働させるという考え方
• サーバ(OS)削減&HW削減、OSへのパッチ当てなどサーバ運用コスト削減
アプリを
動かしたい
ライブラリ
入手
サーバ(OS)
構築
HW
調達
HW削減
app
lib
app
lib
app
liblib
app app
lib
← サーバ(OS)削減(4->2)
lib
app
lib
app
lib
app
lib
app
lib
app
HW削減
lib
app app app
lib lib
app
lib
app
lib
HW削減
app
lib
app
lib
app
liblib
app app
lib
← サーバ(OS)削減(4->2)
リ
ソ
ー
ス
利
用
効
率
向
上
仮想化を選択するケース例
• 独立性が高い(OSを共有するコンテナに比較し有事他者影響が小さい)
• OSが選択可能(コンテナはOSに依存するため例えばWindows用に構成された
コンテナを稼働させるにはWindowsが必要)
HW削減
lib
app app
lib
app
lib
app
lib
app
lib
HW削減
app
lib
app
lib
app
liblib
app app
lib
← サーバ(OS)削減(4->2)
Edition
無償 Docker Engine – Community
(旧称:Docker Community Edition)
有償
Docker Engine – Enterprise
(旧称:Docker Enterprise - Basic)
Docker Enterprise
(旧称:Docker Enterprise - Standard、Docker Enterprise - Advanced )Overview of Docker editions
コンテナランタイムの動向
 2013年:Docker誕生(dotCloud社(現Docker社)がOSS公開)
 2014年:Everything at Google runs in a container
 2015年:コンテナ標準化団体 Open Container Initiative 誕生
 2017年:OCI Runtime Specification と OCI Image Format 誕生
 独自のコンテナランタイムが開発可能
 2017年:Container Runtime Interface(kubeletとコンテナランタイム間のI/F仕様)誕生
 独自のコンテナランタイムをKubernetesに組み込みやすくなった
入手
無償
Linux
リポジトリもしくはパッケージ
からインストール
Windows
Docker Desktop
for Windows
Mac
Docker Desktop
for Mac
有償
Linux
リポジトリもしくはパッケージ
からインストール
Windows
OneGet PowerShell Module
を使用してインストール
Docker
レジストリ
コンテナ
イメージ
Dockerfile
Docker
コンテナ
(停止)
pull
build
rmi
rm
run
start
exec
docker ... 解説
build コンテナイメージ作成
pull コンテナイメージ取得
run コンテナ作成&起動
stop コンテナ停止
start コンテナ起動
exec
指定したコマンドを
コンテナOS上で実行
rm コンテナ破棄
commit コンテナのイメージ化
push コンテナイメージ配信
rmi コンテナイメージ破棄
commitコンテナ
イメージ
V2
push
rm -f
Docker
コンテナ
(起動)
Docker
コンテナ
(破棄)
コンテナ
イメージ
破棄
stop
※ docker-composeユーティリティで
コンテナ群の一括制御も可能
マイクロソフト社公式のSQL
Serverコンテナイメージ
Developer Express
マイクロソフト社は独自のDockerレジストリMicrosoft Container Registry(MCR)を構築し、
現在 SQL Server もMCRから入手する(Docker Hubでも 引き続き最新のリストを検索可能)。
2019-RC1
SQL Server用の環境変数
SQL Server Container 作成&起動
命令(一部) 解説
COPY 指定したソースから、指定した対象のコンテナーにファイルがコピーされます。
CMD コンテナーの既定の実行可能ファイルが指定されます。 各 Dockerfile には、CMD 命令が
1 つのみ存在します。
ENV コンテナー内の環境変数の値が設定されます。
EXPOSE コンテナーが特定の TCP ポートまたは UDP ポートでリッスンすることが Docker に通知
されます。
RUN 現在のイメージの新しいレイヤーでコマンドが実行され、結果が新しいイメージにコ
ミットされます。
WORKDIR CMD、RUN、およびコマンドを実行するその他の命令のコンテナー内に作業ディレクト
リが設定されます。
% sudo docker history mcr.microsoft.com/mssql/server:2019-RC1 --no-trunc --format '{{ json .CreatedBy }}'
FROM <OS base image> 例:ubuntu:16.04
LABEL < Microsoft label info > 例:vendor="Microsoft"
EXPOSE 1433 コンテナ内のSQL Serverがリッスンするポート
COPY < SQL Server bin and lib > /opt/mssql/bin、/opt/mssql/lib
RUN ./install.sh 依存パッケージやツールのインストール
CMD ["/opt/mssql/bin/sqlservr”] SQL Serverの起動
SQL Server カスタム Dockerfile 例
Sample1
FROM mcr.microsoft.com/mssql/server:2017-CU16
COPY ./DevDB.bak /tmp/DevDB.bak
CMD ["/opt/mssql/bin/sqlservr"]
Sample2
FROM mcr.microsoft.com/mssql/server:2017-CU16
COPY . /
RUN chmod +x /db-init.sh
RUN chmod +x /entrypoint.sh
CMD /bin/bash ./entrypoint.sh
sleep 15s
/opt/mssql-tools/bin/sqlcmd –i ddl.sql
/db-init.sh & /opt/mssql/bin/sqlservr
CREATE DATABASE mydb
GO
CREATE TABLE mytable (….
GO
….
db-init.sh
entrypoint.sh
ddl.sql
ローカル プライベート レジストリ
% sudo docker run -d -p 5000:5000 --name localregistry
-v ~/dockerreg:/var/lib/registry registry:latest
https://hub.docker.com/_/registry/
https://github.com/docker/distribution/blob/master/LICENSE
Apache License 2.0
Azure Container Registry
https://docs.microsoft.com/ja-jp/learn/modules/build-and-
store-container-images/1-intro-to-azure-container-registry
https://docs.microsoft.com/ja-jp/azure/container-registry/?WT.mc_id=AZ-MVP-5002980
Azure Container Instances
https://docs.microsoft.com/ja-jp/azure/container-instances/?WT.mc_id=AZ-MVP-5002980
Non-Root SQL Server 2019 Containers (preview)
% docker build -t 2019-latest-non-root
https://aka.ms/mssql2019-non-root
% docker run -e "ACCEPT_EULA=Y" -e
"SA_PASSWORD=MyStrongP@ssword" --name sql1 -p
1433:1433 -d 2019-latest-non-root
% docker exec -it sql1 bash
% whoami
課題解決:アプリに可搬性を持たせることで集積度を高めるサーバを削減
• OSを含まないので可搬性が高く起動も早い≒必要な時に”どこかのリソース”を
使って稼働させる
• OS稼働分のHWリソース削減、OSへのパッチ当てなどサーバ運用コスト削減
アプリを
動かしたい
ライブラリ
入手
サーバ(OS)
構築
HW
調達
HW削減
app
lib
app
lib
app
liblib
app app
lib
← サーバ(OS)削減(4->2)
さらなる課題
• “どこかのリソース(最適なアプリの起動場所)”の判断、アプリ起動・停止、アプリ監視・
リカバリを瞬時に行うことは困難。
• 未だにHW調達の問題は根本解決に至っていない(コンテナ基盤HWのパワー不足、パワー余剰)。
アプリを
動かしたい
ライブラリ
入手
サーバ(OS)
構築
HW
調達
HW削減
app
lib
app
lib
app
liblib
app app
lib
app
liblib
app app
lib
YAML形式で記述した宣言コード
機能 概説
スケジューリング
とサービスディスカバリー
コンテナアプリケーション(Pod)の要件やその配置
先となるノードの状態を踏まえて最適なリソース配置
を動的に行う。
またその所在を管理・提供する。
セルフヒーリング プロセス監視やヘルスチェックを行い、異常を検知し
た際は宣言コードで定義されたシステムの形を維持す
るよう自己修復を行う。
スケーリング 負荷に応じてシステムに必要なPod数(≒処理パ
ワー)の自動調整を行う(自動スケールアップ機能は
アルファ段階)。
ロードバランシング 分散配置されたコンテナアプリケーションのロードバ
ランスに対応したエンドポイントを提供する(Podス
ケールにも対応)
K8s内部構造
kubectl
API server
replication, namespace,
serviceaccounts, etc.
Controller
manager scheduler
KVS(etcd)
Master
Node(Worker)
kubelet kube-proxy
Docker
Pod Pod
Containers Containers
Node(Worker)
Docker
Pod Pod
Internet
kubelet kube-proxy
Containers Containers
概説
Master クラスタの司令塔となるノード
API Server K8sを管理するためのREST API
Scheduler Podのスケジューリングを制御
Contoller
Manager
クラスタのセルフヒーリングを
制御
KVS(etcd) クラスターに関わる情報を格納
Node Podを動作させるワーカーノード
Pod
スケジューリングの最小単位と
なるコンテナアプリケーション
Pod内には1つ以上のコンテナが
定義可能
kubelet
API serverを通じてMasterと通信
しNode内を制御
kube-proxy 通信制御
Managed Kubernetes Service
Amazon Elastic
Kubernetes Service
Google
Kubernetes Engine
Microsoft Azure
Kubernetes Service
⇒ on Google Cloud Platform
⇒ on Microsoft Azure Platform
⇒ on Amazon Web Services Platform
Kubernetes the hard way
Kubernetes 開発貢献 Top10
https://k8s.devstats.cncf.io/d/9/companies-table?orgId=1&var-period_name=Last%20year&var-metric=contributions
Persistent Volume
User
Node
Pod
SQL Server
Node
Load Balance
Service
Node
Pod
SQL Server
Pod
SQL Server
⇒ サポートされている
Persistent Volumeの
一覧
AG
Pod
Operator
Pod
Load balancer
Pod
SQL Server
primary
AG agent
Pod
Load balancer
Pod
SQL Server
secondary
AG agent
Pod
SQL Server
secondary
AG agent
SQL Server
primary
SQL Server
secondary
Data Virtualization
ODBC NoSQL RDBMS Big Data
重複するストレージコスト
データパイプラインの構築と維持
データコピーに伴う鮮度劣化
セキュリティリスクの増大
ETL時のデータ品質問題の組み込み
ガバナンス制御の複雑化
Data
Virtualization
Big Data Cluster
2016 2025
16 ZBs 163 ZBs
of data was generated of data will generated
*IDC White Paper, Data Age 2025: The Evolution of Data to Life-Critical
Model
& serve
Store
Storage Pool
(HDFS)
Data Pool(Scale-out
SQL Data Mart)
Ingest
SQL Server
Integration
Services
Prep
& train
SQL Server
ML Services
Master
instance
Master instance
(SQL Server)
REST API
containers
for models
Big Data Cluster
パッケージングされたAIプラットフォーム
パッケージングされた構築済みAIプラットフォーム
on Linux
on Container
on Kubernetes
Popular and Commonly Used
Portable, Lightweight, Immutable, Efficient
Orchestration, Scalable, Self Healing
SQL Server runs anywhere !
3rd party
Cloud
SQL Database
Managed Instance
SQL
Database
Kubernetes
Service
SQL Server
on Azure VM
SQL Server
Database
Migration Service
SQL Data
Warehouse
3rd
On-Premises
Cloud
OpenShiftKubernetesContainerLinuxWindows
1.Docker(エンジン、管理クライアント)をインストール
2.% sudo docker run -e "ACCEPT_EULA=Y" -e
"SA_PASSWORD=P@ssword" --name sql19 -p 11433:1433 -d
mcr.microsoft.com/mssql/server:2019-latest
3.sudo docker exec sql19 /opt/mssql-tools/bin/sqlcmd -S
localhost -U sa -P P@ssword -Q “SELECT ‘Hello SQL Server
Container!’”

SQL Server エンジニアのためのコンテナ入門