Chapter 02

Dockerとは

ここだけは理解しよう

Docker の特性です。
まずはここから理解しましょう。

  • ポータビリティ
  • オーバーヘッド
  • Immutable Infrastructure

以下はDocker 公式からです。

  • Flexible
  • Lightweight
  • Portable
  • Scalable
  • Secure

ポータビリティ

Docker は任意のタイミングの状態(ライブラリ・ランタイム・コード)を、
1 つのスナップショットとして保存ができます。

スナップショットは任意のタイミングの状態を再現でき、
そのスナップショットを他の開発者やステージングや本番環境へ配布できます。

これはよくある Aさんの環境では動くのに私の環境では動かない などを減らすことができます。
全ては image からコンテナを作るからね!
image1.png

オーバーヘッド

よく比較されるのが、VM と Docker になります。

■VM 型の仮想化の場合
物理レイヤーの仮想化から行います。

■Docker の場合
Linux カーネルの機能を用いて 1 プロセスとして隔離された環境を実現します。
そのため仮想化レイヤーが少なく、VM と比較して少ないオーバーヘッドで環境を実現できます。

image2.png

Immutable Infrastructure

Immutable Infrastructureはインフラを不変なものとして扱うアプローチです。
今までのインフラはライブラリのアップデートや新しいコードの追加をする際はサーバーへの操作を行い、なんらかの"変更"を加えて実現してきました。そのインフラを変更するアプローチと反対にインフラを不変なものとして扱うのがImmutable Infrastructureというアプローチです。

Immutable Infrastructure を Docker で実現するために、
Docker では DockerfileImage が備わっています。
Dockerfile があることで、IaC での宣言的な方法で環境構築ができます。

Dockerが流行った理由

コンテナ自体は古くからある概念で、古くからchroot・Jail・LXCのようなプロジェクトが存在します。なぜDockerを流行った理由の1つとして筆者は 配布の容易性 というのが背景としてあると考えています。Dockerはコンテナとしての技術だけではなく、そのコンテナのスナップショットを取得して配布を標準の機能として提供しています。
この仕組みを用いることでローカルから本番環境まで用意に同一の環境を使用することができるようになりました。

私は 配布の容易性使いやすさ かなと感じました。
Docker 利用以前は、自分の環境と同じ環境を他の人に共有したいとよく思っていました。
ただ、いくら配布が容易になっても、開発時の使い易さが損なわれると利用しなくなりますよね。
Docker を利用するとデバッグもできたり、ライブラリの追加削除が簡単にできます。
その結果、開発者にも非常に最適な環境を構築するツールとして利用できる点が気に入り Docker を好きになりました。

VMとDockerについて

VM:コンピュータ自体を仮想化する技術
 例:macOS 上で Windows を利用する。

Docker:プロセスの仮想化
 コンテナは Linux カーネルの機能を用いた技術で、
 cgroup・namespace・Capability のような機能を組み合わせて実現しています。
 そのため VM とは異なりホスト OS とリソースを共有し、
 効率的にホスト OS のリソースを使用でき、
 高速かつ軽量な仮想化を実現しています。

cgroup(Control Group)

メモリ・CPUのような計算リソースを隔離するための機能で、コンテナへリソースの割り当てと制限を行います。コンテナはそれぞれ専用の計算リソースを割り当て、他のコンテナにはお互いにアクセスできないようにします。そして割り当てられたリソースを消費しても他のコンテナに影響を及ぼさないように制限を行ってくれます。

image.png
A Game Changer for Containers | cgroups v2

簡単に図を作成してみました。

割り当てられた領域は別コンテナやホスト自体には影響を及ぼさないので、
利用者視点ではまるで物理的に領域を分けたような感覚になるので、
利用者側からも想像がしやすいなと思いました。

namespace

同じく隔離のための技術です。namespaceはプロセスやネットワーク、ファイルアクセスなど復数の種類があり、それぞれが異なるリソースの隔離を行います。

image.png
【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに? 〜

簡単な図を作成しました。
namesapce == Container の感覚です!

割り当てられた領域は別コンテナやホスト自体には影響を及ぼさないので、
利用者視点ではまるで物理的に領域を分けたような感覚になるので、
利用者側からも想像がしやすいなと思いました。

Capability

スーパーユーザーとしての機能を制限するための機能です。DockerコンテナへHostOSのrootユーザーの権限を制限し、最小限の権限を付与/管理を行います。