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

Docker Docker
スポンサーリンク

Day5の超深掘り:マウントのセキュリティ、Docker Desktopの内部構造、パフォーマンスチューニング

ここからは “Dockerを本当に理解しているエンジニア” だけが語れる領域に入ります。
マウントのセキュリティ、Docker Desktop の内部構造、パフォーマンス問題は、実務で必ず直面するテーマです。

初心者向けに噛み砕きつつ、プロ視点で本質まで踏み込みます。


マウントのセキュリティ:便利さの裏にある“危険性”

ホストのフォルダをコンテナに渡すということの意味

マウントは
「ホストのフォルダをコンテナに丸ごと渡す」
という行為です。

これは便利ですが、同時に次のようなリスクを生みます。

コンテナ内の操作がホストに影響する

コンテナ内で
rm -rf /app
を実行すると、ホストのコードが消えます。

コンテナは隔離されているように見えて、
マウントされた領域だけは“隔離されていない”のです。

悪意あるコンテナにマウントすると危険

もし信頼できないイメージに対して
-v $(pwd):/app
を実行すると、コンテナ内のスクリプトがホストのファイルを削除したり、書き換えたりできます。

つまり、
マウントはコンテナに“ホストの鍵”を渡す行為
です。

実務での対策

1. 信頼できるイメージにしかマウントしない

公式イメージ、社内で管理されたイメージのみ。

2. マウントする範囲を最小限にする

必要なフォルダだけをマウントする。

3. 読み取り専用マウントを使う

-v $(pwd):/app:ro
のように :ro を付けると、コンテナから書き込みできなくなります。


Docker Desktop の内部構造:なぜマウントが遅くなるのか

Mac と Windows は Linux コンテナを“直接”動かせない

Docker は Linux の機能(cgroups、namespaces)を使って動きます。
しかし Mac と Windows は Linux ではありません。

そのため Docker Desktop は内部で
軽量なLinux仮想マシン(VM)
を動かしています。

構造はこうです。

ホスト(Mac/Windows)
→ Docker Desktop
→ Linux VM
→ コンテナ

マウントは VM をまたぐため遅くなる

ホストのフォルダをコンテナにマウントするとき、
実際には次のような経路を通ります。

ホストのファイルシステム
→ Docker Desktop
→ Linux VM のファイルシステム
→ コンテナのファイルシステム

この“多段構造”が、
マウントのパフォーマンス低下の原因
です。

特に Node.js のように大量の小さなファイルを扱う場合、
パフォーマンスが顕著に落ちます。


パフォーマンスチューニング:実務で使われる最適解

コードだけマウントし、依存関係はコンテナに閉じ込める

Node.js の例で説明します。

悪い例

node_modules を含むプロジェクト全体をマウントする
→ ファイル数が多く、マウントが遅くなる
→ ホットリロードも遅くなる

良い例

node_modules はコンテナ内に置く
コードだけマウントする
→ ファイル数が激減し高速化
→ ホットリロードも安定

Dockerfile の構造を工夫する

COPY package*.json .
RUN npm install
COPY . .

この順番にすることで、
依存関係はイメージに閉じ込められ、
コードだけがマウントされます。

polling モードを使う

Mac ではファイル変更イベントが届かないことがあるため、
nodemon や uvicorn の polling モードを使うと安定します。

Node.js
npx nodemon --legacy-watch app.js

Python
uvicorn app:app --reload --reload-dir /app

Docker Desktop の設定を調整する

Docker Desktop には
「ファイル共有のパフォーマンス最適化」
の設定があります。

特に
gRPC FUSE
VirtioFS
などのファイル共有方式を切り替えると改善することがあります。


マウントの“プロレベル運用”の考え方

開発環境

コードだけマウント
依存関係はコンテナ内
ホットリロードを有効化
コンテナ内で編集しない
信頼できるイメージのみ使用

本番環境

マウントは使わない
COPY でイメージに取り込む
node_modules や依存関係はイメージ内に固定
読み取り専用ファイルシステムを使うこともある


Day5の超深掘りまとめ

マウントは便利だが、
セキュリティ・パフォーマンス・構造の理解が必須 です。

マウントは同期ではなく共有
コンテナ内の操作はホストに影響する
Docker Desktop は内部で VM を使っている
そのためマウントは遅くなる
依存関係はコンテナに閉じ込める
コードだけマウントする
ホットリロードはファイルイベントの仕組みで動く
polling モードで安定化できる
本番ではマウントを使わない

ここまで理解できれば、
あなたは Docker を“開発環境として使いこなせるエンジニア” の領域に入っています。

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