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 documentから拝借した. この図ではDebian, emacs, 最後にApacheサーバのイメージを順次適応している.
そして, それらを順番に実行していったものがコンテナ
であり, コンテナはその階層の一番上にメモリ空間(writable)を持つ
. コンテナが利用できる記憶領域はこの部分である.
dockerコンテナのライフサイクル
dockerでは, イメージを元にコンテナを作ったり消したりする
できることが特徴であり, 「コンテナは使い捨て」という感覚で使われることが多い. コンテナはこのように"生き死に"を繰り返すので, 「 コンテナのライフサイクル 」と呼ばれる.
そして, コンテナ上のメモリ空間はコンテナの終了とともに消える
.
つまり, コンテナ上でのファイル追加, 変更は永続的に残らない のである.
docker データ・ボリューム
では, 永続的に残したいデータ
はどうやって記録するのか. dockerでは, ホストOS側に記録すること
でこの問題を解決している. これをデータ・ボリューム
と呼ぶ.
データ・ボリューム docker docs 公式和訳が詳しい. ホストOSのディレクトリをコンテナ起動時にマウントする. これによって, ファイルシステムの一部としてデータボリュームを利用できる.
dockerを勉強してみた所感
docker
は, ファイルシステムごと環境をスナップショットする
という点でかなり便利だ.
docker imageさえあれば, 環境設定なしでクローン環境
を作ることができる.
また, ブログで触れてはいないが, Dockerfile
を書くことで環境設定を自動化することもできる.
これには, 手順を明文化できるというメリットもある.
ただ, サークルで利用する
というところを考えた時に, ちょっと抵抗がある.
dockerの仕組みは通常のファイルシステムと少し違う部分があるので, 感覚を掴んでもらうまで少し時間がかかりそう.
vagrantの導入
を考えてみる.