ボリュームマウント
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
を作成します。
- この新しいディレクトリ内に簡単な HTML ファイル
index.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
ホストディレクトリをコンテナにマウントするこの方法は、バインドマウントと呼ばれます。ホストとコンテナ間でファイルを共有する簡単な方法です。忘れないでください。
- ホストディレクトリパスは絶対パスでなければなりません。
- ホストディレクトリが存在しない場合、Docker は自動的に作成します。
- このディレクトリ内のファイルに対して行われた変更(ホストまたはコンテナのどちらかで)は、ホストとコンテナの両方に即座に表示されます。
- パーミッションに注意してください。コンテナはデフォルトで root として実行されるため、ホストユーザが変更できないファイルが作成される可能性があります。
この方法を使うことで、「not a directory」エラーを回避できます。なぜなら、ディレクトリをマウントしているからです。このアプローチにより、コンテナを再作成することなく、ファイルを追加、削除、または変更する柔軟性が増えます。