Day5:開発効率化(マウントとホットリロードの本質)
Day5では、Dockerを「開発で本当に使えるレベル」に引き上げます。
今日のテーマは マウント(Volume) と ホットリロード。
これを理解すると、Dockerを使いながらも、普段どおりのスピードで開発できるようになります。
結論から言うと、
「ホストのコードをコンテナにリアルタイムで同期する」
これが Day5 の核心です。
マウントとは何か(初心者が最初に理解すべき本質)
コンテナの中に“ホストのフォルダをそのまま映し込む”仕組み
コンテナは本来、独立した世界です。
そのため、コンテナの中にあるファイルを変更しても、ホスト側には反映されません。
逆に、ホスト側のコードを変更しても、コンテナの中には届きません。
そこで登場するのが マウント(Volume) です。
マウントを使うと、
ホストのフォルダをコンテナのフォルダとして使えるようになる
という魔法のような状態が作れます。
docker run -v $(pwd):/app node の意味を深く理解する
コマンド全体の役割
docker run -v $(pwd):/app node
これは
「ホストの現在のフォルダを、コンテナの /app にマウントして Node.js を起動する」
という意味です。
ここから、各部分を丁寧に分解します。
$(pwd):ホスト側の現在のフォルダ
Mac/Linux の場合の書き方
$(pwd) は
「今いるディレクトリの絶対パス」
を表します。
例えば、
/home/user/myapp
にいるなら、$(pwd) はそのままそのパスになります。
Windows の場合は書き方が少し違いますが、概念は同じです。
/app:コンテナ側のフォルダ
コンテナの中に作られる作業ディレクトリ
コンテナの中には /app というフォルダが作られ、
そこにホスト側のフォルダが丸ごと映し込まれます。
つまり、
ホストの myapp フォルダ
=
コンテナの /app フォルダ
という関係が成立します。
マウントがもたらす最大のメリット:ホットリロード
コードを変更した瞬間にコンテナ側にも反映される
マウントを使うと、
ホスト側で app.js を保存した瞬間、
コンテナの /app/app.js も同時に更新されます。
これにより、
「コードを変更 → コンテナ内のアプリが即反映」
という開発体験が実現します。
Dockerを使っているのに、
まるでローカルで直接開発しているかのようなスピード感になります。
ホットリロードを実現するための実践例(Node.js)
nodemon を使うと最強になる
Node.js の場合、
ファイル変更を検知して自動で再起動してくれる nodemon を使うと、
ホットリロードが完全に機能します。
コンテナ内で nodemon を使う例は次のようになります。
docker run -v $(pwd):/app -w /app node npx nodemon app.js
ここで -w /app は
「コンテナの作業ディレクトリを /app にする」
という意味です。
これで、
ホストで app.js を保存するたびに、
コンテナ内のアプリが自動で再起動します。
Python の場合のホットリロード
Python なら Flask や FastAPI の開発サーバが自動リロード機能を持っています。
例えば FastAPI なら uvicorn の –reload オプションを使います。
docker run -v $(pwd):/app -w /app python uvicorn app:app --reload --host 0.0.0.0 --port 8000
これで Python でもホットリロードが実現します。
マウントを使うときの注意点(実務レベルの視点)
コンテナの中でファイルを変更してはいけない
マウントしている場合、
コンテナ側でファイルを編集すると、
ホスト側のファイルも書き換わります。
これは意図しない破壊につながるため、
実務では コンテナ内で編集しない のが鉄則です。
マウントと COPY の違いを理解する
COPY は「イメージに取り込む」
マウントは「ホストのファイルをそのまま使う」
Dockerfile の COPY は、
イメージを作るときにファイルを取り込みます。
一方、マウントは、
イメージには取り込まず、ホストのファイルをリアルタイムで参照する
という違いがあります。
開発中はマウント、
本番環境では COPY、
という使い分けが一般的です。
Day5のゴール:「コード変更→即反映」を実現できる
ここまで理解できれば、
Dockerを使った開発でも、
ローカル開発と同じスピードで作業できます。
Dockerは「本番環境のための技術」と思われがちですが、
マウントを使うことで 開発環境としても非常に強力 になります。
次のステップ
Day6では、
Docker Compose を使って複数コンテナを同時に管理する方法
に進むことができます。
データベースとアプリを同時に立ち上げる、
ネットワークを自動で構築する、
環境変数をまとめて管理する、
といった実務的な内容に踏み込みます。
