Docker/Kubernetes実践コンテナ入門 復習(1)

Dockerの基礎

Dockerとは

  • コンテナ仮想化技術を実現するために実行される常駐アプリケーションとそれを操作するためのコマンドフロントインターフェース
  • ローカルで環境のセットアップが出来ていれば、コマンド一つで環境構築が可能
  • 仮想マシンより高速でローカル・サーバー間で環境を簡単に再現出来る

Dockerの基礎概念

コンテナ型仮想化技術

  • コンテナ型仮想化技術はDocker登場前はLXC(Linux Container)が有名だった
  • コンテナ型仮想化技術では仮想化ソフトなしでOSのリソースを隔離し仮想OSとするためオーバヘッドが少ない
  • 仮想化ソフトを利用する場合はホストOS型の仮想化と呼び、オーバヘッドが大きくなりがち

アプリケーションにフォーカスしたDocker

  • LXCでは別のLXCホストで実行しようとしてもLXCの設定差異によって動作しない場合があったため、アプリケーションのデプロイ・運用の観点で機能不足だった
  • Dockerはコンテナの情報をコードで管理することで取得・配布が容易で再現性が保ちやすいなど、アプリケーションのデプロイにフォーカスした機能を持っている
  • Dockerはコンテナに実行環境とアプリケーションを同梱しているため、実行環境の依存問題を解決出来る

Dockerを利用する意義

環境際問題からの脱却

  • サーバーの環境差異によって同じ挙動にならないことがあるため、環境際を限りなく排除する必要がある

Infrastructure Code Immutable Infrastructure

  • Infrastructure Code
    • コードベースでインフラを管理する
    • 手作業を介する余地を減らすことで、同じ構成のサーバーを再現しやすくする
    • ただし冪等性(何度実行しても同じ結果が保証される)を保ち続けることは難しい
  • Immutable Infrastructure
    • ある地点のサーバーの状態を保存し複製可能にする考え方
    • 正しくセットアップされた状態を常に使うことが出来る
    • 既存のインフラをアップデートするのではなく、新しく作り直すため、冪等性を気にする必要がない

アプリケーションとインフラをセットで構築する

  • 旧来はインフラとアプリのデプロイは分断された作業だったため、環境差異が生まれやすかった
  • コンテナはOS(インフラ)とアプリをセットでビルドできるため、環境差異が生まれにくい
  • 作成したDockerイメージは保存、再利用が可能なためポータビリティが高い

アプリケーションの構成管理のしやすさ

  • 一定の規模のシステムは複数のアプリやミドルウェアが組み合わさっているため、システム全体の構成管理が必要

Dockerのコンテナオーケストレーションシステム

  • 複数コンテナを利用したアプリの管理のためにDocker Composeというツールがある
  • yamlファイルで実行するコンテナを定義したり、依存関係を定義して起動順を制御する
  • Docker Swarmは複数のサーバーをまたいで複数のコンテナを管理できる(コンテナオーケストレーション)

本番環境に導入してこそのDocker

  • オーバヘッドの少なさ、スケールアウトのしやすさから世界中のプロダクションで利用されている
  • クラウドプラットフォーム(AWS,GCP)でもコンテナを運用するツールが整備されている

新しい開発スタイルへ

  • Dockerの普及でインフラがコードレベルで簡単に修正できるようになった
  • インフラエンジニアとサーバーサイドエンジニアの垣根がなくなりつつある
  • 現代的な開発のためにフロントエンドやスマホアプリエンジニアにも必要な技術になりつつある