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
タグと比較すると、より冗長です。
これらのメソッドは、次のコマンドで構成されています。
Bind
、volume
、tmpfs
などのマウントのタイプ。- ソース、つまりマウントするホスト上のディレクトリへのパスは、通常、
src
で示されます。 - 宛先、つまり、ディレクトリをマウントするコンテナ上のディレクトリへのパス。
- 読み取り専用オプションやバインド伝播など、このディレクトリをプライベートまたは共有として指定する可能性のある他のオプションもあります。
必要なすべてのフィールド、特に送信元と宛先をメモしたら、次のようにコマンドを実行できます。
この場合、公式の Nginx イメージを使用してコンテナーを構築し、ローカルディレクトリ名 new_scripts
を etc/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 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