導入
ボリュームと似て非なるものに、バインドマウント があります。こちらは「ホスト(自分のPC)の特定のフォルダを、コンテナの中に直接見せる」やり方です。開発中に「コードを編集したら即コンテナに反映」させたいときの定番です。
説明
書き方は -v で同じですが、左側がパス(/ や ./ で始まる)か、名前か で意味が変わります。
flowchart TD
A["-v dbdata:/data<br/>左が『名前』"] --> B["名前付きボリューム<br/>Dockerが管理する保管庫"]
C["-v ./site:/usr/share/nginx/html<br/>左が『パス』"] --> D["バインドマウント<br/>ホストの実フォルダを直結"]
たとえば、いま編集している Web サイトのフォルダ ./site を、nginx が配信する /usr/share/nginx/html に直結します。
docker run -d -v ./site:/usr/share/nginx/html -p 8080:80 --name web nginx
こうすると、ホスト側で ./site/index.html を書き換えた瞬間、コンテナ内の配信内容も変わります(コンテナを作り直さなくていい)。開発のイテレーションが一気に速くなります。
2つの使い分けを整理しておきましょう。
| 名前付きボリューム | バインドマウント | |
|---|---|---|
| 書き方 | -v dbdata:/data | -v ./site:/app |
| 実体の場所 | Docker が管理(隠れた場所) | ホストの指定フォルダそのもの |
| 得意な用途 | 本番のデータ(DB・アップロード) | 開発(ソースコードの即時反映) |
| 中身の見え方 | docker volume で管理 | ふつうのフォルダとして直接見える |
docker inspect web で確認すると、"Type" が volume ではなく bind になっているのが分かります。
docker inspect web
どちらを使うか迷ったら:消えたら困る本番データは名前付きボリューム、手元で編集して即反映したい開発中のコードはバインドマウント、と覚えておけば大きく外しません。
やってみよう
docker run -d -v ./site:/usr/share/nginx/html -p 8080:80 --name web nginxを実行しましょう。docker inspect webの"Mounts"を見て、"Type": "bind"になっていることを確認してください(レッスン20のvolumeとの違いに注目)。