Dockerのイメージやコンテナをバックアップして別の環境に移行する

Dockerのコンテナやイメージを他の仮想マシンに持っていったり、持ち込んだりします。Oracle Cloudの2つのインスタンス同士でやり取りをします。インスタンスのOSはどちらともLinuxです。
まずはコンテナをエクスポートします。exportコマンドはコンテナのファイルシステムをアーカイブとして出力します。コンテナIDを付けて入力します。

docker export -o bk.tar 3faab49a6127

コマンドを実行したディレクトリに圧縮したファイルが作成されます。このファイルを一度自分のPCにダウンロードします。TeraTermのSSH SCPを使用します。パーミッションのエラーが発生しました。ファイルに適切なパーミッションを設定します。

chmod 666 bk.tar

ダウンロードに時間がかかりそうだったので別の方法を試すことにしました。

移行元で直接移行先にファイルを送るか、移行先で移行元からファイルを取り寄せることにします。今回は後者の方法を選択します。

移行先で移行元からファイルを受け取りますがrsyncのコマンドを入力します。移行元ではSSH接続を秘密鍵を使用してログインしていたので、移行元の秘密鍵が必要になります。また2つのインスタンスは同じVPCネットワークを使用しているので同じセグメントのプライベートIPアドレスが割り振ってあります。高速に転送できるはずです。
https://minokamo.tokyo/2022/05/29/4742/

rsync -e 'ssh -i /tmp/ssh-key-2022-01-06.key' -av opc@10.0.0.240:/tmp/bk.tar /tmp

無事持ってくることができました。

移行先ではDockerをインストールしたばかりで何もないはずです。

docker ps

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Dockerをインストールしたばかりで起動していなかったようです。ついでにサービスが自動起動するように設定します。

systemctl start docker
systemctl enable docker

持ってきたファイルをインポートします。このコマンドはファイルシステム、イメージを作成するため、tarボールから内容を読み込みます。

docker import /tmp/bk.tar

コンテナを確認してみるとなにもないが、イメージが存在していました。

今度はDockerのsaveコマンドを使用して挙動を確認します。このコマンドは先ほどと違い、イメージをバックアップするのでコンテナをイメージにするコマンドを入力します。移行元に戻りコマンドを入力します。コンテナを停止することなくイメージにすることができました。

使い方
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

このコマンドはコンテナに対する変更から、新しいイメージを作成します。

docker commit rev rev172-11

イメージが追加されました。続いてこのイメージをセーブコマンドで保存します。このコマンドは1つまたは複数のイメージをtarアーカイブに保存してくれます。

docker save [OPTIONS] IMAGE [IMAGE…]

docker save -o bk1.tar 98da9e8fcff8
chmod 666 bk1.tar

再び移行先でファイルを取り寄せます。

rsync -e 'ssh -i /tmp/ssh-key-2022-01-06.key' -av opc@10.0.0.240:/tmp/bk1.tar /tmp

ロードコマンドを入力します。このコマンドはtarアーカイブか標準入力からイメージを取り込みます。

docker load -i /tmp/bk1.tar

62ed8ed20fdb: Loading layer 77.86MB/77.86MB
87628248381f: Loading layer 60.98MB/60.98MB
c5ddee085135: Loading layer 3.072kB/3.072kB
556c4cc42993: Loading layer 4.096kB/4.096kB
df0854c47989: Loading layer 3.584kB/3.584kB
c775eb259077: Loading layer 7.168kB/7.168kB
337b71a0dca9: Loading layer 98.02MB/98.02MB
7321373c4490: Loading layer 147.5kB/147.5kB
Loaded image ID: sha256:98da9e8fcff8b41a5659332b559a42f495a8e5bee32817265cb029b77c3c8927

イメージにしたのでこれを元にコンテナを立ち上げることができるか確認します。まずは自分でネットワークを作成します。

docker network create --subnet=172.25.25.0/24 net1722525

エクスポートからインポートしたイメージで確認します。

docker run 
 --name rev 
 --net net1722525 
 -p 80:80 
 -p 443:443 
 --ip 172.25.25.11 
 -d [IMAGE ID]

エラーが発生しました。移行元ではDockerfileを使用していないのですがダメでした。

docker: Error response from daemon: No command specified.
See 'docker run –help’.

次はセーブしてロードしたイメージで確認します。エラーが発生しました。移行元と移行先ではインスタンスがARMとAMDの違いでエラーが発生したようです。

WARNING: The requested image’s platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
6f101cdc855e330fbd648388c2610790f2a164ca861da275e83882f6b9e17be1

教育

Posted by admin