クイックノート

ちょっとした発見・アイデアから知識の発掘を

Docker 上で消えゆくデータを救出する

Docker が便利なので、
何も考えずにデータベースを Docker で立ててしまいました。

過ちに気づいたのは、
「あれ、データベースのデータってどこに保存されるんだ」
と思ったところです。

データベースをコンテナ上で構築したら、
そのデータも普通はコンテナと運命を共にします。

ということは、コンテナが消えるとデータも消え。。。。

やばい、このままだと、何かの拍子にコンテナ消したら、
データ丸ごと消えてしまう!!

ということで、急いで、既に立ててしまった
Docker 上のデータの救出作戦開始です。

環境

OS : ubuntu 14.04 データベース : mongoDB

今回はデータベース mongoDB 上のデータを Docker から救いあげますが、
Docker のコンテナからホストへファイルを持ってくる方法は共通なので、
その他のデータベースでも同様の方法でデータを拾ってこれます。

1. コンテナID を確認する

まずは、データベースが動いているコンテナIDを確認しましょう。

sudo docker ps

でプロセス一覧を表示してコンテナIDを確認します。

今の場合は、mongo なので、イメージ名から、
次のように、コンテナIDを取得することもできます。

CONTAINER_ID=`sudo docker ps | grep mongo | cut -d " " -f1`

2. コンテナ内でデータベースの中身を書き出す

データベースのバックアップを作成する要領で、
データをエクスポートしましょう。

mongoDB の場合は、「mongodump」でデータを出力できます。

sudo docker exec -it [コンテナID] mongodump -o /tmp_mongo

これで、コンテナ上の「/tmp_mongo」に、
データベース内のデータが書き出されました。

3. コンテナからホストにデータを移す

後は、コンテナ上のファイルをホスト上の保存先に移せばOKです。

sudo docker cp [コンテナID]:/tmp_mongo [保存先]

先ほどデータを書き出した「/tmp_mongo」を、
そのままホスト上の好みの [保存先] にコピーします。

まとめ

本来は、データを永続化するために、
そもそも、保存先自体をホスト上に指定してからコンテナを起動するのが正解です。

Docker が便利だからと何も考えずにコンテナを立ち上げてしまうのは危険ですね。。

とはいえ、Docker はやはり便利なので、
今回のようにやらかしても、後からリカバリーが効くので助かりました。

プライバシーポリシー