Dockerは、ホストOSのディレクトリをコンテナに見せることが出来ます。
この機能を使うことでホストOSが提供するデータをコンテナに配布して利用したり、コンテナ内のデータのバックアップをホストOSのディレクトリに直接取得するといったこと可能です。
今回は、その手順を紹介します。
bind mountによるディレクトリの提供
bind mountというオプションを指定してDockerエンジンが稼働しているホストOS上の任意のディレクトリをコンテナに見せます。以下は、ホストOSが提供する/tmp/host_dirディレクトリをDockerコンテナ内で利用する例です。
コンテナ用ディレクトリの作成
ホストOS側で、コンテナに提供するディレクトリを作成します。今回は/tmp/host_dirディレクトリをコンテナに提供します。
1 |
# mkdir /tmp/host_dir |
ホストOS側にファイルを作成
作成したホストOSの/tmp/host_dirに、テスト用のファイル(test.txt)を作成します。
1 |
# echo "This is a test file." > /tmp/host_dir/test.txt |
ホストOSのディレクトリをコンテナに提供
ホストOSの/tmp/host_dir をコンテナに提供します。以下の実行例は、ホストOSの/tmp/host_dirをコンテナ内の/home/container_dirとして利用する設定例です。
–mountオプションを使っているところに注目してください。
1 |
# docker run -it --name centos7 -h dirtest --mount type=bind,src=/tmp/host_dir,dst=/home/container_dir docker.io/centos:latest /bin/bash |
オプションの説明
-i: Dockerコンテナ起動時に、標準出力を受け付けます
-t: 仮想端末(pseudo-TTY)をコンテナに割り当てます
–name:作成するコンテナに名前を付けます
-h:コンテナにホスト名を与えることが出来ます
–mount:ホストOSデータの参照方法を指定出来ます(type=bindを指定)
※src(source)でホストOS上のディレクトリを指定して、dst(destination)でコンテナ内のディレクトリを指定します。
提供されたディレクトリの確認
コンテナ内の/home/container_dir ディレクトリ内にホストOS側が提供するファイルが存在するか確認してみます。
1 2 3 4 5 |
[root@dirtest /]# ls /home/container_dir/ test.txt [root@dirtest /]# cat /home/container_dir/test.txt This is a test file. |
コンテナ内のファイルの削除
コンテナ内で、ファイルを削除してみます。
1 2 3 4 5 |
[root@dirtest /]# rm /home/container_dir/test.txt [root@dirtest /]# ls /home/container_dir/ test.txtが削除されて空っぽになっていることを確認 |
コンテナ内にファイルを作成
コンテナ内にファイルを作成してみます。
1 2 3 4 5 6 7 |
[root@dirtest /]# echo "This is a test_container file." > /home/container_dir/test_container.txt [root@dirtest /]# ls /home/container_dir/ test_container.txt [root@dirtest /]# cat /home/container_dir/test_container.txt This is a test_container file. |
ホストOS側のディレクトリの状態を確認
CTRL + P、CTRL + Q でコンテナから抜けて、ホストOS側のディレクトリ内のファイルが変更されていることを確認します。
1 2 3 4 5 |
[root@docker /]# ls /tmp/host_dir/ test_container.txt [root@docker /]# cat /tmp/host_dir/test_container.txt This is a test_container file. |
ホストOSのディレクトリを書き込み不可でコンテナに提供
読み込みだけを許可して、書き込み不可の状態でディレクトリを提供することも可能です。
–mountオプションで指定するコンテナのディレクトリ名の後に「,readonly」を追加します。
1 2 3 4 |
# mkdir /tmp/host_dirRO # echo "This is a test file." > /tmp/host_dirRO/test.txt # docker run -it --name centos7RO -h dirtestRO --mount type=bind,src=/tmp/host_dirRO,dst=/home/containerRO_dir,readonly docker.io/centos:latest /bin/bash |
提供されたディレクトリの確認
コンテナ内の/home/container_dir ディレクトリ内にホストOS側が提供するファイルが存在するか確認してみます。
1 2 3 4 5 |
[root@dirtestRO /]# ls /home/containerRO_dir/ test.txt [root@dirtestRO /]# cat /home/containerRO_dir/test.txt This is a test file. |
コンテナ内のファイルの削除(編集が出来ないことを確認)
コンテナ内で、ファイルを削除してみます。
1 2 |
[root@dirtestRO /]# rm /home/containerRO_dir/test.txt rm: cannot remove '/home/containerRO_dir/test.txt': Read-only file system |
読み込みのみで削除などの編集が出来ないことが確認出来ました。
以上でDockerのテクニック、「ホストOSのディレクトリをコンテナに見せる。」の説明を終わります。