Dockerをなぜ使うか
コンテナオーケストレーション(1章)読んだ内容をまとめます。1.4, 1.5 はたいぶサマリました。書籍に詳細が記載されていない(リンクは記載あり)が重要そうな用語(ペット対家畜など)については別途調べて補足しています。
1.1 ソフトウェアの所有からサービスの利用へ
時代 | 物理サーバ時代 | 仮想サーバ時代 | クラウドコンピューティング時代 |
---|---|---|---|
概要 | DCにサーバを構築して、運用 | ハイパーバイザによるサーバの仮想化 | SaaS/PaaS/IaaS |
メリット | - | ・計算資源を物理サーバよりも効率的に扱うことができる ・素早くサーバーを利用できるようになった ・スケールアップ/スケールダウンが容易にできるようになった |
・時間単位で計算資源を利用できるようになった |
デメリット | ・ハードウェアが故障するリスク ・サポート期間/耐用年数 ・調達のためのコスト |
・ハードウェアは所有するため、物理サーバ調達に関するリスク ・コストはかかる |
- |
オペレーション自動化技術の普及
- より効率的にインフラを管理できる
- 構成管理ツール
- プロビジョニングツール
- Infrastracture as Code
インフラ計算資源の考え方の変化
アプリケーションのポーダビリティが課題
- 複数の環境
- 個人の開発機
- CI/CD環境
- ステージング環境
- プロダクション環境
- プラットフォームを横断して間違いなく動くアプリケーションが必要
- ローカルの仮想環境をクラウドに持っていくことは大変
- 仮想イメージのサイズが大きい(数GB)
- 構成管理ツールだけでは不十分
- 冪等性は常には保たれない。冪等性も担保は難しい。
- 正常性のチェックが必要
- ローカルの仮想環境をクラウドに持っていくことは大変
- 複数の環境
コンテナを利用することで環境を問わず、確実にアプリケーションを動作させることができる
1.2 コンテナ技術とDockerプラットフォーム仕様
仮想化とクラウドで発生した課題は「アプリケーションの実行環境を素早く確実に構築すること」
上記の課題の解決策としては以下の3つが考えられる
しかし、開発/ステージング/プロダクション環境の環境差異によって、アプリケーションを確実に動かせない場合がある。構成管理ツールも設定ファイルどおりに自動設定を試みるが、100%動く環境を保証するわけではない。
- Docker
- コンテナとしてのプロセスを簡単に扱えるソフトウェアとプラットフォーム
- Linuxのコンテナ技術を利用し、アプリケーションをコンテナとして動かすことで100%動く環境を目指した
- イメージ形式
- 標準的な操作コマンド
- 実行環境の決定
1.3 コンテナの利点
コンテナが実現すること
- 可搬性(ポータビリティ)
- 隔離性
コンテナの性質
- 不変性(Immutable)
- 廃棄容易性(Disposable)
1.4 コンテナからオーケストレーションへ
コンテナランタイム
- 高レイヤランタイム
- kubeletからPod生成などの指示を処理
- unix socket経由のgRPCで通信
- CRIという標準仕様
- containerd
- cri-o
- rkt
- 低レイヤランタイム
- 高レイヤランタイムの指示でコンテナ作成
- OCIという標準仕様
- runC
- gVisor
- Kata Containers
- 高レイヤランタイム
オーケストレーションの必要性
- 複数台のサーバーでコンテナを管理する必要がある
- クラスタを構成するノードとリソースの管理
- アプリケーションのスケジューリング
- 複数台のサーバーでコンテナを管理する必要がある
1.5 コンテナとオーケストレーションの共通規格化
CNCF
- 最先端のクラウドネイティブなアプリケーションやサービス開発の促進
クラウドネイティブ
- オープンソフトウェアのスタックを使い、コンテナ化を実現し、マイクロサービスのアプリケーションを動かせるようにこと
- コンテナ化
- 動的編成
- マイクロサービス指向
- オープンソフトウェアのスタックを使い、コンテナ化を実現し、マイクロサービスのアプリケーションを動かせるようにこと
感想
今までコンテナがなぜ普及したのか、またそのメリットについてあまりピンとこなかった。より素早くサービスをリリースしたいというビジネスニーズを満たすためにクラウドを利用していく必要があることがわかる。ハードウェアの所有からサービスの利用である。ソフトウェアの歴史から紐解いていくと、物理サーバから仮想化、クラウドという変遷の中でどういった課題があって、どう乗り越えてきたか理解しやすい。クラウド上でのサービス展開する上でアプリケーションの可搬性(ポータビリティ)の確保は重要であることを認識した。開発環境、ステージング環境、プロダクション環境、CI/CD環境で同じように動くアプリケーションとその実行環境を提供できることが素早い確実なサービス展開につながる。Dockerはどの環境でも確実に動き、開発者運用者が利用しやすいコンテナプラットフォームを提供している。
また構成管理ツールによる冪等性は必ずしも100%動作する環境を提供するわけではない。というのは当たり前かもしれないが新鮮な視点ではあった。