Dockerは、バインドマウントやボリュームなど、コンテナーのファイルシステムとコンテナーを実行しているホストオペレーティングシステムをブリッジするためのツールを提供します。これらは、開発環境と本番環境の両方で非常に役立ちます。
ホストからマウントする理由
通常、Dockerでは、イメージをホストシステムとは独立して実行する必要があります。たとえば、アプリのコードや構成ファイルを更新する場合は、コンテナの新しいバージョンを作成して再デプロイすることをお勧めします。これにより、画像が実行されているハードウェアを気にすることなく、画像をすばやく拡大縮小して移動できます。
ただし、開発環境では、ディレクトリを直接マウントして構成またはコードのホットリロードを有効にできると非常に便利です。たとえば、コンテナにドラッグアンドドロップするだけのJSファイルまたはPHPプラグインで作業している場合があります。または、NGINX構成ディレクトリ全体をマウントしてWebサイトで機能させることもできます。ユースケースが何であれ、ファイルのマウントは悪い解決策ではありません。
コンテナ内のファイルに依存するホストサービスがある場合は、本番環境でも役立ちます。たとえば、コンテナのログファイルがホストからアクセス可能なディレクトリにある場合に優先するログの取り込みと集約サービスがある場合があります。問題に対する純粋なDocker内ソリューションがいくつかある可能性がありますが、ボリュームをマウントする方が簡単な場合もあります。
macOSの互換性
注:マウントはDocker APIを介して処理されるため、ホストOSに関係なく機能します。ただし、macOSには追加の保護機能があり、いくつかのホストディレクトリの外部へのマウントは、実行時に「マウントが拒否されました」と失敗する可能性があります。これには/Users
が含まれます 、ほとんどの操作をカバーしていますが、必要に応じて、Docker設定の[設定]>[リソース]>[ファイル共有]で、ターゲットディレクトリをリストに追加して修正できます。
ホストディレクトリのマウント
バインドマウントの作成は非常に簡単です。 --mount type=bind
で追加します 起動時にフラグを立て、マウント先のソースディレクトリとターゲットディレクトリを指定します。
docker run -d -it --name container --mount type=bind,source=/nginxconfig,target=/etc/nginx nginx:latest
バインドマウントは最も単純ですが、Dockerはこれらの種類のマウントをもう少しうまく管理するためのボリュームAPIを提供します。保存されたデータはDockerによって管理され、ボリュームディレクトリはDockerのディレクトリに自動的に作成されます。既存のディレクトリを念頭に置いている場合、これは望ましくない場合がありますが、ホストOSのファイル構造に依存しないため、この方法の方が適しています。
docker volume create nginx-config docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
DockerComposeを使用してボリュームを定義することもできます。
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-config:/etc/nginx/ volumes: nginx-config:
これらは、Linuxでアクセス可能な標準形式で保存されます:
/var/lib/docker/volumes/volumeID/_data
ただし、macOSでは、ボリュームを表示できるようにするには、Docker仮想マシンに接続する必要があります。
関連: Dockerボリュームとは何ですか、またそれらをどのように使用しますか?
単一ファイルのマウント
ホストに保存されている多くの構成/コードファイルを編集する場合は、ディレクトリ全体のマウントが適切に機能します。ただし、他のファイルに触れることなく、編集するために1つのファイルをマウントしたい場合もあります。
これを行うには、バインドマウントを使用してコンテナを実行できます。バインドマウントは、パスを指定すると個々のファイルをサポートします。
docker run -it --mount type=bind,source=/path/file.cfg,target=/etc/example/file.cfg nginx sh
この方法でマウントするファイルがたくさんある場合は、それらをすべて同じホストディレクトリに配置し、そのディレクトリをコンテナ内の別の場所にマウントできます。次に、コンテナ内のシンボリックリンクを使用して、マウントされたディレクトリ内のファイルを適切な場所にリンクできます。