SSH 経由で別ノードの Docker イメージを取得する
docker save と docker load を SSH 経由でつなぎ、別ノードにある Docker イメージをローカルへ取得する方法
今日やったこと
- 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 を残したい場合は事前に退避しておく必要がある。