はじめに
この実験では、docker save コマンドを使用して Docker イメージを tar アーカイブファイルにエクスポートする方法を学びます。これは、イメージのバックアップ、レジストリを使用せずにシステム間でイメージを転送する、または複数のイメージを配布用に束ねるために必要なスキルです。
単一のイメージを保存する方法、複数のイメージを 1 つのアーカイブに保存する方法、イメージの特定のプラットフォームバリアントを保存する方法、および保存したイメージアーカイブを gzip で圧縮する方法を調べます。この実験の終わりまでに、様々なイメージ管理タスクで docker save を使いこなせるようになります。
単一のイメージを tar アーカイブに保存する
このステップでは、単一の Docker イメージを tar アーカイブファイルに保存する方法を学びます。これは、イメージをバックアップしたり、直接的な Docker レジストリ接続なしで別のシステムに転送する際に便利です。
まず、この例で使用するシンプルな Docker イメージを取得しましょう。小さく、このデモンストレーションに適した hello-world イメージを使用します。
docker pull hello-world
イメージが取得され、ダウンロードされていることを示す出力が表示されるはずです。
Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
これで hello-world イメージがローカルにあるので、docker save コマンドを使用して tar アーカイブに保存することができます。基本的な構文は docker save -o <output_file.tar> <image_name> です。
hello-world イメージを現在のディレクトリ (~/project) に hello-world.tar という名前のファイルに保存します。
docker save -o hello-world.tar hello-world
このコマンドを実行すると、~/project ディレクトリに hello-world.tar という名前のファイルが作成されます。このファイルには hello-world Docker イメージが含まれています。
ls -lh コマンドを使用して、ファイルが作成されたことを確認し、そのサイズを確認することができます。
ls -lh hello-world.tar
ファイルサイズを示す、次のような出力が表示されるはずです。
-rw-r--r-- 1 labex labex ... hello-world.tar
この tar ファイルは、別のマシンに転送し、docker load コマンドを使用して読み込むことができます。
複数のイメージを tar アーカイブに保存する
前のステップでは、単一の Docker イメージを保存する方法を学びました。このステップでは、複数の Docker イメージを 1 つの tar アーカイブファイルに保存する方法を学びます。これは、いくつかのイメージを配布またはバックアップ用にまとめる必要がある場合に便利です。
まず、保存するイメージを複数用意するために、別の Docker イメージを取得しましょう。軽量な Linux ディストリビューションである alpine イメージを取得します。
docker pull alpine
alpine イメージが取得され、ダウンロードされていることを示す出力が表示されるはずです。
Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
これで hello-world と alpine の両方のイメージがローカルにあります。ローカルのイメージを一覧表示することで、これを確認できます。
docker images
出力には、一覧の中に hello-world と alpine の両方が表示されるはずです。
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest ... ... ...
alpine latest ... ... ...
複数のイメージを 1 つの tar アーカイブに保存するには、docker save コマンドで出力ファイル名の後にイメージ名を列挙するだけです。構文は docker save -o <output_file.tar> <image1_name> <image2_name> ... です。
hello-world と alpine の両方のイメージを、~/project ディレクトリに images.tar という名前のファイルに保存します。
docker save -o images.tar hello-world alpine
このコマンドを実行すると、~/project ディレクトリに images.tar という名前のファイルが作成されます。このファイルには hello-world と alpine の両方の Docker イメージが含まれています。
ls -lh コマンドを使用して、ファイルが作成されたことを確認し、そのサイズを確認することができます。このファイルには 2 つのイメージが含まれているため、サイズは前のステップの hello-world.tar ファイルよりも大きくなります。
ls -lh images.tar
次のような出力が表示されるはずです。
-rw-r--r-- 1 labex labex ... images.tar
アーカイブに両方のイメージが含まれていることを確認するには、tar -tf コマンドを使用して tar ファイルの内容を一覧表示できます。
tar -tf images.tar
出力には、マニフェストやレイヤーデータを含む、両方のイメージに関連するファイルが表示されるはずです。hello-world/ や alpine/ のようなエントリが表示されるはずです。
...
hello-world/
hello-world/manifest.json
...
alpine/
alpine/manifest.json
...
この 1 つの tar ファイルを使用して、docker load を使って両方のイメージを別のシステムに読み込むことができます。
イメージの特定のプラットフォームバリアントを保存する
このステップでは、Docker イメージの特定のプラットフォームバリアントを保存する方法を学びます。Docker イメージは、異なるアーキテクチャ(amd64、arm64 など)用に構築することができます。場合によっては、特定のプラットフォーム用に構築されたイメージを保存する必要があることがあります。
デフォルトでは、docker pull と docker save は、現在のシステムのアーキテクチャに一致するイメージバリアントで動作します。ただし、--platform フラグを使用して別のプラットフォームを指定することができます。
異なるプラットフォーム用のバリアントを持つイメージを取得しましょう。alpine イメージは良い例です。LabEx の仮想マシンがおそらく amd64 であっても、明示的に alpine イメージの arm64 バリアントを取得します。
docker pull --platform arm64 alpine
alpine イメージの arm64 バリアントが取得されていることを示す出力が表示されるはずです。
arm64: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
では、この特定の alpine イメージの arm64 バリアントを tar アーカイブに保存しましょう。docker save コマンドで再度 --platform フラグを使用します。
alpine の arm64 バリアントを、~/project ディレクトリに alpine_arm64.tar という名前のファイルに保存します。
docker save --platform arm64 -o alpine_arm64.tar alpine
このコマンドを実行すると、~/project ディレクトリに alpine_arm64.tar という名前のファイルが作成されます。このファイルには、alpine Docker イメージの arm64 バリアントが含まれています。
ls -lh コマンドを使用して、ファイルが作成されたことを確認することができます。
ls -lh alpine_arm64.tar
次のような出力が表示されるはずです。
-rw-r--r-- 1 labex labex ... alpine_arm64.tar
保存されたイメージが実際に arm64 バリアントであることを確認するには、tar ファイルの内容を調べることができます。tar ファイルの内容から直接アーキテクチャを確認することは複雑ですが、保存操作中に --platform arm64 を使用したことで、保存されたイメージがそのプラットフォーム用であることが保証されます。
これは、ホストのアーキテクチャと異なるプラットフォーム用のイメージを明示的に保存する方法を示しています。
イメージを保存し、gzip で圧縮する
この最後のステップでは、Docker イメージを tar アーカイブに保存すると同時に、gzip を使用して圧縮する方法を学びます。これは、保存されたイメージのファイルサイズを削減し、保存や転送を容易にするための一般的な手法です。
docker save コマンド自体には組み込みの圧縮オプションはありません。しかし、docker save の出力を gzip などの圧縮ユーティリティにパイプすることで、圧縮を実現できます。
以前のステップで取得した alpine イメージを保存し、gzip を使って圧縮します。出力は .tar.gz 拡張子のファイルにリダイレクトされます。
構文は出力をパイプするもので、docker save <image_name> | gzip > <output_file.tar.gz> となります。
alpine イメージを ~/project ディレクトリに alpine.tar.gz という名前の gzip 圧縮された tar ファイルに保存しましょう。
docker save alpine | gzip > alpine.tar.gz
このコマンドは、alpine イメージを標準出力に保存し、その出力を gzip コマンドにパイプして圧縮し、圧縮された出力を alpine.tar.gz ファイルにリダイレクトします。
このコマンドを実行すると、~/project ディレクトリに alpine.tar.gz という名前のファイルが作成されます。
ls -lh コマンドを使って、ファイルが作成されたことを確認し、そのサイズを確認できます。圧縮されていない alpine イメージのサイズ(images.tar の一部、または個別に保存した場合のサイズ)と比較することで、圧縮の効果を確認できます。
ls -lh alpine.tar.gz
次のような出力が表示されるはずです。
-rw-r--r-- 1 labex labex ... alpine.tar.gz
ファイルが gzip 圧縮された tar アーカイブであることを確認するには、file コマンドを使用できます。
file alpine.tar.gz
出力は、これが gzip 圧縮されたデータファイルであることを示すはずです。
alpine.tar.gz: gzip compressed data, ...
また、tar -tfz を使って圧縮アーカイブの内容を一覧表示することもできます。z フラグは、tar に内容を一覧表示する前に gzip でファイルを解凍するよう指示します。
tar -tfz alpine.tar.gz
アーカイブ内の alpine イメージの内容が表示され、images.tar の内容を一覧表示したときと同様の内容が表示されるはずです。
...
alpine/
alpine/manifest.json
...
この方法は、イメージを保存して圧縮する作業を 1 つのコマンドで効率的に行うことができます。
まとめ
この実験では、docker save コマンドを使用して Docker イメージを tar アーカイブにエクスポートする方法を学びました。単一のイメージ(hello-world)を tar ファイルに保存することに成功し、このコマンドの基本的な使い方を実証しました。
さらに、複数のイメージを単一のアーカイブに保存する方法を調べました。これは、イメージを束ねる際に便利です。また、イメージの特定のプラットフォームバリアントを保存する方法や、出力される tar ファイルを gzip で圧縮してサイズを削減する方法も学びました。これらの手順で、イメージのバックアップと転送に関する docker save の基本的な機能を網羅しました。



