新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

学習記録:Docker

参考文献

Dockerコンテナ実践検証 (Think IT Books)

Dockerコンテナ実践検証 (Think IT Books)

第1章 Dockerが注目されている理由を探る

サーバ仮想化方式ごとの特徴比較

コンテナ型 ハイパーバイザ型 ホスト型
仮想マシン OS部分を一部ホストOSと共有 VMごとにOSをインストール VMごとにOSをインストール
稼働OS 現状Linuxのみ Windows, Linux, 一部Unix WIndows, Linux, 一部Unix
利用開始までの時間 OSインストール不要なため短い OSインストール等の作業が発生するため長い OSインストール等の作業が発生するため長い
ネットワーク 標準ではホスト側のDocker専用NICとしか通信できない 任意の数のvNICを付与可能 任意の数のvNICを付与可能
リソース HDDリソースの指定不可。CPU,メモリについては割り当て上限指定可 CPU, メモリ, HDDについて割り当てを指定 CPU, メモリ, HDDについて割り当てを指定
オーバヘッド コンテナはホストOSから見て単一のプロセスなためほぼない アクセス経路がハイパーバイザのみなのでホスト型に比べると少ない アクセス経路が長いため一番オーバヘッドが大きい

Dockerの使い道

  • 最初の使い方:テスト環境

テストの度にコンテナを作成し,バグが発生した場合はコンテナをイメージとして保存することでバグ発生時の状態を再現できる。

  • 次のステップ:開発環境

必要な設定を構築してDockerイメージとして保存し,後は作成したイメージからコンテナを立ち上げるだけで開発環境を立ち上げることができる。

  • 最後に目指す使い方:本番環境

Webサービス等のサービス提供基盤での利用を目指す。コンテナだけをセキュアに外部公開するのは少々骨が折れるが,外部ツールと組み合わせることで実現可能。

第6章 ベアメタル環境とDockerコンテナ環境の性能比較/第8章 Dockerコンテナのパフォーマンス劣化とチューニング

ベアメタル環境との性能比較

コンテナ型の仮想化は軽量でリソース消費量が少ないが,ベアメタル環境に比べると性能劣化が発生する。
CentOS6.6の載った環境にRedmineMySQLをインストールしたベアメタル環境と,RedmineコンテナとMySQLコンテナを起動したDocker環境の2つに対して処理性能と負荷状況を測定した。

結論として,低負荷時にはベアメタル環境/Docker環境の差異はほとんどなかった。
一方,高負荷時には性能劣化が大きく,タイムアウトの発生率はベアメタル環境0%からDocker環境30%,レスポンスタイムは20倍以上の劣化となった。

上記の検証結果から,低負荷時やピーク負荷が予想できる場合であれば,コンテナを使用したシステムでもベアメタル環境と遜色ないパフォーマンスが発揮できることがわかった。
しかし高負荷時にはパフォーマンスが大きく劣化するため,IO負荷が高いファイルをコンテナ外に切り出すなどの対策が必要である。

パフォーマンス劣化の原因とチューニング

このパフォーマンス劣化の原因としては,Dockerが利用しているコピーオンライトデバイスが一因と考えられる。Dockerの利用するスパースファイルの領域をディスク領域に変更する場合と,コンテナで利用する一部のファイルをホストOSに切り出す場合の2つを検証した。
前者では通常時に比べて待ち時間とエラー率が50%程度改善し,後者は大幅にパフォーマンスが向上してHTTPリクエストエラーも検出されなくなった。

また,コンテナ内にRedmineMySQLの両方を入れた場合とRedmineMySQLの二つのコンテナに分けた場合の二つでも性能を比較した。
予想通り,コンテナを2つに分離した場合はパフォーマンスが劣化した。ネットワーク起因によるレスポンス悪化と,さらにDiskIOの劣化が顕著であった。

上記の検証結果から,IO負荷の高いファイルをコンテナ外に切り出したり,密接に関係するサービスは一つのコンテナにまとめることでパフォーマンスの劣化を防ぐことがわかった。
一方で,ファイルをコンテナ外に出すことでDockerの持つポータビリティが劣化したり,コンテナを一つにまとめることでメンテナンス性が低下するといったトレードオフがあることも考慮する必要がある。