技術メモ

技術メモ

ラフなメモ

Dockerをなぜ使うか

コンテナオーケストレーション(1章)読んだ内容をまとめます。1.4, 1.5 はたいぶサマリました。書籍に詳細が記載されていない(リンクは記載あり)が重要そうな用語(ペット対家畜など)については別途調べて補足しています。

1.1 ソフトウェアの所有からサービスの利用へ

時代 物理サーバ時代 仮想サーバ時代 クラウドコンピューティング時代
概要 DCにサーバを構築して、運用 ハイパーバイザによるサーバの仮想化 SaaS/PaaS/IaaS
メリット - ・計算資源を物理サーバよりも効率的に扱うことができる
・素早くサーバーを利用できるようになった
・スケールアップ/スケールダウンが容易にできるようになった
・時間単位で計算資源を利用できるようになった
デメリット ・ハードウェアが故障するリスク
・サポート期間/耐用年数
・調達のためのコスト
・ハードウェアは所有するため、物理サーバ調達に関するリスク
・コストはかかる
-
  • オペレーション自動化技術の普及

    • より効率的にインフラを管理できる
    • 構成管理ツール
    • プロビジョニングツール
    • Infrastracture as Code
  • インフラ計算資源の考え方の変化

    • ペット対家畜
      • ペット
        • クラウド以前の設計思想
        • サーバ1台1台を大切に扱う
        • 機器の二重化
        • インフラ担当による24/365の監視
      • 家畜
        • クラウドの設計思想
        • 仮想サーバ、仮想インスタンスは一つ一つの可用性は追求しない。サーバは落ちることを前提にしてより上位層で可用性を担保する設計思想
        • 調子が悪いサーバは復旧するのではなく、落として新しいサーバを立ち上げるイメージ
  • アプリケーションのポーダビリティが課題

    • 複数の環境
      • 個人の開発機
      • CI/CD環境
      • ステージング環境
      • プロダクション環境
    • プラットフォームを横断して間違いなく動くアプリケーションが必要
      • ローカルの仮想環境をクラウドに持っていくことは大変
        • 仮想イメージのサイズが大きい(数GB)
      • 構成管理ツールだけでは不十分
        • 冪等性は常には保たれない。冪等性も担保は難しい。
        • 正常性のチェックが必要
  • コンテナを利用することで環境を問わず、確実にアプリケーションを動作させることができる

1.2 コンテナ技術とDockerプラットフォーム仕様

仮想化とクラウドで発生した課題は「アプリケーションの実行環境を素早く確実に構築すること」

上記の課題の解決策としては以下の3つが考えられる

  • 仮想マシンイメージの活用
  • 構成管理ツールやデプロイツールの活用
  • インフラのコード化(IoC)

しかし、開発/ステージング/プロダクション環境の環境差異によって、アプリケーションを確実に動かせない場合がある。構成管理ツールも設定ファイルどおりに自動設定を試みるが、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%動作する環境を提供するわけではない。というのは当たり前かもしれないが新鮮な視点ではあった。