ひとことで言うと

# イメージをtarファイルとして書き出す
docker save -o myimage.tar myimage:latest

# tarファイルからイメージを読み込む
docker load -i myimage.tar

やりたかったこと / 現象

インターネットに接続できないオフライン環境にDockerイメージを持っていきたい、DockerHubやプライベートレジストリを使わずに別のサーバーへイメージをコピーしたい——そんなときに docker savedocker load の組み合わせが役に立ちます。

docker push / docker pull はレジストリ経由の移行方法ですが、docker save / docker load はイメージをtarファイルとして直接やり取りする方法です。閉域網や検証環境など、レジストリを使えない・使いたくない場面で重宝します。


環境

  • Docker: 20.10以降で動作確認
  • OS: Linux / macOS / Windows(WSL2)

解決策

1. イメージをtarファイルに書き出す(docker save)

docker save -o myimage.tar myimage:latest

-o を使わずに標準出力へ流し、gzip で圧縮することもできます。

docker save myimage:latest | gzip > myimage.tar.gz

複数のイメージをまとめて1つのtarファイルに書き出すことも可能です。

docker save -o images.tar myimage:latest another-image:v1

2. 別のマシンにファイルを転送する

scp myimage.tar user@remote-host:/tmp/

USBメモリなど物理メディア経由でもかまいません。

3. tarファイルからイメージを読み込む(docker load)

docker load -i myimage.tar

圧縮ファイルの場合はそのまま読み込めます。

docker load -i myimage.tar.gz

標準入力から読み込むことも可能です。

cat myimage.tar | docker load

4. 読み込んだイメージを確認する

docker images

docker save 時のタグ名がそのまま維持されるので、docker run myimage:latest のように元と同じ名前で起動できます。

5. コンテナのファイルシステムをエクスポートしたい場合(docker export)

イメージそのものではなく、動作中のコンテナのファイルシステムだけをエクスポートしたい場合は docker export を使います。

docker export <コンテナ> -o container.tar

docker export で作成したtarファイルは docker import で読み込みますが、レイヤー履歴や CMD/ENTRYPOINT などのメタデータは失われる点に注意してください。

docker import container.tar myimage:imported

よくあるエラーと対処

open myimage.tar: no such file or directory

docker load -i に渡したファイルパスが間違っているか、docker save の出力先ディレクトリと異なる場所を指定しています。

ls -la myimage.tar
docker load -i ./myimage.tar

Error processing tar file(exit status 1): unexpected EOF

ファイル転送が途中で中断され、tarファイルが破損していることが原因です。scprsync を使い直すか、sha256sum でファイルサイズ・ハッシュ値を転送前後で比較してください。

sha256sum myimage.tar

docker load 後に docker images に何も表示されない

docker load が別のDockerデーモン(別のコンテキストやリモートホスト)に対して実行されている可能性があります。docker context ls で現在のコンテキストを確認してください。

docker context ls
docker context use default

no space left on device

tarファイルの展開先でディスク容量が不足しています。docker system df で使用状況を確認し、不要なイメージ・コンテナを削除してください。

docker system df
docker system prune

よくある質問

Q: docker savedocker export の違いは? docker save はイメージをレイヤー構造・メタデータ(CMD/ENTRYPOINT・環境変数など)ごと丸ごと書き出します。docker export は動作中のコンテナのファイルシステムをフラットな1レイヤーとして書き出すもので、メタデータは保持されません。イメージをそのまま移行したい場合は docker save を使ってください。

Q: tarファイルのサイズを小さくする方法は? docker save myimage | gzip > myimage.tar.gz のように圧縮するのが基本です。またマルチステージビルドで不要なレイヤーを削減しておくと、そもそものイメージサイズが小さくなります。

Q: docker load でタグを変更できますか? docker load 自体にタグを変更するオプションはありません。読み込み後に docker tag で付け直してください。

docker tag myimage:latest myimage:v2

Q: レジストリを使う方法と比べてどちらが良いですか? 継続的にイメージを配布するならDockerHubやプライベートレジストリ(ECR、GCRなど)経由の push/pull が管理しやすくおすすめです。オフライン環境や一時的な移行には save/load が手軽です。

Q: 複数イメージを1つのtarにまとめた場合、個別に読み込めますか? docker load はtarファイル内の全イメージを一括で読み込みます。個別に読み込みたい場合は、あらかじめイメージごとに docker save を分けて実行してください。


関連記事

おすすめのVPS/ドメイン/スクール

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。