‫わかりました｡ ボリュームは､ 一見シンプルに見えますが､ 実はいろいろあるんです｡
‫ボリュームを気にする必要があることをコンテナに伝えるには､ まずDockerfileを使用します｡
‫そのいくつかをチェックしてきましょう｡
‫よくやることをやるだけです｡
‫MySQLを検索してみる｡
‫Dockerfilesの正しい使い方については､ 公式リポジトリにきちんとしたデフォルトとベストプラクティスが組み込まれているため､
‫この方法で多くを学びました｡
‫MySQL 1に移動したら､ ここで最新のDockerfileをクリックするだけです｡ データベースだから､ きっとVolumeコマンドが入ってるんでしょうね｡
‫これでよしとしよう｡
‫これは､ MySQLデータベースのデフォルトの場所です｡ このイメージは､ Dockerに対して､ このイメージから新しいコンテナを起動すると､
‫実際に新しいボリュームロケーションを作成し､ コンテナ内のこのディレクトリに割り当てるようにプログラムされています｡
‫つまり､
‫コンテナ内に置いたファイルは､ ボリュームを手動で削除するまで､ コンテナよりも長持ちするのです｡
‫そして､ ここで指摘しておかなければならないのは､ ボリュームは手動で削除する必要があるということです｡
‫容器を外しただけではきれいにならない｡
‫余計なお世話なんです｡ ボリュームコマンドのポイントは､ このデータが特に重要で､
‫少なくともコンテナそのものよりもずっと重要であることを示すことですから､ これは単なる保険です｡
‫MySQLでdocker pullを行い､ MySQLでdocker
‫image inspectを行うと､ Dockerfileが表示されません｡ Dockerファイルはイメージのメタデータの一部ではないので､
‫この設定領域で､ そのボリュームを指定していることに気がつくでしょう｡
‫ビルド時にDockerfileから出力されたコンフィグが､ そのパスにボリュームを割り当てていることは常に確認できます｡
‫そこからコンテナを動かしてみましょう｡
‫そこで､ docker container run -d --name mysqlを実行します｡
‫MySQLのほうは､ ちょっと特殊なんです｡
‫動作させる前に環境変数を必要とするようになりました｡
‫MYSQL_ALLOW_EMPTY_PASSWORDです｡
‫OKです｡
‫表示されているのは､ MySQLの実行です｡ docker container inspect
‫mysqlを実行すると､ configでボリュームがあることを教えてくれるのと同じことが表示されるはずです｡
‫これです｡
‫また､ マウントの下にあるこの上にも見ることができます｡ これは､ 実行中のコンテナがホスト上の独自の場所を取得してデータを保存し､
‫バックグラウンドでコンテナ内のその場所にマッピングまたはマウントして､ コンテナ内の場所が実際には /var/lib/mysql
‫に書き込んでいると考えるようにしたものです｡
‫この場合､ データは実際にホスト上のその場所に住んでいることがわかる｡ では､ docker volume ls を実行してみましょう｡
‫これでボリュームは1つになりました｡
‫さて､
‫これがユニークなIDを持っていることに気づきましたが､ これが何に使われているのかはわかりませんよね？
‫では､ それについてインスペクションをしてみましょう｡
‫全部打ち込む必要はありません｡
‫最初の数文字を入力してTabキーを押せば完了です｡ ボリューム自体についても､ それと同様の情報を得ることができます｡
‫Linuxマシンで実際にやっているのであれば､ ハードディスクのその場所に移動して､ データを見ることができます｡
‫そこには､ 実際にデータベースが存在することになります｡
‫MacやWindowsをお使いの方は､ Windows版DockerとMac版Dockerは､ 実はバックグラウンドでLinux
‫VMを作成するという､ 私たちからは見えないところでちょっとした作業をしていることを思い出してください｡
‫つまり､ このデータは技術的にはそのLinux VMの中にあるわけです｡ WindowsやMacのマシンでそのパスにアクセスしても､
‫データを見ることができないのです｡ 実はそのVMの中に入っているんです｡
‫この制限をどのように回避するかは､ 実装されたボリュームを見ながら､ 少しずつ考えていきたいと思います｡
‫これを見ると､ 何が入っているのか､ このボリュームは何に割り当てられているのか､ あまり使い勝手が良くないことに気がつきますね｡
‫コンテナの視点からは､ それがどのボリュームを使用しているかはわかりますが､ ボリュームの視点からは､ それが何に接続されているかは見えません｡
‫そうだろ？
‫上矢印を押して､ 例えば､ mysql2を作成するとします｡
‫これで､ バックグラウンドで動作する別のMySQLサーバーが作成されました｡
‫もう一回docker volume lsをすると､ 2つ出てきますね｡
‫問題が見えてきましたね？
‫簡単に見分ける方法はないんです｡
‫例えば､ docker container stop mysql と docker a container stop mysql2 を実行すると､ 以下のようになります｡
‫docker container lsを実行すると､ 実行中のコンテナは表示されません｡ ls -aを実行すると､ それらすべてを見ることができます｡
‫そして､ 止まっていることに気づく｡ そして､
‫docker volume lsを実行すると､ まだ2つのボリュームがあることに気づきます｡
‫docker container rm mysql と mysql2 を実行すると､ 1つのコマンドで両方を実行できるため､
‫両方のコンテナを削除することができます｡ 今､ docker volume lsを実行すると､ 私のボリュームはまだそこにあります｡
‫私のデータはまだ安全です｡
‫そこで､ ひとつの問題を解決しました｡
‫データベースは実行ファイルより長持ちする｡
‫どうすればもう少し使いやすくなるのか？
‫そこで登場したのが､ Docker runコマンドで指定できる名前付きボリュームです｡
‫ドッカーコンテナの実行まで上矢印を何回か押せば､ どれをもう一度実行してもいいんだ｡
‫今回は､ 実際に-vコマンドを投入してみます｡ vを指定すると､ これから実行するコンテナ用に作成する新しいボリュームを指定するか､
‫他の2つのオプションを指定することができます｡
‫ここではその1つとして､ 名前付きボリュームを作成する｡
‫もし､ -vして､ var lib mysqlとすれば､ Dockerfileのvolumeコマンドがしたことと同じことができます｡
‫ここでは､ その必要はないんです｡ しかし､ 私たちにできることは､ その前にコロンで名前を付けることができることです｡
‫それを「ネームドボリューム」といいます｡ 「これを実行し､
‫docker volume ls を実行すると､ 新しいコンテナが新しいボリュームを使用しており､ フレンドリーな名前を使っていることがわかります｡
‫そのmysqlにdocker volume inspectを行うと､ こちらの方が使いやすいことがわかると思います｡
‫またコンテナを削除して､ まだ動いているので-fを付けて､
‫もう一回実行したら｡ そして今回は､ 別の名前をつけることにします｡
‫そして､
‫もう一回docker volume lsを実行すると､ 新しいボリュームが作成されていないように見えることがわかります｡ 同じボリュームを使い続けています｡
‫mysql3のdocker container inspectをやってみましょう｡ そして､ ここに表示されるのは､ はい､ これは設定されたものですが､
‫私たちは何を実行しているのでしょうか？
‫ここが私たちのマウントです｡
‫名前だけでなく､ 実際にソースの場所も少し友好的に変更されたことがここでわかります｡
‫私の場合は､ 何日も何週間も特定のデータベースを特定のコンテナで運用し､ 何度も繰り返し使用する必要があり､
‫空のデータベースサーバーが必要ない場合､ この方法でコンテナを作成し､
‫プロジェクト用に名前を付けて､ そのボリュームが何のためにあり､ 定着する必要があるのかが分かるようにします｡
‫ここで最後にもうひとつ｡
‫なぜ､ docker volume createをするのか？
‫実行時にDockerコンテナのrunコマンドから作成でき､ Dockerfileに指定して作成できるのであれば､ 先に作成しておきたいケースは限られていますね｡
‫そして､
‫実はhelpコマンドを使えば､ すぐにわかるんです｡
‫なぜなら､ 実際に別のドライバを指定できるのはここだけだからです｡
‫後でお話しするプラグインのこと､ 覚えていますか？
‫次に､ -oを使用したいドライバオプションを指定します｡
‫それから､ ラベルを貼る場合ですが､ これも後ほど制作編で説明します｡
‫特殊なケースでは､ 先にDocker Volumeを作成する必要がある場合もありますが､ 通常はローカルでの開発目的であれば､
‫Dockerfileや実行コマンドで指定するだけでよいでしょう｡