ボリュームマウント
docker run の -v パラメータを使用すると、ボリュームをマウントしてホストとコンテナ間でデータを共有できます。これはデータの永続化や、コンテナへの設定ファイルの提供に非常に便利です。
まず、ホスト側に簡単なディレクトリ構造を作成しましょう。
mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html
これらのコマンドは以下の操作を行います。
- ホームディレクトリの
project フォルダ内に新しいディレクトリ nginx-data を作成します。
- この新しいディレクトリ内に
index.html という名前のシンプルな HTML ファイルを作成します。
次に、このディレクトリをマウントして Nginx コンテナを実行します。
docker run -d --name nginx-volume -p 8081:80 -v ~/project/nginx-data:/usr/share/nginx/html nginx
このコマンドを分解して説明します。
docker run: 新しいコンテナを実行するコマンド。
-d: デタッチモード(バックグラウンド)で実行。
--name nginx-volume: コンテナに "nginx-volume" という名前を割り当て。
-p 8081:80: ホストのポート 8081 をコンテナのポート 80 にマッピング。
-v ~/project/nginx-data:/usr/share/nginx/html: ホストの nginx-data ディレクトリをコンテナの /usr/share/nginx/html ディレクトリにマウントします。ここは Nginx がコンテンツを配信するために参照する場所です。
nginx: 使用するイメージ名。
では、カスタムページが配信されているか確認しましょう。
curl http://localhost:8081
作成した HTML ファイルの内容である "Hello from mounted volume!" が表示されるはずです。
カスタムコンテンツが表示されない場合は、以下を確認してください。
- ホストシステム上に
~/project/nginx-data/index.html ファイルが存在するか。
- コンテナが実行中か:
docker ps | grep nginx-volume
- エラーがないか Nginx のログを確認する:
docker logs nginx-volume
ホストのディレクトリをコンテナにマウントするこの方法は「バインドマウント(bind mount)」と呼ばれます。ホストとコンテナ間でファイルを共有する最も直接的な方法です。以下の重要なポイントを覚えておいてください。
- ホストのディレクトリパスは絶対パスである必要があります。
- ホストのディレクトリが存在しない場合、Docker は自動的にそれを作成します。
- このディレクトリ内のファイルへの変更(ホスト側、コンテナ側どちらからでも)は、即座に双方に反映されます。
- 権限に注意してください。コンテナはデフォルトで root ユーザーとして実行されるため、ホストユーザーが変更できないファイルを作成してしまう可能性があります。
この方法でディレクトリごとマウントすることで、単一ファイルの不整合によるエラーを避け、ファイルの追加・削除・変更をコンテナの再作成なしに柔軟に行うことができます。