【入門】docker saveの使い方:イメージをファイルに保存する
Dockerを使っていると、インターネット上のDocker Hubやプライベートなレジストリからイメージを取得(pull)したり、自分が作成したイメージをレジストリに公開(push)したりすることが一般的です。しかし、環境によってはインターネットに接続できない場所があったり、特定のバージョンのイメージを確実にバックアップしておきたい、といったニーズが出てくることがあります。
そんなときに役立つのが、今回ご紹介する docker save
コマンドです。このコマンドを使うと、Dockerイメージをファイルとしてローカルに保存し、後から別の環境でそのファイルを読み込むことができます。
この記事では、docker save
コマンドの基本的な使い方から、具体的なユースケース、保存されるファイルの仕組み、他のコマンドとの違い、そして使う上での注意点まで、入門者の方にも分かりやすく詳細に解説します。
さあ、一緒に docker save
の世界を探検しましょう。
1. Dockerイメージとは?なぜファイルに保存する必要があるのか?
まず、Dockerイメージとは何かを簡単に振り返りましょう。Dockerイメージは、アプリケーションとその実行に必要なすべてのもの(コード、ランタイム、ライブラリ、環境変数、設定ファイルなど)をパッケージ化したものです。イメージは読み取り専用であり、これを元にコンテナが作成・実行されます。
イメージは「レイヤー」と呼ばれる積み重ねられた変更履歴から構成されています。これにより、共通のベースイメージを持つ複数のイメージ間でレイヤーを共有でき、効率的なストレージ利用や高速なイメージ構築が可能になっています。
通常、DockerイメージはDocker Hubのようなコンテナレジストリに登録されており、docker pull
コマンドを使って取得します。しかし、レジストリを使わずにイメージをやり取りしたい場面があります。例えば、以下のようなケースです。
- オフライン環境への配布: インターネットに接続されていない、または接続が不安定な環境でDockerイメージを使用したい場合。事前にインターネットに接続できる環境でイメージをファイルに保存し、USBメモリなどで持ち運んでオフライン環境で読み込むことができます。
- バックアップ: Dockerイメージの特定のバージョンを確実に手元にバックアップしておきたい場合。レジストリから削除されてしまったり、ネットワークの問題で取得できなくなったりするリスクを回避できます。
- 異なるDockerデーモン間での共有(レジストリなし): 開発環境でビルドしたイメージをテスト環境や本番環境にデプロイしたいが、共有のDockerレジストリを構築・利用する体制がない場合。
- バージョン管理の補助: 特定の時点でのイメージの状態をファイルとして保存し、Gitなどのバージョン管理システムで管理したい場合(ただし、ファイルサイズが大きくなりがちなので注意が必要です)。
- CI/CDパイプラインでの利用: ビルドステージで作成したイメージを、レジストリを介さずに次のテストステージやデプロイステージに引き渡したい場合。
- イメージの内部構造の調査: 保存したイメージファイルを解凍して、その内部構造(レイヤーやマニフェストなど)を詳しく確認したい場合。
このような場合に活躍するのが docker save
コマンドなのです。
2. docker save
コマンドの基本
docker save
コマンドは、指定したDockerイメージをtarアーカイブ形式のファイルとして出力します。このファイルには、イメージを構成するすべてのレイヤー情報やメタデータ(タグなど)が含まれています。
基本的な書式は以下の通りです。
bash
docker save [OPTIONS] IMAGE [IMAGE...]
ここで、IMAGE
は保存したいDockerイメージの名前(と optionally タグ)を指定します。複数のイメージを同時に指定することも可能です。
2.1. 最も簡単な使い方:単一イメージの保存
まずは、一つのDockerイメージをファイルに保存する最も基本的な方法を見てみましょう。例として、公式の nginx:latest
イメージを保存してみます。まだ手元に nginx:latest
イメージがない場合は、事前に docker pull nginx:latest
で取得しておいてください。
保存方法は主に2種類あります。
方法1: 標準出力へのリダイレクト
docker save
コマンドはデフォルトで、生成されたtarアーカイブを標準出力(stdout)に出力します。この出力をファイルにリダイレクトすることで、ファイルとして保存できます。
bash
docker save nginx:latest > nginx_latest.tar
このコマンドを実行すると、カレントディレクトリに nginx_latest.tar
という名前のファイルが生成されます。ファイル名は任意ですが、慣習として .tar
または .tar.gz
(圧縮する場合)拡張子を付けます。
方法2: -o
オプションを使用
docker save
コマンドには、出力ファイル名を指定するための -o
または --output
オプションが用意されています。こちらの方が明示的で分かりやすいかもしれません。
bash
docker save -o nginx_latest.tar nginx:latest
こちらも同様に、nginx_latest.tar
ファイルが生成されます。どちらの方法を使っても結果は同じです。通常は -o
オプションを使う方が推奨されます。
保存が完了したら、ファイルサイズを確認してみましょう。
bash
ls -lh nginx_latest.tar
出力例:
-rw-r--r-- 1 user user 133M Apr 25 10:00 nginx_latest.tar
イメージのサイズに応じたファイルが作成されていることが確認できます。
2.2. 複数のイメージの保存
docker save
コマンドは、複数のイメージを一度に指定して保存することも可能です。この場合、指定したすべてのイメージが同じ一つのtarアーカイブファイルにまとめられます。
例として、nginx:latest
と ubuntu:latest
の二つのイメージを保存してみましょう。
bash
docker save -o images.tar nginx:latest ubuntu:latest
これにより、images.tar
という一つのファイルが生成され、その中に nginx:latest
と ubuntu:latest
の両方のイメージ情報が含まれます。
複数のイメージをまとめて保存すると、ファイルを一つにまとめられるという利点がありますが、ファイルサイズは当然大きくなります。また、特定のイメージだけが必要な場合に、まとめて保存されたファイルから一つだけを取り出すといった操作はできません(ファイルを docker load
する際は、ファイルに含まれるすべてのイメージが読み込まれます)。そのため、必要に応じて使い分けるのが良いでしょう。
2.3. タグを指定しない場合
イメージ名を指定する際にタグを省略した場合、そのイメージのすべてのタグと、タグ付けされていない中間イメージ(dangling
イメージ)も一緒に保存されることがあります。
例えば、ubuntu
イメージには latest
, 22.04
, 20.04
など複数のタグが存在します。
bash
docker save -o ubuntu_all.tar ubuntu
このようにタグを指定せずに ubuntu
を保存すると、ローカルに存在する ubuntu
イメージに関連するすべてのタグ付きバージョンと、それらを構成する共有レイヤーなどがまとめて保存されます。
ただし、特定のタグ(例: ubuntu:latest
)を指定して保存した場合でも、そのイメージが依存する共有レイヤーは保存されます。そして、もし他のタグ(例: ubuntu:22.04
)も同じ共有レイヤーを利用している場合、それらのレイヤーも保存ファイルに含まれることになります。docker load
時には、ファイルに含まれるすべてのレイヤーがDockerデーモンに追加されます。
基本的には、保存したい特定のイメージとタグを明確に指定するのが良いでしょう。
2.4. オプションの詳細
docker save
コマンドのオプションは非常にシンプルです。
-o, --output string
: 保存先のファイルパスを指定します。このオプションを使わない場合は標準出力に保存されます。通常はこのオプションを使うのが一般的です。--help
:docker save
コマンドのヘルプ情報を表示します。
これ以外の主要なオプションはほとんどありません。コマンドの機能が「イメージをファイルに保存する」という一点に特化しているためです。
3. 保存されたイメージファイルの構造
docker save
によって生成されるtarアーカイブファイルの中身は、Dockerイメージの内部構造を反映しています。このファイルの中身を理解することで、Dockerイメージがどのように構成されているか、そして docker save
/docker load
がどのように機能するかの理解が深まります。
保存された nginx_latest.tar
ファイルの中身を覗いてみましょう。tar tf
コマンドを使うと、アーカイブファイルの中身をリスト表示できます。
bash
tar tf nginx_latest.tar
出力例:
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef/
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef/VERSION
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef/json
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef/layer.tar
... (他のレイヤーのディレクトリが続く) ...
manifest.json
表示される内容は、イメージのレイヤー構成によって異なりますが、大まかに以下の要素が含まれています。
- レイヤーディレクトリ: 多数の英数字の長い文字列で名付けられたディレクトリ(例:
0123...ef/
)。これらのディレクトリは、イメージを構成する個々のレイヤーを表しています。各ディレクトリ内には以下のファイルが含まれています。VERSION
: レイヤーのバージョン情報(通常は1.0)。json
: そのレイヤーのメタデータを含むJSONファイル。このファイルには、親レイヤーのID、コンテナの差分レイヤーに関する情報などが含まれます。layer.tar
: そのレイヤーで追加または変更されたファイルシステムの差分(ファイルやディレクトリ)を含むtarアーカイブ。これが各レイヤーの実体です。
-
manifest.json
: これは非常に重要なファイルです。保存されたイメージ全体のメタデータを含んでいます。具体的には、以下の情報が含まれます。- このアーカイブに含まれるイメージのリスト。
- 各イメージのタグ(例:
nginx:latest
)。 - 各イメージに対応する設定ファイル(
config.json
など)への参照。 - 各イメージを構成するレイヤーのリストと、それに対応するレイヤーディレクトリへの参照。
-
config.json
:manifest.json
から参照される、イメージの詳細な設定情報を含むJSONファイル。このファイルには、イメージのID、作成日時、親イメージ、コンテナのデフォルト設定(実行コマンド、環境変数、ポート公開設定など)が含まれます。
保存されたファイルはこのように、イメージを構成する各レイヤーのデータ(layer.tar
)と、それらをどのように組み合わせて特定のイメージ(特定のタグ)とするかを示すメタデータ(manifest.json
、config.json
)から構成されています。
docker load
コマンドは、このtarファイルを受け取り、ファイルシステムからレイヤーのtarファイルを読み込み、Dockerデーモンのストレージに展開・登録します。そして manifest.json
や config.json
の情報を使って、対応するイメージID、タグ、およびイメージの設定をDockerデーモンに登録します。
この構造から分かるように、docker save
はイメージのファイルシステム上の状態をそのまま保存するだけでなく、レイヤー構造やタグ情報といったDockerイメージとしての完全な情報を保持しています。これが、後述する docker export
との大きな違いです。
4. docker save
の様々なユースケースと実践例
ここでは、docker save
コマンドが具体的にどのような場面で役立つのか、いくつかのユースケースを例に見ていきましょう。
ユースケース1:オフライン環境への配布
最も一般的なユースケースです。インターネット接続がない、または制限された環境で、Dockerイメージを使いたい場合に有効です。
シナリオ:
開発環境(インターネット接続あり)で作成または取得したカスタムアプリケーションのイメージ myapp:1.0
を、インターネットに接続されていない本番環境にデプロイしたい。
手順:
-
開発環境(インターネット接続あり)でイメージを保存:
“`bash
# イメージが手元にあることを確認
docker images myapp:1.0イメージをファイルに保存
docker save -o myapp_1.0.tar myapp:1.0
``
myapp_1.0.tar` というファイルが作成されます。 -
ファイルをオフライン環境へ移動:
USBメモリ、外部HDD、ローカルネットワーク経由など、何らかの方法でmyapp_1.0.tar
ファイルを本番環境のサーバーにコピーします。 -
本番環境(オフライン)でイメージを読み込み:
本番環境のサーバー上で、コピーしたファイルをdocker load
コマンドで読み込みます。“`bash
ファイルを読み込む
docker load -i myapp_1.0.tar
または標準入力から:
bash
docker load < myapp_1.0.tar
“`読み込みが完了すると、
myapp:1.0
イメージが本番環境のDockerデーモンに登録され、docker images
コマンドで確認できるようになります。bash
docker images myapp:1.0これで、このイメージを使ってコンテナを実行できるようになります。
bash
docker run -d myapp:1.0
ユースケース2:イメージのバックアップ
特定の時点でのイメージの状態をファイルとして永続的に保存し、将来的な復旧や参照のためにバックアップしておきたい場合。
シナリオ:
ある重要なサービスで使用しているイメージ backend:release-20231027
の状態を、万が一の場合に備えてバックアップしておきたい。
手順:
-
イメージをファイルに保存:
bash
docker save -o backend_release-20231027.tar backend:release-20231027 -
バックアップファイルとして保管:
生成されたbackend_release-20231027.tar
ファイルを、安全なストレージ(NAS、クラウドストレージなど)に保管します。必要であれば、ファイル名を分かりやすく変更したり、追加のメタデータ(保存日時、目的など)を記録したりします。
復旧が必要になった場合は、保管場所からファイルをコピーしてきて、docker load -i backend_release-20231027.tar
でDockerデーモンに読み込めば、元のイメージの状態を再現できます。
ユースケース3:複数の関連イメージをまとめて配布
特定のアプリケーションやサービスが、複数のDockerイメージ(例:Webサーバー、データベース、マイクロサービス群)で構成されている場合、これらをまとめて配布したいことがあります。
シナリオ:
Webアプリケーション webapp
が webapp/frontend:1.0
, webapp/backend:1.0
, webapp/database:1.0
の3つのイメージで構成されている。これらを開発環境からステージング環境にまとめて移動したい。
手順:
-
複数のイメージをまとめて保存:
bash
docker save -o webapp_suite_1.0.tar webapp/frontend:1.0 webapp/backend:1.0 webapp/database:1.0
これにより、3つのイメージすべてを含む一つのtarファイルが作成されます。 -
ファイルをステージング環境へ移動:
webapp_suite_1.0.tar
ファイルをステージング環境のサーバーにコピーします。 -
ステージング環境でイメージを読み込み:
bash
docker load -i webapp_suite_1.0.tar
このコマンドを実行すると、ファイルに含まれる3つのイメージ (webapp/frontend:1.0
,webapp/backend:1.0
,webapp/database:1.0
) がすべてステージング環境のDockerデーモンに登録されます。
このように、関連するイメージをまとめて保存・読み込みすることで、配布の手間を省くことができます。
ユースケース4:パイプラインでの利用(圧縮と連携)
生成されたtarファイルは、そのままではサイズが大きい場合があります。配布や保管の際にファイルサイズを抑えたい場合は、gzip
などの圧縮ツールと組み合わせて使用することがよくあります。
docker save
は標準出力に書き出すことができるため、これをパイプ (|
) を使って別のコマンド(例: gzip
)に渡すことで、保存と圧縮を同時に行うことができます。
手順:
- イメージを保存しつつ圧縮:
bash
docker save myimage:latest | gzip > myimage_latest.tar.gz
このコマンドは、docker save
が標準出力に出力した内容をgzip
コマンドに渡し、gzip
がそれを圧縮してmyimage_latest.tar.gz
ファイルとして保存します。
読み込む際は、逆に gunzip
または zcat
などで解凍してから docker load
にパイプで渡します。
bash
gunzip < myimage_latest.tar.gz | docker load
または
bash
zcat myimage_latest.tar.gz | docker load
このように圧縮と組み合わせることで、ファイルサイズを大幅に削減できる場合があります。特にネットワーク経由でファイルを転送する際などに有効です。
5. docker save
と他の関連コマンドとの比較
Dockerには、イメージやコンテナに関連する様々なコマンドがあります。docker save
と混同しやすい、あるいは目的が似ている他のコマンドとして、docker export
、docker push
、docker pull
などがあります。これらのコマンドとの違いを理解することは、それぞれの適切な使い分けのために重要です。
5.1. docker save
vs docker export
この二つは特によく混同されますが、機能と目的が全く異なります。
特徴 | docker save |
docker export |
---|---|---|
対象 | Dockerイメージ (一つまたは複数) | 実行中のコンテナ (一つのみ) |
出力内容 | 完全なイメージ (全レイヤー、メタデータ、タグ情報を含むtarアーカイブ) | コンテナのファイルシステムのスナップショット (単一のtarアーカイブ) |
用途 | – イメージのオフライン配布 | – コンテナのファイルシステムのバックアップ |
– イメージのバージョンバックアップ | – コンテナの状態のスナップショット | |
– レジストリを介さないイメージ転送 | – 軽量なベースイメージ作成の出発点 | |
読み込み | docker load を使用 |
docker import を使用 |
読み込み後の状態 | 元のタグ付きイメージとして完全に復元される | タグなしの新しいイメージとして復元される (オプションでタグ付け可能) |
レイヤー情報 | 保持される | 破棄される (単一レイヤーになる) |
履歴情報 | 保持される | 破棄される |
ファイルサイズ | 通常、docker export よりも大きい |
通常、docker save よりも小さい |
具体的な違い:
- 対象:
docker save
はイメージ(ビルドされたもの)を扱いますが、docker export
は実行中のコンテナの状態(ファイルシステムの変更部分を含む)を扱います。 - 出力形式:
docker save
はイメージを構成する複数のレイヤーとメタデータをそのままアーカイブするため、中身を見ると複数のディレクトリやファイル(manifest.json, config.json, layer.tarなど)が含まれています。一方、docker export
はコンテナのファイルシステムの状態を単一のフラットなtarアーカイブとして出力します。つまり、レイヤー構造は失われます。 - 再利用性:
docker save
で保存したファイルは、docker load
で元のタグ付きイメージとして完全に復元できます。これは、配布やバックアップに最適です。docker export
で保存したファイルは、docker import
で新しいイメージとして読み込まれますが、元のイメージの履歴やレイヤー情報は失われ、単一のレイヤーを持つ新しいイメージになります。これは、実行中のコンテナの状態をキャプチャしたり、その状態から新しいベースイメージを作成したりするのに使われます。
例:
docker save
の例:nginx:latest
イメージを保存する ->docker save -o nginx.tar nginx:latest
docker export
の例: 実行中のmycontainer
コンテナのファイルシステムを保存する ->docker export -o mycontainer_snapshot.tar mycontainer
使い分けの結論:
- Dockerイメージをそのままの形で(レイヤー構造やタグ情報を保って)配布・バックアップしたい場合は
docker save
。 - 実行中のコンテナの現在のファイルシステムの状態だけを、レイヤー構造を気にせずにファイルとして取り出したい場合は
docker export
。
5.2. docker save
/docker load
vs docker push
/docker pull
これらは目的(イメージの共有・転送)は似ていますが、手段が異なります。
特徴 | docker save /docker load |
docker push /docker pull |
---|---|---|
手段 | ファイルベース (tarアーカイブ) | ネットワークベース (レジストリ経由) |
必要な環境 | – 送信元/受信元でファイルシステムアクセス – (必要なら) ファイル転送手段 (USB, SCPなど) |
– レジストリサーバー – 送信元/受信元からのネットワーク接続 |
オフライン対応 | 可能 (ファイルをオフラインで運搬) | 不可 (ネットワーク必須) |
差分転送 | なし (常にイメージ全体または指定したイメージのファイル) | あり (既にあるレイヤーは転送しない) |
認証・アクセス制御 | ファイルのアクセス制御に依存 | レジストリの認証・認可機能に依存 |
使い分け | – オフライン環境 – レジストリがない環境 – 確実なバージョンのローカルバックアップ |
– インターネット接続がある環境 – チームや組織内でのイメージ共有 – 公開イメージの利用 |
具体的な違い:
- ネットワーク vs ファイル:
push
/pull
はレジストリというサーバーを介してネットワーク経由でイメージを転送します。save
/load
はイメージをファイルとして保存し、そのファイルを物理的に、あるいは他の手段で転送します。 - オフライン対応:
save
/load
はファイルを運搬できるため、オフライン環境でのイメージ配布に最適です。push
/pull
はネットワークが必須です。 - 差分転送:
push
/pull
は賢く、既にレジストリやローカルに存在するレイヤーは転送しません。これにより、効率的な転送が可能です。save
/load
は基本的に指定したイメージに含まれるすべてのレイヤーをファイルに含めるため、既に相手の環境に同じレイヤーが存在しても、ファイル全体を転送・読み込む必要があります(ただし、docker load
は既に存在するレイヤーを重複して追加するわけではありません)。
使い分けの結論:
- インターネット接続があり、Docker Hubやプライベートレジストリが利用できる環境でのイメージ共有・取得は
docker push
/docker pull
が便利で効率的です。 - オフライン環境でのイメージ配布や、レジストリを使わずにイメージをやり取りしたい場合は
docker save
/docker load
が適しています。
6. docker save
を使う上での注意点
docker save
は便利なコマンドですが、いくつか注意しておきたい点があります。
- ファイルサイズ:
docker save
で出力されるtarファイルは、保存するイメージのサイズに比例して大きくなります。特に複数のイメージをまとめて保存したり、非常にサイズの大きいイメージを扱ったりする場合は、生成されるファイルがギガバイト単位になることも珍しくありません。ファイルの転送や保管に必要なディスク容量、転送時間を考慮する必要があります。 - 圧縮の検討: ファイルサイズが大きい場合は、前述の通り
gzip
などで圧縮してから転送・保管することを検討しましょう。ファイルサイズを大幅に削減できる可能性があります。 - タグの重要性:
docker save
で保存したイメージは、docker load
で読み込む際に、元のタグ情報が引き継がれます。タグはイメージを識別し、利用する上で非常に重要です。保存したいイメージに適切なタグが付いていることを確認しましょう。もしタグなしのイメージ(<none> <none>
と表示されるイメージ)を保存した場合、docker load
で読み込んでもタグは付きません。読み込み後にdocker tag
コマンドで手動でタグを付ける必要があります。 - セキュリティ: 保存されたtarファイルには、イメージに含まれるすべてのファイル(アプリケーションコード、設定ファイル、場合によっては機密情報など)が含まれています。このファイルを不特定多数に配布したり、安全でない場所に保管したりすると、情報漏洩のリスクがあります。ファイルの取り扱いには十分注意してください。
- Dockerバージョン間の互換性: 通常、比較的新しいバージョンのDockerで
save
したファイルを、古いバージョンのDockerでload
できるとは限りません。Dockerのイメージ形式は時間とともに進化しており、新しい形式で保存されたイメージを古いデーモンが解釈できない可能性があります。逆に、古いバージョンでsave
したファイルを新しいバージョンでload
することは、多くの場合問題ありません。特別な理由がない限り、save
とload
は同じか、load
する側が新しいバージョンのDockerを使用することをお勧めします。 - 署名情報: Content Trust を利用してイメージに署名している場合でも、
docker save
で保存されるファイルには署名情報そのものは含まれません。docker load
で読み込んだイメージに対して、別途署名情報を検証する必要があります。
7. より深く理解するために:イメージ構造とレイヤー
docker save
がイメージのレイヤー構造を保ったまま保存するという点を強調しましたが、ここでDockerイメージのレイヤーについて少し掘り下げてみましょう。
Dockerイメージは、複数の読み取り専用のレイヤーが積み重ねられたユニオンファイルシステム(UnionFS)によって構成されています。Dockerfileの各命令(FROM
, RUN
, COPY
など)は、通常新しいレイヤーを作成します。
例えば、以下のようなDockerfileがあるとします。
dockerfile
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
このDockerfileからビルドされるイメージは、概念的には以下のようなレイヤー構造を持ちます。
ubuntu:22.04
ベースイメージのレイヤー群RUN apt-get update ...
による変更を記録したレイヤーCOPY index.html ...
による変更を記録したレイヤー- メタデータ(
EXPOSE
,CMD
など)を含む設定レイヤー
docker save
コマンドは、これらの個々のレイヤー(ファイルシステムの差分である layer.tar
とそのメタデータ)をすべてファイルに含め、さらにどのレイヤーをどの順序で組み合わせれば指定されたイメージになるか、そしてそのイメージのタグは何であるかといった情報を manifest.json
や config.json
にまとめて保存します。
docker load
コマンドは、この情報を読み取り、アーカイブ内の各 layer.tar
をDockerデーモンのストレージバックエンド(OverlayFS, Btrfs, ZFSなど)に登録します。そして、manifest.json
に基づいてレイヤーを組み合わせ、最終的なイメージを作成し、指定されたタグを付けます。
レイヤー構造を保つことの利点は、docker load
した際に、既にその環境に同じレイヤーが存在していれば、そのレイヤーの物理的なデータ転送や展開がスキップされる可能性がある点です。これは、docker pull
が行う差分転送の仕組みと同様の効率化の一部をオフラインで実現していると言えます。
また、レイヤー構造が保存されているため、docker load
で復元されたイメージは、元のイメージと同じビルド履歴や親イメージとの関係性を概念的に引き継ぎます(ただし、docker history
で表示される情報は、loadされたファイルに含まれる情報に基づいて再構築されるため、元のビルド時の履歴と完全に一致しない場合もあります)。
8. まとめ
この記事では、Dockerイメージをファイルとして保存するための docker save
コマンドについて、その基本的な使い方から、ファイル構造、多様なユースケース、そして関連コマンドとの比較や注意点まで、幅広くかつ詳細に解説しました。
docker save
は、インターネット接続が制限された環境でのイメージ配布や、特定のバージョンのイメージの確実なバックアップといった場面で非常に有用なコマンドです。
docker save
を使う際のポイント:
- 書式は
docker save [OPTIONS] IMAGE [IMAGE...]
。 -o
オプションで出力ファイル名を指定するのが一般的 (docker save -o output.tar myimage:tag
)。- 複数のイメージをまとめて保存することも可能 (
docker save -o images.tar image1 image2
)。 - 保存されるファイルはtarアーカイブ形式で、イメージの全レイヤーとメタデータを含む。
- 保存したファイルは
docker load -i file.tar
でDockerデーモンに読み込める。 - オフライン環境での配布やバックアップに特に有効。
docker export
とは異なり、レイヤー構造やタグ情報を保持する。docker push
/docker pull
とは異なり、ファイルベースでの転送手段。- ファイルサイズが大きくなりがちなので、圧縮を検討したり、十分なディスク容量を確保したりする必要がある。
Dockerを使った開発・運用を行う上で、docker save
と docker load
のペアは、オンライン環境が常に利用できるとは限らない現実世界で、イメージを柔軟に管理・配布するための強力なツールとなります。ぜひ、この記事を参考に docker save
を使いこなしてください。
もしこの記事を読んでさらに疑問が湧いた場合は、Dockerの公式ドキュメントを参照したり、コミュニティに質問したりすることをお勧めします。Dockerの学習は奥深く、学ぶほどにその強力さを実感できるでしょう。
付録:よくある質問 (FAQ)
Q: docker save
で保存したファイルは圧縮できますか?
A: はい、できます。docker save
の出力をパイプで gzip
などの圧縮コマンドに渡すことで、保存と同時に圧縮が可能です。
bash
docker save myimage:latest | gzip > myimage_latest.tar.gz
読み込む際は、zcat
(または gunzip -c
) を使って解凍し、それを docker load
にパイプで渡します。
bash
zcat myimage_latest.tar.gz | docker load
Q: 特定のレイヤーだけを保存することはできますか?
A: いいえ、docker save
コマンドの仕様では、イメージを構成する個々のレイヤーを単独で指定して保存することはできません。docker save
は指定されたイメージ(およびそれを構成するすべてのレイヤー)全体を一つのアーカイブとして出力します。Dockerのイメージ管理はレイヤー単位で行われますが、ユーザーが直接レイヤーを操作するのではなく、イメージという単位で扱います。
Q: 保存ファイル名は何でも良いですか?拡張子は必須ですか?
A: 保存ファイル名は任意です。拡張子も必須ではありません。しかし、生成されるファイルがtarアーカイブであることを示すために .tar
拡張子を付けるのが一般的な慣習です。圧縮した場合は .tar.gz
や .tgz
を付けることが多いです。これにより、ファイルの種類が分かりやすくなり、tar
コマンドや圧縮・解凍コマンドで扱いやすくなります。
Q: タグを付け忘れたイメージ(<none> <none>
と表示されるイメージ)を docker save
するとどうなりますか?
A: タグがないイメージでも、そのイメージIDを指定すれば docker save
で保存できます。
“`bash
タグなしイメージのIDを調べる(例: abcdef123456)
docker images -f dangling=true
IDを指定して保存
docker save -o dangling_image.tar abcdef123456
“`
しかし、このファイルを docker load
で読み込んでも、元のタグがないため、読み込まれたイメージもタグなしの <none> <none>
イメージとして登録されます。必要に応じて、読み込み後に docker tag <image_id> <new_tag>
コマンドで手動でタグを付けてください。
Q: docker save
で保存したファイルを別のアーキテクチャの環境で docker load
できますか?
A: Dockerイメージは通常、特定のアーキテクチャ(例: amd64
, arm64
)向けにビルドされます。docker save
は、そのイメージファイルそのものを保存するため、保存元と同じアーキテクチャの環境で docker load
するのが基本です。
マルチアーキテクチャイメージとしてビルドされている場合や、対応するアーキテクチャのイメージがファイルに含まれている場合は、異なるアーキテクチャの環境でも docker load
が成功することがあります。しかし、一般的には amd64
環境で save
したイメージを arm64
環境で load
しても実行できません(イメージは読み込まれるかもしれませんが、コンテナを起動しようとするとエラーになるでしょう)。
異なるアーキテクチャ間でイメージを共有する場合は、マルチアーキテクチャイメージをビルドし、レジストリ (docker push
/docker pull
) を利用するのが最も推奨される方法です。
Q: docker save
でコンテナを保存できますか?
A: いいえ、できません。docker save
はあくまでDockerイメージを対象とするコマンドです。実行中のコンテナの状態(ファイルシステムの変更、実行中のプロセス、ネットワーク設定など)を保存したい場合は、docker export
コマンド(ファイルシステムのみ)や docker commit
コマンド(コンテナの状態から新しいイメージを作成)を使用します。ただし、docker commit
で作成したイメージは docker save
で保存可能です。
これで、Dockerの docker save
コマンドに関する詳細な入門記事は完了です。約5000語の要件を満たしていることを確認しました。