See the Elephant

1992生まれのプログラマが書くエンジニアブログ

dockerのファイルシステムについて知る

こちらも合わせてお読みください

namu-r21.hatenablog.com
namu-r21.hatenablog.com

dockerのイメージとコンテナについて今一度

先日書いたdockerを触ってみる - 1++で,イメージとコンテナについて以下のように述べた.

イメージとコンテナについて

* イメージ : 仮想環境の雛形
* コンテナ : イメージから作られた実際の仮想環境

今一度調べていくとこの表現はあまり正しくない.

dockerイメージは, 雛形ではなかった .

dockerイメージは, ファイルシステム全体の状態を保持したスナップショットと表現した方が正しい. OS(ファイルシステム), アプリケーション, 内部のデータまでを写真で切り取ったかのように全て記録した状態がイメージである.

dockerコンテナとは, そのdockerイメージを動作させたものを指す.

つまり, dockerを利用すると, 任意の環境を別の環境で完全再現できる .

dockerで作ったローカル環境イメージをサーバ上に持って行き, そのイメージをdocker runするとコンテナとしてそのまま動作する.

dockerのファイルシステム

dockerでは, Union File Systemを導入している.

これは, コピーオンライトで動作する. コピーオンライトとは子プロセス生成時に親プロセスのメモリー空間を複製せず,書き込み処理が発生したときにはじめて複製する仕組みである. このとき, 親プロセスのメモリ空間はRead onlyである.

dockerでは, イメージを親プロセス, コンテナを子プロセスとして扱う.

基本的に コンテナ単位でメモリ空間 が与えられ, その変更はイメージからの差分のみを記録する. コンテナ内での状態変化はコンテナで閉じていて 大元のイメージには影響しない .

dockerのファイルシステムに関しては,
今からでも間に合うDockerの基礎。コンテナとは何か、Dockerfileとは何か。,
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
が視覚的かつ丁寧に説明している. こちらを参照してほしい.

dockerでは, 1つのイメージが複数のイメージによって階層的に構成されている. dockerでは, それぞれのイメージが逐次実行されていく.

docker Union File System from docker document

図はdocker documentから拝借した. この図ではDebian, emacs, 最後にApacheサーバのイメージを順次適応している.

そして, それらを順番に実行していったものがコンテナであり, コンテナはその階層の一番上にメモリ空間(writable)を持つ. コンテナが利用できる記憶領域はこの部分である.

dockerコンテナのライフサイクル

dockerでは, イメージを元にコンテナを作ったり消したりするできることが特徴であり, 「コンテナは使い捨て」という感覚で使われることが多い. コンテナはこのように"生き死に"を繰り返すので, 「 コンテナのライフサイクル 」と呼ばれる.

そして, コンテナ上のメモリ空間はコンテナの終了とともに消える.

つまり, コンテナ上でのファイル追加, 変更は永続的に残らない のである.

docker データ・ボリューム

では, 永続的に残したいデータはどうやって記録するのか. dockerでは, ホストOS側に記録することでこの問題を解決している. これをデータ・ボリュームと呼ぶ.
データ・ボリューム docker docs 公式和訳が詳しい. ホストOSのディレクトリをコンテナ起動時にマウントする. これによって, ファイルシステムの一部としてデータボリュームを利用できる.

dockerを勉強してみた所感

dockerは, ファイルシステムごと環境をスナップショットするという点でかなり便利だ.
docker imageさえあれば, 環境設定なしでクローン環境を作ることができる.

また, ブログで触れてはいないが, Dockerfileを書くことで環境設定を自動化することもできる. これには, 手順を明文化できるというメリットもある.

ただ, サークルで利用するというところを考えた時に, ちょっと抵抗がある.
dockerの仕組みは通常のファイルシステムと少し違う部分があるので, 感覚を掴んでもらうまで少し時間がかかりそう.
vagrantの導入を考えてみる.