docker saveとdocker loadでイメージをオフライン移送する方法|閉域網サーバーへの持ち込み運用

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Docker > docker saveとdocker loadでイメージをオフライン移送する方法|閉域網サーバーへの持ち込み運用
「閉域網のサーバーにDockerイメージを持ち込みたいが、docker pull が使えない」
インターネット非接続の環境(閉域網・エアギャップ環境)でコンテナを動かす場面は、金融・官公庁・製造業の制御系など、セキュリティ要件の厳しい現場では決して珍しくありません。

この記事では、docker savedocker load を使い、インターネット接続のある環境でイメージをtarファイルに書き出し、閉域網サーバーへ安全に持ち込む手順を解説します。
基本コマンドの構文から、複数イメージの一括保存・gzip圧縮による容量削減・転送後の整合性確認・よくあるエラーの対処法まで、現場で即座に使える内容を網羅します。

動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x)

この記事のポイント

・docker save -o image.tar イメージ名 でイメージをtarファイルに保存できる
・docker load -i image.tar でtarファイルからイメージを復元する
・gzipと組み合わせると転送ファイルサイズを50~70%削減できる
・docker images --digests で転送前後のダイジェスト一致を確認して整合性を保証する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ docker save / docker load が必要なのか

通常のDockerイメージ取得は docker pull でDocker Hubやプライベートレジストリから直接ダウンロードします。しかし以下のような環境では、この経路が使えません。

・金融・官公庁などセキュリティポリシーで外部通信を遮断した閉域ネットワーク
・工場の制御系サーバーなどインターネットに物理的に繋がっていないエアギャップ環境
・社内セキュリティ審査中でDocker Hubへのアクセスが一時制限されている環境

このような「ネットワーク越しにイメージを取ってこられない」状況で活躍するのが docker save / docker load の組み合わせです。

基本的な移送フローは3ステップです。

・インターネット接続のある作業用PCでイメージをtarファイルに書き出す
・tarファイルをUSBメモリやSCPなど許可された経路で閉域網サーバーに転送する
・閉域網サーバーでtarファイルからイメージを復元し、コンテナを起動する

docker export / docker import というコマンドも存在しますが、これらは「コンテナのファイルシステム」を保存するもので、イメージのレイヤー構造やメタデータは保持されません。イメージをそのまま移送したい場合は必ず docker save / docker load を使います。

docker save の基本的な使い方

1. 移送するイメージを確認する

まず作業用PCで、移送したいイメージが存在することを確認します。

# ローカルに存在するイメージを一覧表示 $ docker images # 出力例 REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.25 a8758716bb6a 2 weeks ago 192MB myapp latest b3f9e2d81c99 3 days ago 450MB postgres 16 1234567890ab 1 month ago 412MB

2. docker save でtarファイルに保存する

docker save はDockerイメージをすべてのレイヤー情報・メタデータごとtarアーカイブに書き出します。-o オプションで出力先ファイルを指定します。

# 書式 $ docker save -o [出力ファイル名.tar] [イメージ名:タグ] # 実行例: nginx 1.25 を保存 $ docker save -o nginx-1.25.tar nginx:1.25 # ファイル生成を確認 $ ls -lh nginx-1.25.tar -rw------- 1 user user 188M Jul 20 10:00 nginx-1.25.tar

-o を省略してリダイレクト(>)で書くこともできます。

# リダイレクトで書き出す(-o と同等) $ docker save nginx:1.25 > nginx-1.25.tar

後述するgzip圧縮と組み合わせる場合はリダイレクト形式のほうがパイプと組み合わせやすいため、用途に応じて使い分けてください。

3. tarファイルを閉域網サーバーへ転送する

生成したtarファイルを、現場のセキュリティポリシーで許可された方法で転送します。

SCP/SFTP:ネットワーク的に到達できる場合(同一セグメント・踏み台経由等)
USBメモリ・外部ストレージ:ネットワーク的に完全に隔離されたエアギャップ環境
共有フォルダ(Samba等):同一ネットワーク内で共有フォルダが使える場合

SCPを使う場合の実行例です。

# SCPで閉域網サーバーに転送(192.168.10.50 はサーバーのIPアドレス) $ scp nginx-1.25.tar user@192.168.10.50:/tmp/ # 転送完了後にサーバー側でファイルを確認 $ ssh user@192.168.10.50 "ls -lh /tmp/nginx-1.25.tar" -rw-r--r-- 1 user user 188M Jul 20 10:05 /tmp/nginx-1.25.tar

USBメモリを使う場合は、作業用PCでUSBメモリをLinuxシステムに認識させてマウントし、cp でtarファイルをコピーします。Linuxでの外部メディアのマウント操作については mount コマンドの使い方 を参考にしてください。

注意: docker save で作成したtarファイルにはイメージのレイヤー全体が含まれます。機密情報を含むイメージを扱う際は、社内のセキュリティポリシーに従い、転送後のtarファイルは適切に削除または暗号化してください。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、docker save/loadのオフライン移送から本番コンテナ運用まで含めた実践的なDocker講座を用意しています。
Dockerマスター講座の詳細はこちら >>

docker load でイメージを復元する

1. 閉域網サーバーでtarファイルを読み込む

転送したtarファイルを、閉域網サーバー上の docker load で読み込みます。

# 書式 $ docker load -i [tarファイル名] # 実行例 $ docker load -i /tmp/nginx-1.25.tar # 出力例 Loaded image: nginx:1.25 # イメージが復元されたことを確認 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.25 a8758716bb6a 2 weeks ago 192MB

-i を省略してリダイレクトでも読み込めます。

# リダイレクトで読み込む(-i と同等) $ docker load < /tmp/nginx-1.25.tar Loaded image: nginx:1.25

2. コンテナを起動して動作確認する

イメージが正常に復元されたら、コンテナを起動して動作を確認します。

# 復元したイメージからコンテナを起動 $ docker run -d --name nginx-test -p 8080:80 nginx:1.25 # 起動確認 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS a1b2c3d4e5f6 nginx:1.25 "/docker-entrypoint." 5 seconds ago Up 4 seconds # 動作確認(HTTPレスポンスを確認) $ curl -I http://localhost:8080 HTTP/1.1 200 OK Server: nginx/1.25.3

応用・実務Tips

複数イメージをまとめて1ファイルに保存する

docker save は複数のイメージをスペース区切りで並べることで、1つのtarファイルにまとめて保存できます。Docker Composeで使うスタック全体を一括転送したい場合に便利です。

# 複数イメージを1ファイルに保存 $ docker save -o myapp-stack.tar nginx:1.25 postgres:16 redis:7 # ファイルサイズ確認 $ ls -lh myapp-stack.tar -rw------- 1 user user 512M Jul 20 10:10 myapp-stack.tar # 復元時は docker load -i で一括復元される $ docker load -i myapp-stack.tar Loaded image: nginx:1.25 Loaded image: postgres:16 Loaded image: redis:7

gzip圧縮でファイルサイズを削減する

docker save が出力するtarは非圧縮なので、転送前にgzip圧縮することでファイルサイズを大幅に削減できます。圧縮率はイメージの内容によって異なりますが、おおむね50~70%の削減を見込めます。

# docker save の出力をパイプでgzipに渡して圧縮 $ docker save nginx:1.25 | gzip > nginx-1.25.tar.gz # ファイルサイズ比較(圧縮前: 188M → 圧縮後: 約56M) $ ls -lh nginx-1.25.tar nginx-1.25.tar.gz -rw------- 1 user user 188M Jul 20 10:00 nginx-1.25.tar -rw-r--r-- 1 user user 56M Jul 20 10:15 nginx-1.25.tar.gz # 圧縮済みファイルの復元(gunzip してから docker load に渡す) $ gunzip -c nginx-1.25.tar.gz | docker load Loaded image: nginx:1.25

tarアーカイブの基本的な操作については tar コマンドの実用例 も参考にしてください。

転送前後のダイジェストで整合性を確認する

転送中にファイルが破損していないかを確認するには、docker images --digests コマンドを使います。転送元と転送先でダイジェスト値(SHA256ハッシュ)が一致していれば、イメージの整合性は保たれています。

# 転送元(作業用PC)でダイジェストを確認 $ docker images --digests nginx:1.25 REPOSITORY TAG DIGEST IMAGE ID nginx 1.25 sha256:32fdf92b4e986e109e4db0865758020b4087c2b8e38bdd3c72d3f2d68c76f534 a8758716bb6a # 転送先(閉域網サーバー)で同じダイジェストを確認 $ docker images --digests nginx:1.25 REPOSITORY TAG DIGEST IMAGE ID nginx 1.25 sha256:32fdf92b4e986e109e4db0865758020b4087c2b8e38bdd3c72d3f2d68c76f534 a8758716bb6a

ダイジェスト値が完全に一致していれば転送成功です。異なる場合は転送中にファイルが破損しているため、再転送してください。

タグなしイメージはIMAGE IDで保存する

docker images でタグが <none> になっているイメージは、タグ名の代わりにIMAGE IDを指定して保存できます。

# タグなしイメージをIMAGE IDで保存 $ docker save -o myapp-b3f9e2d.tar b3f9e2d81c99 # 復元後に docker tag でタグを付ける $ docker load -i myapp-b3f9e2d.tar $ docker tag b3f9e2d81c99 myapp:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE myapp latest b3f9e2d81c99 3 days ago 450MB

トラブルシュート・エラー対処

「Error response from daemon: No such image」が出た場合

docker save 実行時にこのエラーが出る場合、指定したイメージ名またはタグが間違っているか、イメージがローカルに存在しない可能性があります。

$ docker save -o nginx.tar nginx:latest Error response from daemon: No such image: nginx:latest

まず docker images で正確なリポジトリ名とタグを確認してから、改めてコマンドを実行してください。nginx:latest のように曖昧なタグより nginx:1.25 のように明示的なタグを使うことで、意図しないバージョン指定ミスを防ぐことができます。

「docker load: invalid tar header」が出た場合

docker load でこのエラーが出る場合、gzip圧縮済みファイルをそのまま docker load -i で指定している可能性があります。

# NG: .tar.gz をそのまま -i で指定するとエラーになる $ docker load -i nginx-1.25.tar.gz open /proc/self/fd/11: invalid argument # OK: gunzip で展開してからパイプで渡す $ gunzip -c nginx-1.25.tar.gz | docker load Loaded image: nginx:1.25

docker load 後にタグが <none> になっている場合

docker load 後に docker images を確認したとき、タグが <none> になっている場合があります。これは保存時にIMAGE IDのみで保存した場合や、元のイメージにタグが付いていなかった場合に発生します。

# タグがnoneになっている場合 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> a8758716bb6a 2 weeks ago 192MB # docker tag で後付けでタグを付ける $ docker tag a8758716bb6a nginx:1.25 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.25 a8758716bb6a 2 weeks ago 192MB

転送先サーバーでdockerコマンドが「permission denied」になる場合

Docker Engineが動作しているにも関わらず、一般ユーザーで docker load を実行すると以下のエラーが出ることがあります。

$ docker load -i nginx-1.25.tar permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock # 対処1: sudo をつけて実行 $ sudo docker load -i nginx-1.25.tar # 対処2: ユーザーをdockerグループに追加して再ログイン $ sudo usermod -aG docker $USER # 一度ログアウトして再ログインすると反映される

本記事のまとめ

やりたいこと コマンド
イメージをtarファイルに保存 docker save -o image.tar イメージ名:タグ
複数イメージを1ファイルに保存 docker save -o all.tar img1:tag img2:tag
gzip圧縮して保存 docker save イメージ名:タグ | gzip > image.tar.gz
tarファイルからイメージを復元 docker load -i image.tar
gzip圧縮済みファイルから復元 gunzip -c image.tar.gz | docker load
転送前後の整合性確認 docker images --digests イメージ名:タグ
タグなしイメージにタグを付与 docker tag IMAGE_ID リポジトリ名:タグ
docker save / docker load はシンプルなコマンドですが、閉域網への持ち込み・障害時のイメージリストア・チームメンバーへのローカル配布など、現場の実務で意外と頻繁に使うシーンがあります。

特に閉域網へのDockerイメージ持ち込みでは、転送前後のダイジェスト確認gzip圧縮による転送ファイルの軽量化 の2点を習慣にするだけで、トラブルのほとんどを防ぐことができます。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、閉域網でのDockerイメージ管理からコンテナ本番運用設計まで体系的に学べるDocker講座を用意しています。
Dockerマスター講座の詳細はこちら >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。