docker pull が使えない」インターネット非接続の環境(閉域網・エアギャップ環境)でコンテナを動かす場面は、金融・官公庁・製造業の制御系など、セキュリティ要件の厳しい現場では決して珍しくありません。
この記事では、
docker save と docker 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 で転送前後のダイジェスト一致を確認して整合性を保証する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ 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
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
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
転送前後のダイジェストで整合性を確認する
転送中にファイルが破損していないかを確認するには、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マスター講座の詳細はこちら >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:DockerイメージをCIで自動ビルドしてレジストリへプッシュする手順|GitHub Actionsのタグ戦略とキャッシュ活用
- 前のページへ:DockerのENV・ARG・env_fileを正しく使う設計|ビルド時と実行時の値の渡し方とsecrets
- この記事の属するカテゴリ:Dockerへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます