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

Isaac Tony 2023年1月30日
  1. バインドマウントを使用して、ホストディレクトリを Docker コンテナにマウントする
  2. まとめ
Docker コンテナにホストディレクトリをマウントする

他の機能に加えて、Docker はホストオペレーティングシステムとコンテナファイルシステムを操作するためのツールを提供します。これらの機能の中には、コンテナー内のデータを永続化し、ディレクトリを Docker コンテナーにマウントすることでコンテナー間でデータを共有する機能があります。

Docker コンテナへのディレクトリのマウントは、開発環境と本番環境で役立ちます。これにより、ホストシステムディレクトリに依存するサービスが作成されるだけでなく、Docker コンテナが破棄されてもファイルシステム全体が破棄されないようになります。

コンテナの新しいバージョンを作成したいとします。この場合、ディレクトリを Docker コンテナに直接マウントすると、ホットリロードが有効になります。

この記事では、Docker が正しくセットアップされ、Docker イメージとコンテナーが含まれている必要があります。これは、Docker を wsl と Linux のどちらで実行しているかに関係なく機能します。

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

バインドマウントは、Docker コンテナをホストシステムのディレクトリにマウントすることでデータを永続化できる最も初期のソリューションの 1つです。これらにより、ターゲットディレクトリの絶対ファイルパスを参照してディレクトリを参照できるようになります。

この場合、Docker ボリュームの場合とは異なり、Docker はこのディレクトリを制御しません。Docker ボリュームは、Docker が管理する Docker ストレージシステム内にディレクトリを作成します。

これに加えて、Docker ボリュームとは異なり、DockerCLI または DockerAPI を介してコンテナーにマウントされたディレクトリを直接管理することはできません。ただし、Docker マウントは、Docker ボリュームのパフォーマンスがわずかに高い MAC や Windows などのホストでパフォーマンスが高くなります。

また、バインドマウントを使用してコンテナをディレクトリにマウントすると、コンテナのサイズが確実に大きくなることに注意してください。

コンテナの起動中に、2つのフラグを使用してディレクトリをコンテナにマウントできます。これらには、-v および --mount フラグが含まれます。

-v または --volume フラグを使用してホストディレクトリを Docker コンテナにマウントする

これは、常に正しい順序でコロンで区切られている必要がある 3つのフィールドで構成されています。これらには以下が含まれます:

  • マウントするホストマシン上のディレクトリへのパス。
  • このディレクトリをマウントする必要があるコンテナ内のディレクトリへのパス。
  • ro などの他のオプションオプションは、読み取り専用モードを指定します。
docker run -t -i -v <host_dir>:<container_dir

一緒にマウントするホストとコンテナディレクトリを特定したら、上記のコマンドを実装できます。ただし、機密ファイルに変更を加えてはなりません。

これは、マウントによって機密ファイルにアクセスできるためです。これが改ざんされると、システムに致命的な障害が発生する可能性があります。

この場合、公式の ruby イメージを使用してコンテナーを作成し、ディレクトリーをマウントします。Docker コンテナと同じディレクトリ名でスクリプトに名前を付けました。

isaac@DESKTOP-HV44HT6:~/isaac$ docker run -it --rm -v$HOME/Desktop/scripts:/scripts --name scripts ruby bash
Unable to find image 'ruby:latest' locally
latest: Pulling from library/ruby
e4d61adff207: Pull complete
4ff1945c672b: Pull complete
ff5b10aec998: Pull complete
12de8c754e45: Pull complete
ada1762e7602: Pull complete
f8f0dec0b2ef: Pull complete
7109f2ab3080: Pull complete
fe1e1dda18a5: Pull complete
Digest: sha256:a1ebc64daa170324dde5b668829de85487575eaa2bdea5216b4c983b1822f9df
Status: Downloaded newer image for ruby:latest

ローカルにイメージがない場合、Docker は自動的にイメージをダウンロードします。コンテナ構築プロセスが完了すると、Docker がコンテナを開きます。

root@9d057cf9e33d:/#
root@9d057cf9e33d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  scripts  srv  sys  tmp  usr  var
root@9d057cf9e33d:/# cd scripts
root@9d057cf9e33d:/scripts# ls

コンテナ内の scripts ディレクトリが空であることがわかります。

それでは、ホストマシンの scripts ディレクトリに移動して、そのディレクトリに新しいファイルを作成しましょう。Docker コンテナディレクトリスクリプトに自動的に反映されます。

isaac@DESKTOP-HV44HT6:~/Desktop$ cd scripts
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ touch new_file.txt
touch: cannot touch 'new_file.txt': Permission denied
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ ls
new_file.txt
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$

ローカルディレクトリにファイルを作成すると、そのファイルは下のコンテナディレクトリに表示されます。

root@913609933be2:/scripts# ls
new_file.txt

--mount フラグを使用してホストディレクトリを Docker コンテナにマウントする

これは、-v タグよりも簡単な方法であり、コンマで区切られた複数のキーと値のペアで構成されます。これらのタグの場合、フィールドの順序は関係ありません。

ただし、-v タグと比較すると、より冗長です。

これらのメソッドは、次のコマンドで構成されています。

  • Bindvolumetmpfs などのマウントのタイプ。
  • ソース、つまりマウントするホスト上のディレクトリへのパスは、通常、src で示されます。
  • 宛先、つまり、ディレクトリをマウントするコンテナ上のディレクトリへのパス。
  • 読み取り専用オプションやバインド伝播など、このディレクトリをプライベートまたは共有として指定する可能性のある他のオプションもあります。

必要なすべてのフィールド、特に送信元と宛先をメモしたら、次のようにコマンドを実行できます。

この場合、公式の Nginx イメージを使用してコンテナーを構築し、ローカルディレクトリ名 new_scriptsetc/nginx にあるディレクトリにマップします。

$ docker run -d \
> -it \
> --mount type=bind,source=$HOME/Desktop/scripts/new_scripts,target=/etc/nginx \
> nginx \
> bash
e079e3254970e290ae68473239e101c6aa8ba4ba56482c75cd21f9bb9f49600b

2つのディレクトリのマッピングに成功したので、ホスト上のディレクトリに加えられた変更は、コンテナ内のディレクトリに自動的に反映されます。

isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ ls
new_file.txt

このファイルは、このディレクトリにマップされた docker ディレクトリに反映され、2つのディレクトリが正常にマップされたことを示します。

root@e079e3254970:/etc# cd nginx
root@e079e3254970:/etc/nginx# ls
new_file.txt

まとめ

Docker の -v および -mount タグを使用してディレクトリをマウントする方法のデモンストレーションに成功しました。

ただし、-v タグを使用して存在しないディレクトリをマウントすると、Docker が自動的にディレクトリを作成することにも注意してください。これは、Docker--mount タグを使用する場合と同じではありません。

新しいアプリケーションを開発するときは、代わりに Docker ボリュームの使用を検討する必要があります。

著者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

関連記事 - Docker Container