DockerのVolumeに関して -v --rm -d ゴミが残る問題 コンテナが起動しない
最近Dockerを使い始めたのですが、一つ躓いたのでメモ。
Dockerのコンテナを立上げる時、コンテナとは別に実は裏でボリュームと言う物も立ち上がっています。
(立上げる時に使うイメージによって違うかもしれませんがMysqlを立上げたら勝手に立ち上がるのは確認済みです)
イメージ的にはこんな感じです:
公式ドキュメントより
簡単に言うとVolumeとはDockerコンテナのストレージです。
ローカルディレクトリにマウントしたり、データを読み込んだりするとここを経由しています。
最初は「へぇーそうなんだ」くらいしか思っていませんでしたが、
先週突然コンテナが起動できなくなり、エラーログを見てみたらメモリが足りないと怒られました。
おかしい、メモリもストレージも十分なのに何が起こった
さらに調べてみるとvolumeが立ち上がらないやら
とりあえず今docker内にある物を確認:
今立ち上がっているコンテナ:
docker ps
何もない
今入っているイメージ:
docker image ls
余計な物はなく特に問題なさそう
今立ち上がっているvolume:
docker volume ls
うわぁ死ぬほどでた
絶対これが原因だろおい
でもなんでこんなにゴミ溜まってんだろ
公式ドキュメントを調べてみたらこんなのがあった:
データ・ボリューム
データ・ボリューム (data volume) とは、1つまたは複数のコンテナ内で、特別に設計されたディレクトリであり、 ユニオン・ファイルシステム (Union File System) をバイパス(迂回)するものです。データ・ボリュームは、データの保持や共有のために、複数の便利な機能を提供します。
- ボリュームはコンテナ作成時に初期化されます。コンテナのベース・イメージ上で、特定のマウント・ポイント上のデータが指定されている場合、初期化されたボリューム上に既存のデータをコピーします。
- データ・ボリュームはコンテナ間で共有・再利用できます。
- データ・ボリュームに対する変更を直接行えます。
- イメージを更新しても、データ・ボリューム上には影響ありません。
- コンテナ自身を削除しても、データ・ボリュームは残り続けます。
- データ・ボリュームは、データ保持のために設計されており、コンテナのライフサイクルとは独立しています。そのため、コンテナの削除時、Docker は 決して 自動的にボリュームを消さないだけでなく、コンテナから参照されなくなっても”後片付け”をせず、ボリュームはそのままです。
公式ドキュメントから
コンテナでデータを管理する — Docker-docs-ja 1.9.0b ドキュメント
おいw
勝手に立ち上がってしかもライフサイクルは独立してるとかw
でもまぁ納得。
まとめてみると:
私は普段
docker pull ** docker run ** docker stop ** docker rm ** docker rmi **
こんな感じでdockerを使っているのですが
実はゴミを消しきれていなかったと!
実際は裏で
docker volume create my-vol
って感じな物が起動時に動いており、
コンテナやイメージを削除しても消えないと言う事です。
本来の目的としては、Dockerのデータを永続化する為に作られる物で、
これを使うとコンテナ間のデータのやりとりが非常に楽になるに加え、
コンテナが万一止まったとしてもデータの保存が出来ると言う目的があります。
素晴らしい仕組みだとは思うのだがdockerをボコボコ立ち上げて、
テスト用に使っている今の私の使い方ではゴミが溜まるだけでした。
対処方:
起動する時、runに--rm オプションをつける
以下公式より:
このコマンドはコンテナと、コンテナに関連づけられた全ボリュームを削除します。ただし、ボリュームに名前を指定していた場合は、このコマンドでは削除されません。
と言う事で、使い捨てのコンテナには最適なオプションです。
volumeだけではなく、コンテナもストップした時に削除してくれます。
しかし欠点として、
-d オプションと同時使用ができない
なのでthriftをdocker内で動かそうとかなら良いのだが、
dockerを裏で立ち上げてテストが終わるまで立上げる等の用途では-dオプションが必要とされるので--rmをつけることはできない。
もう一つの対処法:
削除する時、rmに-v オプションをつける
公式では:
-v, --volumes コンテナと関連づけられたボリュームを削除
と紹介されている。
-
- rmとの違いは、起動時ではなく終了じにつけるオプションである事と、起動時に-dコマンドを付けれる所です。
とりあえず解決しました。