HOWTO · Docker

Docker コンテナにホストディレクトリをマウントする方法

ホスト上のディレクトリを Docker コンテナにマウントする方法を、コマンド例とともに解説します。

このページの内容

バインドマウントを使うと、ホスト上のディレクトリを Docker コンテナ内のパスに接続できます。開発中のソースコードなど、コンテナから特定のホストディレクトリ内のファイルを読み書きしたい場合に便利です。以下の例では、ホストディレクトリとファイルを用意し、Docker コマンドで Alpine のシェル内にそのディレクトリを公開します。Docker コマンドは説明用であり、この記事の執筆段階では実行していません。

バインドマウントを使用して、ホストディレクトリを Docker コンテナにマウントする

バインドマウントでは、指定したホストパスをコンテナ内のパスに公開します。Docker が管理するボリュームとは異なり、マウント元はホスト上の特定の場所です。そのディレクトリ内でファイルに加えた変更は、コンテナ側のマウントポイントからも確認できます。ただし、アプリケーションが変更を認識して自動的に再読み込みするには、そのアプリケーションがファイルを監視するか、再読み込みする仕組みを備えている必要があります。

-v または --volume でホストディレクトリをマウントする

この Python の例では、site というホストディレクトリを作成し、その中にファイルを書き込んでファイル名を表示します。Docker を起動するディレクトリで実行してください。

from pathlib import Path

site = Path("site")
site.mkdir(exist_ok=True)
(site / "hello.txt").write_text("Hello from the host.\n")
print("\n".join(sorted(path.name for path in site.iterdir())))
hello.txt

ホスト側のファイルは、docker run --rm -it --volume "$PWD/site:/site" alpine:3.20 sh で起動したコンテナの /site にあります。ボリューム値は host-path:container-path[:options] の形式です。$PWD/site がホスト上のディレクトリ、/site がコンテナ内での表示先です。末尾に任意の ro を指定すると読み取り専用になります。短い -v フラグと長い --volume フラグは同じ構文を使うため、読み取り専用にする場合は -v "$PWD/site:/site:ro" と書けます。

コンテナのシェルを起動したまま、ホスト側で touch "$PWD/site/from-host.txt" を実行して新しいファイルを作成します。コンテナのプロンプトで ls /site を実行し、from-host.txt が表示されることを確認してください。書き込み可能なマウントでは、/site 内に作成したファイルもホスト側のディレクトリに書き込まれます。読み取り専用マウントの場合、コンテナからファイルを読み取れますが、そのマウントを通じて変更することはできません。

-v と --volume は、ホスト側のディレクトリが存在しない場合、そのパスにディレクトリを作成します。想定したファイルが見つからないように見える場合があるため、コンテナを使う前に作成されたホストパスを確認してください。パスの入力ミスによって、新しい空のディレクトリができていることがあります。

--mount でホストディレクトリをマウントする

--mount では、各設定をカンマ区切りのキーと値の組で指定します。同じ例を使う場合は、docker run --rm -it --mount "type=bind,source=$PWD/site,target=/site" alpine:3.20 sh を実行します。type=bind はバインドマウントを選択し、source はホスト上のディレクトリ、target はコンテナ内のパスを指定します。マウント経由の書き込みを防ぐには、フィールドに readonly を追加します。フィールドの順番でマウント元とマウント先が決まるのではなく、それぞれのキーで決まります。

-v や --volume と異なり、--mount はバインドマウントのマウント元が存在しないとエラーを返します。コンテナを起動する前に、ホスト側のディレクトリを作成して存在を確認してください。カンマを含むパスでは、カンマ区切りのマウント構文に追加の注意が必要です。適切なホストパスを選ぶか、使用するプラットフォーム向けの Docker のマウント構文を確認してください。

バインドマウントを使うと、コンテナから指定したホストパスにアクセスできます。処理に必要なディレクトリだけをマウントし、機密ファイルを公開しないようにしてください。また、コンテナに書き込みが不要なら読み取り専用にします。ホストパスの共有方法やアクセス権は、システム上の Docker の設定によっても異なる場合があります。

まとめ

短いコロン区切りの形式には -v または --volume を使い、キーと値を明示する形式には --mount を使います。どちらもホストディレクトリをコンテナ内のパスから利用できるようにしますが、-v は存在しないマウント元を作成する一方、--mount では事前にマウント元が存在している必要があります。特定のホストパスをコンテナから使う場合はバインドマウントを選びます。Docker が特定のホストディレクトリに依存せずに管理するアプリケーションデータには、Docker 管理のボリュームが適していることがあります。