docker コンテナを他の PC にコピーする
先日、とある開発 PC で稼働中の docker コンテナを、別の開発 PC に移転 (コピー) したい需要が発生しました。プラットフォームは Windows で Docker for Desktop を使っています。docker 詳しくないので Bing Chat に聞いてみながらやってみた結果を、自分の備忘録的に、以下にメモします。
コピー元 PC での作業
コンテナをイメージにコミット
まずは、docker commit
コマンドを使用して、移転したいコピー元の docker コンテナのストレージ状態を、docker イメージにコミットします。前提として、対象の docker コンテナは停止させておきます。以下のとおり実行することで、指定した名前の docker コンテナの現在状態が、指定した名前・タグの docker イメージとして保存・コミットされます。
> docker commit {コンテナ名} {イメージ名}:{タグ}
イメージを .tar にエクスポート
次は、docker save
コマンドを使用して、上記手順で作成したイメージを、.tar ファイル形式で任意のフォルダに取り出します。以下のとおり実行することで、指定した名前・タグの docker イメージが、指定した .tar ファイルとして保存されます。
> docker save -o {保存先の .tar ファイルのパス} {イメージ名}:{タグ}
こうしてコピー元の PC 上に保存された .tar ファイルを、コピー先の PC に、何らかの手段でコピーします。
ボリュームを .tar.gz にエクスポート
さらに、コピー元の docker コンテナにマウントされていたボリュームも .tar.gz ファイルにエクスポートします。
まず、コピー元の docker コンテナにマウントされているボリュームが何であるかを,
docker ispect
コマンドを使用して確認します。ただし、docker inspect
コマンドの実行結果は、長い JSON テキストになるので、ボリュームに関する情報を探すのが大変です。そこで、パイプで jq
コマンドにつないで、マウントされているボリューム名だけを表示するようにします (なので、事前に、jq
コマンドが利用できるようにしておく必要があります)。
> docker inspect {コンテナ名} | jq '.[0].Mounts[].Name'
"77d4(途中省略)62af"
このようにして、コピー元の docker コンテナにマウントされているボリュームの名前が特定できましたら、以下のコマンドを実行して、指定の名前のボリュームを、指定のファイル名 .tar.gz ファイルに書き出します (.tar.gz ファイルは、カレントフォルダ内に生成されます)。
> docker run --rm -v {書き出すボリューム名}:/src -v .:/dest busybox tar -zcf /dest/{保存する .tar.gz ファイル名} -C /src .
こうしてコピー元の PC 上に保存された .tar.gz ファイルを、コピー先の PC に、何らかの手段でコピーします。
コピー先 PC での作業
.tar をイメージにインポート
次はコピー先 PC での作業となります。
docker load
コマンドを使用して、コピー元の docker イメージから書き出された .tar ファイルを、コピー先の dokcer イメージとして読み込みます。読み込んだ先のイメージの名前とタグは、コピー元におけるイメージ名とタグで復元されます。
> docker load -i {読み込む .tar ファイルのパス}
.tar.gz をボリュームに復元
さらに、以下のコマンドを実行して、コピー元の docker ボリュームから書き出された .tar.gz ファイルから、コピー先 docker の、指定した名前のボリュームとして復元します。なお、.tar.gz ファイルがあるフォルダにカレントフォルダを移動してから下記コマンドを実行する必要があります。
docker run --rm -v {復元先ボリューム名}:/dest -v .:/src busybox tar -zxf /src/{.tar.gz ファイル名} -C /dest
コンテナを立ち上げる
あとはコピー元の docker コンテナと同じパラメーターを指定して、コピー先 PC にてこれらイメージやボリュームから docker コンテナを立ち上げれば、コピー元にあったのと同じ状態のコンテナが、コピー先 PC で稼働開始となります。
docker run {オプション} {イメージ名}:{タグ}
以上です。
おわりに
もしかすると、こんなまどろっこしいことしなくてもコマンド一発でコンテナをエクスポート/インポートしたりできるのでしょうか。もしそうであれば、ぜひお知らせ下さい。
Discussion