イメージ レイヤーの理解
Docker イメージは、階層型のファイルシステムを使って構築されます。各レイヤーは、ファイルシステムの変更のセットを表しています。この階層型のアプローチにより、Docker はストレージとネットワークの使用効率を高めることができます。この概念を調べてみましょう。
まず、先ほど取得した Nginx イメージのレイヤーを調べましょう。
docker inspect --format='{{.RootFS.Layers}}' nginx
以下のような出力が表示されるはずです。
[sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8 sha256:b5357ce95c68acd9c9672ec76e3b2a2ff3f8f62a2bcc1866b8811572f4d409af]
これらの長い文字列(SHA256 ハッシュと呼ばれます)のそれぞれが、イメージ内の 1 つのレイヤーを表しています。各レイヤーは、イメージを構築するために使用される Dockerfile 内のコマンドに対応しています。
レイヤーをよりよく理解するために、簡単なカスタム イメージを作成しましょう。まず、現在のディレクトリに新しい Dockerfile
という名前のファイルを作成します。
nano Dockerfile
このファイルに、以下の内容を追加します。
FROM nginx
RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html
この Dockerfile は 2 つのことを行います。
- 先ほど取得した Nginx イメージから始めます (
FROM nginx
)
- イメージに新しいファイルを追加します (
RUN echo...
)
ファイルを保存して終了します(nano では、Ctrl+X を押してから Y を押し、その後 Enter を押すことで行えます)。
次に、このイメージを構築しましょう。
docker build -t custom-nginx.
サンプル出力:
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 5ef79149e0ec
Step 2/2 : RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html
---> Running in 2fa43e649234
Removing intermediate container 2fa43e649234
---> 73b62663b5c3
Successfully built 73b62663b5c3
Successfully tagged custom-nginx:latest
このコマンドは、Dockerfile に基づいて新しいイメージを構築し、それを custom-nginx
とタグ付けします。末尾の .
は、Docker に対して現在のディレクトリにある Dockerfile を探すよう指示します。
次に、カスタム イメージのレイヤーを調べましょう。
docker inspect --format='{{.RootFS.Layers}}' custom-nginx
元の Nginx イメージよりも 1 つ多いレイヤーがあることに気付くでしょう。この追加のレイヤーは、RUN
コマンドによって行われた変更を表しています。
レイヤーを理解することは重要です。その理由は以下の通りです。
- レイヤーはキャッシュされるため、似たようなイメージの構築を高速化します。
- レイヤーはイメージ間で共有されるため、ディスク スペースが節約されます。
- イメージをプッシュまたはプルする際、変更されたレイヤーのみを転送する必要があります。