71796


docker desktop でmongodb公式イメージを利用しています。  
<https://hub.docker.com/_/mongo?tab=description>

[code]

    docker run --name mongodb -v /e/Project/mongodata:/data/db -d -p 0.0.0.0:27017:27017 --net f_network mongo:4.0.3
    
[/code]

/DATA/DB はホスト側のディレクトリを指定して保存しているのですが、  
コンテナを作り直すとコレクションが消えてしまうようです。  
ユーザーとデータベース名だけは残っているようです。  
コンテナを作り直すとデータベースの作り直しになってしまうのでしょうか？


CC BY-SA 4.0
2020-11-07T07:25:48.263
71781
2020-11-08T06:00:37.533
37297
question
docker mongodb
docker desktop mongodb コンテナを作り直すとデータベースの作り直しになるのか？


以下の手順で確認してみましたが、コマンド自体は問題ないように見えます。

> コンテナを作り直すとデータベースの作り直しになってしまうのでしょうか？

これに対する回答は「いいえ」です。ホスト側のボリュームをマウントしているので永続化層はコンテナの外側にあります。

考えられる原因として推測されるのは、

  1. コンテナを再度起動するときにマウントするパスが異なっている
  2. 追加したコレクションを消す処理を行なっており、コンテナが削除したタイミングと近いためそれと勘違いした
  3. マウントしたホスト側のディレクトリが何らかの理由で削除されている

のいずれかかと思います。一度確認してみることをおすすめします。

## 確認手順

### 1\. mongodbをローカルで構築

[code]

    # Desktopに`db-sample`というディレクトリを作成
    $ cd ~/Desktop && mkdir -p db-sample && cd db-sample
    
    $ docker run --name mongodb \
                  -v $(pwd)/db:/data/db \     # 現在位置のディレクトリをマウント
                  -d \
                  -p 0.0.0.0:27017:27017 \
                  mongo:4.0.3
    
[/code]

### 2\. ディレクトリを確認

mongodbを構築すると、ローカル(`~/Desktop/db-sample`）に`db`ディレクトリが作成されていることを確認

[code]

    $ ls
    db
    
[/code]

### 3\. mongodbに接続

[mongo shell](https://docs.mongodb.com/manual/mongo/)を利用してホストから接続します

[code]

    mongo --host 127.0.0.1 --port 27017
    
[/code]

### 4\. mongodbにデータを追加

[code]

    # DBを確認
    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    
    > use sample
    
    > db.myCollection.insertMany([
       { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
       { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
       { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
       { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
       { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
    ]);
    
[/code]

### 5\. mongodbのデータを確認

[code]

    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    sample  0.000GB
    
    > use sample
    
    > db.myCollection.find({})
    { "_id" : ObjectId("5fa7858911d23499839bb28a"), "x" : 1 }
    { "_id" : ObjectId("5fa785c111d23499839bb28b"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
    { "_id" : ObjectId("5fa785c111d23499839bb28c"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
    { "_id" : ObjectId("5fa785c111d23499839bb28d"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
    { "_id" : ObjectId("5fa785c111d23499839bb28e"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
    { "_id" : ObjectId("5fa785c111d23499839bb28f"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }
    
[/code]

### 6\. mongodbのコンテナを停止・削除

[code]

    $ docker stop mongodb && docker rm mongodb
    
[/code]

### 7\. 再起動して確認

  1. 手順1 **mongodbをローカルで構築** を実行します。
  2. 手順5 **mongodbのデータを確認** を実行します

insertしたデータが存在していることが確認できます。


CC BY-SA 4.0
2020-11-08T06:00:37.533
71796
2020-11-08T06:00:37.533
7997
71781
answer