技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

イメージ【Docker】

イメージレイヤ

Dockerにおけるイメージとは、動作に必要なファイルとアプリケーション、ミドルウェア、実行時パラメータから構成される、Dockerコンテナのファイルシステムです。イメージは読み込み専用であるレイヤのセットで、実現したい環境に必要なレイヤを積み重ねたものが、コンテナのイメージです。

f:id:tech-up:20190122235103p:plain


イメージ、コンテナ、ストレージ・ドライバの理解 — Docker-docs-ja 17.06.Beta ドキュメントより引用


イメージのうち、一番下のレイヤはベースイメージと呼ばれ、この基本的なイメージレイヤに足りないファイルや設定を追加するために適宜レイヤを重ねます。
イメージは複数の異なるレイヤから構成されていますが(複数のディレクトリを意味します)、Dockerストレージドライバによって、一つの統合されたディレクトリであるかのように振舞うことができます。

一般的に、DockerのイメージIDはイメージレイヤの一番上にあるレイヤのIDを指します。

書き込み可能レイヤ

イメージは読み込み専用ですが、コンテナレイヤと呼ばれる、軽量で書き込み可能なレイヤが存在します。コンテナレイヤは、コンテナの起動時に自動的に作成され、各コンテナのディレクトリに対する変更は、このコンテナレイヤに対して処理されます。

f:id:tech-up:20190122234742p:plain
イメージ、コンテナ、ストレージ・ドライバの理解 — Docker-docs-ja 17.06.Beta ドキュメントより引用

読み取り専用の層と書き込み可能な層が別れている点、書き込み可能な層を各コンテナが保有する点により、読み取り専用の層、つまりイメージをコンテナ同士で共有できる事になります。実際に、同じイメージを元にコンテナを起動すると、イメージの単一インスタンスを共有します。この仕組みが、Dockerの起動スピードとディスク使用量の少なさに寄与しています。

f:id:tech-up:20190122234708p:plain
イメージ、コンテナ、ストレージ・ドライバの理解 — Docker-docs-ja 17.06.Beta ドキュメントより引用


コンテナへの変更処理

コンテナに対する変更処理には、コピーオンライト方式(通称CoW)が用いられます。

  1. 各レイヤに対する更新処理が行われていないか、上のレイヤから確認します

  2. 対象ファイルへの変更が初めての場合、コンテナレイヤにそのファイルがコピーされます

  3. コンテナレイヤにコピーされているファイルに対して変更処理を実行します


同じファイルに対する変更は、書き込みレイヤ上のファイルに対して処理されるため、コピーにより発生するオーバーヘッドを必要最低限に抑えることができています。

データボリューム

変更が大量に行われる場合、コンテナレイヤ上で更に新しい領域を確保するため、より多くのディスク容量を消費する事になります。加えて、コンテナレイヤはコンテナが削除されると同時に削除されます。

上記を回避するため、データボリュームを使うという手があります。データボリュームはコンテナが直接マウントするディレクトリ・ファイルであり、Dockerのファイルシステム(動作に必要な最低限のファイル群。ルートディレクトリ)上に存在します。つまり、Dockerホスト上のローカルストレージ領域(コンテナを管理する)の外にあり、Dockerストレージドライバの管理下にはありません。

データボリュームに対する変更は、コンテナレイヤのようなCoW方式をとらず、直接処理されます。また、コンテナを削除してもデータボリュームに影響はありません。これには永続化のメリットがありますが、必要なくなったデータによって容量が膨張し続けないよう、メンテナンスが必要であることを認識しなければなりません。

1つまたは複数のデータボリュームを複数のコンテナから利用することが可能で、1つのコンテナで複数のデータボリュームを管理することもできます。

f:id:tech-up:20190122234617p:plain
イメージ、コンテナ、ストレージ・ドライバの理解 — Docker-docs-ja 17.06.Beta ドキュメントより引用


イメージの入手

Dockerイメージには、公式が用意しているもの、サードパーティが用意しているものがあり、それらはDocker Hubで入手することができます。自分で作成することも可能です(カスタムイメージと呼びます)。
サードパーティのイメージを使用する際には、悪意ある攻撃者がいることに注意し、セキュリティ面で問題がないか慎重に確認するようにします。


イメージ、コンテナ、ストレージ・ドライバの理解 — Docker-docs-ja 17.06.Beta ドキュメント

Dockerイメージの理解とコンテナのライフサイクル