編集済み 2 数か月前 によって ExtremeHow 編集チーム
ドッカーデスクトップフォルダーファイル共有ホストコンテナ設定デブオプスソフトウェア開発クラウドコンピューティング仮想化
翻訳が更新されました 2 数か月前
Dockerは、コンテナ内でアプリケーションを開発およびデプロイするための強力なツールです。コンテナは隔離された環境であり、同じマシン上の他のプロセスからの干渉なしにアプリケーションを実行できます。Dockerを使用する際には、ホストマシンとDockerコンテナ間でファイルまたはフォルダを共有する必要がある状況に直面することがあります。このガイドでは、ホストマシンとDockerコンテナ間でフォルダを共有するプロセスを詳細かつ包括的に説明します。基本的な概念をカバーし、例を示し、潜在的な課題についても考察します。
フォルダを共有する手順に入る前に、Dockerがデータ永続性をどのように処理するかを理解することが重要です。Dockerコンテナは短命であり、シャットダウンすると保存されているデータが失われる可能性があります。Dockerはデータを管理および永続化するためのさまざまなメカニズムを提供しており、その主要な方法の1つがボリュームです。Dockerボリュームはコンテナがアクセスできる永続的なデータストレージであり、コンテナのライフサイクルの外に存在します。
Dockerはボリュームを独立して管理するため、それらは特定のコンテナから分離されています。これにより、コンテナを削除してもボリューム内のデータは無傷のままであり、別のコンテナにアタッチできるため、データの耐久性に大きく貢献します。ボリュームは、ホストとDockerコンテナ間でフォルダを共有するのに理想的です。コンテナからの独立性と明示的な制御が可能だからです。
Dockerは異なる用途に対してさまざまなタイプのボリュームをサポートしています:
ホストとDockerコンテナ間でフォルダを共有する最も簡単な方法は、バインドマウントを使用することです。以下の手順に従って、例を見てみましょう:
Dockerと共有したいディレクトリをホストシステム上に作成します。たとえば、/Users/username/shared
というディレクトリを作成できます。
次に、バインドマウントを含めるようにDocker runコマンドを更新します。パスのマッピング後に-v
または--volume
フラグを使用します。たとえば、/Users/username/shared
をコンテナ内の/shared
にマウントするには、コマンドは次のようになります:
docker run -v /Users/username/shared:/shared my-image
この例では、my-image
は実行するDockerイメージを指します。マウントにより、コンテナ内の/shared
で行われたすべての変更がホストの/Users/username/shared
フォルダに反映されます。
バインドマウントを使用してコンテナが実行されている場合、コンテナ内の/shared
で変更されたファイルはホストの/Users/username/shared
ディレクトリに直接影響を与えます。そしてその逆も可能です。
Nginxウェブサーバを使用して、ホストとDockerコンテナ間でファイルを共有する実用的な例を示します。ホストマシン上のディレクトリにあるHTMLファイルを提供したい場合は次のようにします:
website
という名前のディレクトリを作成します。website
ディレクトリ内にコンテンツを含むindex.html
ファイルを追加します。次のコマンドを使用して、website
ディレクトリを/usr/share/nginx/html
ディレクトリにバインドマウントします:
docker run --name my-nginx -v "$PWD"/website:/usr/share/nginx/html:ro -d nginx
:ro
オプションは、コンテナ内でバインドマウントを読み取り専用にします。
ウェブブラウザでhttp://localhost
を訪れて、ホストの共有ディレクトリからNginxが提供するindex.html
ファイルを表示します。
バインドマウントはホストファイルシステム上のパスに直接関連していますが、Dockerボリュームはより抽象的でDockerによって管理されます。Dockerボリュームの作成と使用方法を学びましょう:
以下のようにdocker volume create
コマンドを使用して新しいボリュームを作成します:
docker volume create my-volume
このコマンドはmy-volume
という名前のボリュームを作成し、Dockerが管理します。
作成したボリュームをコンテナにアタッチするには、次のコマンドを使用します:
docker run -v my-volume:/app/data my-image
この例では、my-volume
をコンテナの/app/data
にマウントします。/app/data
に書き込まれたデータは、コンテナが停止または削除されてもmy-volume
に残ります。
コンテナの再起動に渡ってデータベースを保存したい状況を考えてみましょう。データベースコンテナのデータディレクトリをマウントするためにボリュームを使用できます:
docker volume create db-data
docker run -d --name my-database -v db-data:/var/lib/mysql mysql:5.7
この場合、/var/lib/mysql
ディレクトリ内のデータ変更はdb-data
ボリュームに保存されます。
my-database
コンテナを停止して削除しても、db-data
ボリュームはデータを保持し、別のインスタンスにアタッチする準備ができています。
バイン드マウントの設定は簡単にできますが、問題を引き起こす可能性もあります。一般的な問題とその解決策をいくつか挙げます:
コンテナがバインドマウントされたディレクトリにアクセスするために必要な権限を持っていることを確認することが重要です。さもないと、Permission Denied
エラーが発生することがあります。
ホストパスとコンテナパスを-v
パラメータで指定した際に、正しいことを確認するために再確認してください。
Dockerデーモンはホストユーザーとは異なるユーザーとして実行される可能性があり、アクセス権に影響を与えるかもしれません。Dockerを昇格した権限で実行するか、必要に応じてユーザー権限を調整してみてください。
ホストとDockerコンテナ間のフォルダ共有は、開発、データ永続性、およびコラボレーションを促進する基本的な機能です。使用ケースに応じて、どのタイプのマウント(バインドマウントまたはボリューム)が適切かを判断することが重要です。バインドマウントは直接的なパス制御を提供し、Dockerボリュームはポータブルで長期的なデータ永続性のために管理しやすいです。
検討すべきベストプラクティスをいくつか示します:
これらの洞察、方法、および例を通じて、ホストとDockerコンテナ間のフォルダ共有を効果的に処理するための準備ができているはずです。プロジェクトのニーズに合わせて方法をさらに探求し、修正することを自由に行ってください。
記事の内容に誤りがある場合, あなたは