今日やったこと

  • SSH 接続できる別ノードから、Docker イメージを取得する方法を確認した
  • tar ファイルを手元に保存せず、パイプで直接転送する方法を確認した
  • すでに同じ名前・タグのイメージがローカルにある場合の注意点を整理した
  • 既存イメージを上書きする場合と、別タグとして残す場合の流れを確認した

基本形は以下。

ssh user@remote-node "docker save IMAGE_NAME:TAG" | docker load

例:

ssh user@remote-node "docker save my-app:latest" | docker load

このコマンドでは、転送元ノードで docker save を実行し、その出力を SSH 経由でローカル側の docker load に渡している。

学んだこと

  • docker save は、Docker イメージをアーカイブ形式で標準出力に書き出せる
  • docker load は、docker save で書き出したイメージを読み込むためのコマンド
  • ssh "コマンド" を使うと、リモートノード上でコマンドを実行できる
  • | は、左側のコマンドの出力を右側のコマンドへ渡すパイプ
  • つまり、以下のコマンドは「リモートでイメージを書き出して、ローカルで読み込む」という意味になる
ssh user@remote-node "docker save my-app:latest" | docker load

すでにローカルに同じ名前・タグのイメージがある場合、docker load 後はそのタグが新しく読み込んだイメージを指すようになる。

上書きしてよい場合は、そのまま実行してよい。

ssh user@remote-node "docker save my-app:latest" | docker load

既存のイメージを残したい場合は、先に別タグを付けて退避しておく。

docker tag my-app:latest my-app:local-backup
ssh user@remote-node "docker save my-app:latest" | docker load

読み込んだイメージを別タグとして使いたい場合は、読み込み後にタグを付ける。

docker tag my-app:latest my-app:from-remote

ただし、この方法では一度 my-app:latest が新しいイメージを指すため、元の latest を残したい場合は事前に退避しておく必要がある。