あまり明白ではないのは、「docker run」を実行するたびに新しいコンテナーを作成していることです。これにより、新しいコンテナーごとに新しいボリュームが作成されます。
したがって、データは永続化されていますが、書き込み先のコンテナーからデータを読み取っていません。
問題を説明する例
サンプル Dockerfile
FROM ubuntu
VOLUME /data
普通に建てた
$ docker build . -t myimage
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu
---> bd3d4369aebc
Step 2 : VOLUME /data
---> Running in db84d80841de
---> 7c94335543b8
これで2回実行
$ docker run -ti myimage echo hello world
$ docker run -ti myimage echo hello world
そして、ボリュームを見てください
$ docker volume ls
DRIVER VOLUME NAME
local 078820609d31f814cd5704cf419c3f579af30672411c476c4972a4aad3a3916c
local cad0604d02467a02f2148a77992b1429bb655dba8137351d392b77a25f30192b
「docker rm」コマンドには、コンテナーに関連付けられたすべてのボリュームをクリーンアップする特別な「-v」オプションがあります。
$ docker rm -v $(docker ps -qa)
データ コンテナーの使用方法
前の例で作成した同じ docker イメージを使用して、ボリュームを介してデータを永続化することを唯一の目的とするコンテナーを作成します。
$ docker create --name mydata myimage
一部のデータを「/data」ボリュームに保存する別のコンテナを起動します
$ docker run -it --rm --volumes-from mydata myimage bash
root@a1227abdc212:/# echo hello world > /data/helloworld.txt
root@a1227abdc212:/# exit
データを取得する 2 つ目のコンテナーを起動する
$ docker run -it --rm --volumes-from mydata myimage cat /data/helloworld.txt
hello world
クリーンアップ: コンテナーを削除し、「-v」オプションを指定して、そのボリュームが確実にクリーンアップされるようにします。
$ docker rm -v mydata
ノート:
- 「volumes-from」パラメータは、すべてのデータが「mydata」コンテナに関連付けられた基本ボリュームに保存されることを意味します
- コンテナーを実行するときに、「rm」オプションを使用すると、それらが自動的に削除されることが保証されます。これは、1 回限りのコンテナーに役立ちます。