第12章:マウントの基本(ホスト↔コンテナ)を体験📎
この章は「保存したら即反映✨」を手に入れる回です! コード編集は手元(ホスト)で、実行はコンテナで。なのに同じファイルを見てる状態を作ります😆📦
1) 今日できるようになること🎯✨
- **マウント(bind mount)**で、ホストのフォルダをコンテナに“直結”できる📁🔌
- ホストで編集 → コンテナ側で即反映を体感できる⚡📝
-vと--mountの違い(ハマりどころ)を知る🧠🪤 (--mountの方が明示的でおすすめ、という立場が公式ドキュメントにもあります)(Docker Documentation)
2) マウントって何?を一言で🍙
ホストのフォルダを、コンテナの中のフォルダとして“見せる”仕組みです📎 開発だと「ソースコード共有」に超よく使います。保存した瞬間、コンテナから見える内容も変わります⚡(Docker Documentation)
3) まずは“即反映”を体験しよう(超かんたん)🎉🧪
ここでは Nginx を使って「静的ページを配信」しつつ、ホストで編集したら即変わるのを見ます👀✨
3-1. フォルダとファイルを用意📁📝
任意の場所に作業用フォルダを作って、index.html を作ります。
mkdir mount-playground
cd mount-playground
printf "<h1>Hello Mount 😆📎</h1>\n<p>first version</p>\n" > index.html
3-2. コンテナを起動(ホストの今のフォルダをマウント)🚀
ポイント:
/usr/share/nginx/htmlは Nginx の公開ディレクトリです🌐 そして:ro(read-only)で安全にしとくのが気楽です🔒✨(読み取り専用オプションは公式にもあります)(Docker Documentation)
WSL ターミナル(おすすめ)🐧
docker run --rm -d --name mount-nginx -p 8080:80 \
--mount type=bind,src="$PWD",dst=/usr/share/nginx/html,readonly \
nginx:alpine
PowerShell(参考)🪟
docker run --rm -d --name mount-nginx -p 8080:80 `
--mount type=bind,src="$PWD",dst=/usr/share/nginx/html,readonly `
nginx:alpine
ブラウザでアクセス👇
http://localhost:8080
3-3. ホスト側で編集 → ブラウザ更新 → 即反映⚡📝👀
index.html をこう変えて保存します。
<h1>Hello Mount 😆📎</h1>
<p>edited! 🔥 second version</p>
ブラウザを更新すると、即反映してたら成功です🎊✨
4) “コンテナから書いたらホストにも出る”も体験しよう✍️📁
今度は read-only を外して、コンテナ側からファイルを作ってみます😎
4-1. Ubuntuコンテナを起動してマウント🧰
docker run --rm -it --name mount-ubuntu \
--mount type=bind,src="$PWD",dst=/work \
ubuntu:latest
コンテナ内で👇
cd /work
echo "written from container 😺📦" > from-container.txt
ls -la
exit
ホスト側の mount-playground フォルダに from-container.txt が増えてたらOKです✅✨
注意:bind mount は デフォルトでホストに書き込み可能です(つまり強力!)(Docker Documentation) なので「設定ファイルだけ見せたい」みたいなときは
readonly / roを付けるのが安心です🔒
5) -v と --mount の違い(初心者が踏む罠👣🪤)
どっちでも共有はできますが、挙動が違います!
-v/--volume:ホスト側のパスが無いと 勝手にディレクトリ作る(気づきにくい)(Docker Documentation)--mount:ホスト側が無いと エラーで止まる(気づきやすい)(Docker Documentation)
「間違った場所を共有してた😱」を防ぎやすいので、学習中は --mount 推しでOKです👍(Docker Documentation)
6) 超重要:マウントは“上書き表示”になる📎⚠️
コンテナ内のディレクトリに元々ファイルがあっても、そこへ bind mount すると **元の中身が“見えなくなる”**ことがあります(USBを挿したら /mnt の見え方が変わるのと同じ)🫥
「ファイル消えた!?」じゃなくて「隠れてるだけ」パターン多いです😵💫(Docker Documentation)
7) Windowsで“速く・安定”させるコツ(超ざっくり)🪟⚡
7-1. 置き場所で体感速度が変わる🚀📁
Docker Desktop+WSL2 では、プロジェクトを WSLのLinux側ファイルシステム(例:~/projects)に置くのが定番です。
公式も「WSL2を前提に、プロジェクトはWSL2側に置こう」と勧めています📌(Docker)
7-2. WSLのバージョンは新しめ推奨🆙🐧
Docker Desktop は WSLの最低バージョン要件を明記しています(古いと期待通り動かないことがある)ので、更新は大事です🔧(Docker Documentation)
7-3. “ファイル共有高速化”機能もある🏎️💨
Docker Desktop には bind mount の性能を上げるための Synchronized file shares の仕組みも用意されています(効く環境だと体感変わることあります)⚡(Docker Documentation)
8) よくある詰まりポイント&即チェック✅🪤
症状A:編集しても反映されない😵
- そもそもマウントできてる? →
docker inspectで確認👀
docker inspect mount-nginx --format '{{json .Mounts}}'
症状B:--mount が「パスが無い」って怒る😡
--mountは ホスト側のパスが存在しないとエラー(正常な挙動)です🧠(Docker Documentation) → 先にフォルダ作る or-vの“自動作成”との差に注意!
症状C:権限で書けない/読めない🔒😣
- まずは「read-only 付けてないか?」チェック
- 次に「どのユーザーで動いてるか?」確認(後の章で深掘りするやつです💪)
9) AI(Copilot/Codex等)に頼むと捗る聞き方🤖✨
そのままコピペで使えるプロンプト例📌
- 「このコマンドの
--mountを、PowerShell/WSLそれぞれで確実に動く形に直して」🪟🐧 - 「bind mount が反映されない。考えられる原因トップ5と、確認コマンドを順番に出して」🔍🧰
- 「
docker inspectの Mounts の見方を、初心者向けに1行ずつ説明して」📖🙂
10) ミニ課題🎒🔥(5分)
index.htmlを 3回書き換えて、即反映を確認する🔁⚡readonlyを外して、コンテナ側からtouch container-made.txtを作ってホストに出るのを確認✍️📁--mountのsrcをわざと間違えて、エラーになるのを確認(罠耐性アップ💪)(Docker Documentation)
次章予告👀✨
次は **Windowsでハマりがちな点(改行/パス/権限)**を、わざと事故らせて回避パターンを作ります🪤😆