Docker コンテナを別のホストにコピー/移動する方法
Docker コンテナはいわばソフトウェアの小さな箱であるため、コンピュータ間でコピーしたり移動したりできます。ただし、これについてはあまり議論されません。おそらく、大規模な組織は独自のリポジトリを設定し、独自のイメージをカスタマイズして、必要に応じてサーバー全体に配布できるためです。ただし、1 つ以上のコンテナを時々移動する必要がある場合は、独自の配布ラインを設定するという面倒な作業を行う必要はありません。
ローカル コンピューター上で Docker インスタンスを操作し、それをより強力なサーバーに移動することにしたかもしれません。あるいは、カスタマイズしたコンテナーを複数のコンピューターに「コピーして貼り付け」て展開したいだけかもしれません。また、クラウド コンピューティング プロバイダーに不満があり、別のプロバイダーに切り替えたい場合もあります。どのような状況であっても、これを行うためのかなり簡単な手順があり、それについては以下で詳しく説明します。
こちらもお読みください: Ubuntu で Docker を使用して WordPress をセットアップする方法
ソースホストからコンテナイメージを保存
最初にコンテナーを停止する必要はありませんが、停止することを強くお勧めします。 Docker インスタンス内のデータのスナップショットを取得します。これを実行中に実行している場合、スナップショット内の一部のファイルが不完全になる可能性がわずかにあります。誰かが 500MB のファイルをアップロードしていると想像してください。 250MB がアップロードされたら、docker commit
コマンドを発行します。アップロードは続行されますが、この Docker イメージを別のホストに復元すると、500 MB のうち 250 MB しか使用できない可能性があります。
したがって、可能であれば、まずインスタンスを停止します。
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'
SSH クライアントが組み込まれているため (PuTTY はもう必要ありません)、Windows からも動作するはずです。
その後、状況に応じて docker run
コマンドを続行します。
結論
docker save
と docker load
は、コンテナを時々移動するためのアドホック ソリューションとして最適です。ただし、これを頻繁に行う場合は、代わりに独自のプライベート リポジトリを設定することをお勧めします。
画像クレジット: 空軍医療サービス