Dockerコンテナを別のホストにコピー・移動する方法
Dockerコンテナは、いわばソフトウェアの小さな箱のようなものです。そのため、コンテナをコンピュータ間でコピーしたり移動したりすることが可能です。しかし、この手法についてはあまり語られることがありません。おそらく、大規模な組織では独自のレジストリを構築し、カスタマイズしたイメージを自社のサーバー群に自由に配布できる体制を整えているためでしょう。とはいえ、たまに1つか2つのコンテナを移動したいだけのために、独自の配布環境を構築する手間をかける必要はありません。
例えば、ローカルマシン上で作業していたDockerインスタンスを、より高性能なサーバーへ移したい場合があるかもしれません。あるいは、カスタマイズ済みのコンテナを複数のマシンに展開し、「コピー&ペースト」のように使い回したいこともあるでしょう。また、クラウドプロバイダに不満があり、別のプロバイダへ乗り換えたいというケースも考えられます。状況はさまざまですが、いずれの場合も、以下で詳しく解説する比較的シンプルな手順で対応できます。
移行元ホストでコンテナイメージを保存する
必須ではありませんが、作業前にコンテナを停止しておくことを強くおすすめします。この操作では、Dockerインスタンス内のデータのスナップショットを作成するためです。コンテナが稼働中のままスナップショットを取得すると、一部のファイルが不完全な状態で保存されてしまう可能性があります。例えば、誰かが500MBのファイルをアップロードしている最中に、250MBの時点でdocker commitコマンドを実行したとしましょう。アップロードはその後も続きますが、このイメージを別のホストで復元すると、500MBのうち250MB分しか利用できない恐れがあります。
そのため、可能であればまずインスタンスを停止してください。
docker stop NAME_OF_INSTANCE
Dockerコンテナは、汎用的な初期イメージをもとに構築されます。時間の経過とともに、そのベースイメージに対して自分自身の変更を加えていくことになります。さらに、コンテナ内で動作しているプロセスが独自のデータを保存したり、その他の変更を行ったりすることもあります。これらすべてを保持するには、現時点の状態を新しいイメージとしてコミットします。
なお、インスタンスが現在稼働中の場合、この操作の間、内容の保存中はコンテナが一時的にポーズされます。コンテナに大量のデータを追加している場合は、完了までに時間がかかることがあります。これが問題になる場合は、次のコマンドの代わりに docker commit -p=false NAME_OF_INSTANCE mycontainerimage を実行すれば、一時停止を回避できます。ただし、絶対に必要な場合を除き、この方法は使わないでください。不整合や欠落のあるデータを含むイメージが作成されるリスクが高まります。
このチュートリアルでは、生成されるイメージに汎用名 mycontainerimage を付けています。名前は自由に変更できますが、変更した場合は、以降のコマンドに出てくる同名部分をすべて置き換えることを忘れないでください。
docker commit NAME_OF_INSTANCE mycontainerimage
次に、このイメージをファイルに保存し、圧縮します。
docker save mycontainerimage | gzip > mycontainerimage.tar.gz
その後、任意のファイル転送手段を使って、mycontainerimage.tar.gz をコンテナの移行先となるホストにコピーしてください。
移行先ホストでコンテナイメージを読み込む
イメージを転送したホストにログインしたら、Dockerへインポートします。
gunzip -c mycontainerimage.tar.gz | docker load
このホストではまだコンテナを初期化していないため、docker start で起動することはできません。代わりに、最初にこのDockerインスタンスを実行したときと同じコマンドを使用します。唯一の違いは、末尾に以前使用していたイメージ名ではなく「mycontainerimage」を指定する点です。
次のコマンドはあくまで一例です。ご自身の環境に当てはまる場合以外は、そのままコピー&ペーストしないでください。(初回実行時に特別なパラメータが必要なかったケース)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
対比として、ホストマシンの80番ポートをコンテナの80番ポートへ転送するために --publish パラメータが必要だった場合のコマンド例を以下に示します。
docker run -d --name=http-server --publish 80:80 mycontainerimage
以降は、通常どおり docker stop および docker start コマンドで、このコンテナの停止・起動が行えます。
ファイルを作成せずにイメージを転送する
場合によっては、mycontainerimage.tar.gz ファイルの作成を省きたいこともあるでしょう。コンテナに大量のデータが含まれていて、ディスク容量が足りないのかもしれません。そんなときは、保存・圧縮・転送・展開・読み込みを1つのコマンドでまとめて実行できます。最初のセクションで説明した docker commit コマンドを実行した後、次のコマンドを使用します。
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
WindowsにもSSHクライアントが標準搭載されるようになったため(PuTTYはもう不要)、このコマンドはWindowsからでも問題なく動作するはずです。
その後は、ご自身の状況に合った docker run コマンドに進んでください。
まとめ
docker save と docker load は、コンテナをたまに移動させる程度のアドホックな用途には非常に便利な仕組みです。ただし、頻繁に行うのであれば、代わりにプライベートレジストリを構築することを検討するとよいでしょう。
画像クレジット:Air Force Medical Service
-
Windowsを別のドライブ(HDD/SSD)に移行する2つの方法【Windows 11/10/8.1対応】
Windowsを別のドライブに移したい方は、この記事を読み進めてください。パソコンのハードウェアは、使えば使うほど経年劣化していきます。もちろんハードディスクも例外ではなく、長年使用すると性能が徐々に低下し、いずれ交換が必要になります。 ハードディスクは、仕事のデータ(文書・写真・動画・重要な個人情報など)を保存しておく場所であり、パソコンの中で最も重要な装置と言えます。そのため、データ消失などのトラブルを防ぎ、パソコンの寿命と性能を維持するためには、3〜5年を目安に交換することをおすすめします。 現在お使いのWindowsが入ったHDDを、新しいHDDまたはSSD(平均的なハードディスクの1
-
Windows 10でインストール済みアプリ・プログラムを別ドライブに移動する完全ガイド
Windows 10でプログラムやソフトウェア、アプリケーションを使うには、事前にインストールが必要です。通常、プログラムはオペレーティングシステム(OS)が格納されているルートフォルダ、つまり多くの方にとってCドライブにインストールされます。しかし、ゲームやアプリを次々とインストールしているうちに、Cドライブの空き容量がどんどん逼迫していったらどうすればよいのでしょうか?CドライブにはWindowsのシステムファイルやプログラムファイルが含まれており、誤ってフォルダを削除するとパソコンが正常に動作しなくなる恐れがあります。そのため、むやみに削除するのは避けるべきです。Cドライブの空き容量を確