Docker | 2週間で実務レベルに到達するDocker学習:開発効率化(マウント)(Day5)

Docker Docker
スポンサーリンク

Day5の深掘り:マウントとホットリロードの“裏側”を理解する

Day5のテーマは「マウント」と「ホットリロード」。
ここを深掘りすると、Dockerを使った開発が“本番環境の再現”だけでなく“超快適な開発環境”にもなる理由がはっきり見えてきます。

マウントは単なる便利機能ではなく、
Dockerを開発で使うための“生命線”
と言っても過言ではありません。


マウントの本質:コンテナのファイルシステムを“差し替える”

コンテナの中身は本来「読み捨て」

Dockerコンテナは、基本的に「使い捨て」です。
コンテナの中でファイルを変更しても、コンテナを削除した瞬間にすべて消えます。

これは本番環境ではメリットですが、
開発環境では致命的です。

コードを変更しても消える。
コンテナを作り直すたびにコピーし直す。
これでは開発になりません。

そこで登場するのが マウント です。


マウントの正体:ホストのフォルダをコンテナに“そのまま差し込む”

コンテナの /app がホストのフォルダに置き換わる

次のコマンドを思い出してください。

docker run -v $(pwd):/app node

これは
「コンテナの /app を、ホストの現在のフォルダで置き換える」
という意味です。

つまり、コンテナの /app はもはやコンテナのものではなく、
ホストのフォルダそのものになります。

コンテナの中で /app/app.js を開くと、
それはホストの app.js を開いているのと同じです。


なぜホットリロードが成立するのか(仕組みを深掘り)

ファイル変更イベントが“そのままコンテナに届く”

ホットリロードは、
「ファイルが変更されたことを検知してアプリを再起動する」
という仕組みです。

Node.js の nodemon や Python の uvicorn –reload は、
ファイルの変更を監視しています。

マウントを使うと、
ホストで app.js を保存した瞬間、
コンテナの /app/app.js も同時に更新されます。

つまり、
ホストの変更イベントがコンテナにそのまま伝わる
という状態が作られます。

これがホットリロードの正体です。


マウントの種類を理解するとさらに強くなる

バインドマウント(今回の -v $(pwd):/app)

これは
ホストのフォルダをそのままコンテナに反映する
というタイプです。

開発ではこれを使います。

ボリュームマウント(docker volume create)

これは
Dockerが管理する永続領域をコンテナに割り当てる
というタイプです。

データベースなど、
「ホストのフォルダを直接触らせたくない」
「コンテナを消してもデータは残したい」
という場合に使います。

Day5で扱うのは前者のバインドマウントです。


マウントを使うときの“落とし穴”と対処法

コンテナ内で npm install すると壊れることがある

マウントしている状態でコンテナ内で npm install をすると、
node_modules がホスト側に作られます。

これは環境差異(Windows と Linux の違い)で壊れる原因になります。

対処法はシンプルで、
node_modules はコンテナ内だけに置く
という設計にします。

具体的には、
node_modules をマウント対象から除外する方法があります。

パフォーマンスが落ちることがある

特に Mac や Windows では、
ホストとコンテナ間のファイル同期が遅くなることがあります。

これは Docker Desktop の仕組み上避けられない部分ですが、
開発規模が大きくなると顕著になります。

対策としては、
Dockerfile で依存関係だけコンテナに閉じ込め、コードだけマウントする
という構造にします。


実務でよく使う“開発用Dockerfile”の構造

依存関係はコンテナに、コードはホストに

Node.js の例で説明すると、
次のような構造が実務ではよく使われます。

Dockerfile(依存関係だけインストール)
docker run -v $(pwd):/app(コードだけマウント)

こうすることで、
node_modules はコンテナ内に閉じ込められ、
コードだけがホストと同期されます。

これにより、
パフォーマンスと安全性が両立します。


マウントを使った開発の“理想的なワークフロー”

1. Dockerfile で依存関係をインストール

2. docker build でイメージを作成

3. docker run -v $(pwd):/app でコードを同期

4. nodemon や uvicorn –reload でホットリロード

5. コードを変更すると即反映

この流れができると、
Dockerを使っていることを忘れるほど快適になります。


Day5の深掘りまとめ

マウントは、
コンテナのファイルシステムをホストのフォルダで置き換える技術
であり、
ホットリロードはその副産物として成立します。

開発ではマウント、
本番では COPY、
という使い分けができるようになると、
Dockerを“開発と本番の両方で使いこなせるエンジニア”になります。

タイトルとURLをコピーしました