Dockerにホストのフォルダをマウントしたい!

  • 91
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

docker-machineをVirtualBoxで使っているときにデータを永続化したい場合には、
Data Volumeと共有フォルダ機能を組み合わせてデータを保存する方法があります。

基本的な使い方と、任意のディレクトリをマウントする応用形の2種類を用意しました。
ちょくちょく読み替えればMacでも使えると思われます。

前提

  • Windows 10
  • VirtualBox 5.0.6
  • Docker Toolbox 1.8.2c
  • dev という名前で VirtualBox上に docker-machine VM を用意しています

【基本形】C:\Users 配下をData Volumeにする場合

まずは基本形。docker-machine (旧 boot2docker)は Windows環境であれば、
C:\Users をVirtualBox共有フォルダとしてdockerホストの /c/Users に自動マウントしてくれます。

そのため、docker-machineホスト(VMを実行しているホスト)のパスと、
dockerホストのパスとの差異をほとんど気にせずData Volumeにすることができます。

例えば hoge ユーザーのユーザーディレクトリをData Volumeにするには下記のようなコマンドになります。

docker run -v /c/Users/hoge:/hoge busybox ls -la /hoge

【応用形】C:\Users 配下以外をData Volumeにする場合

C:\Users 配下以外をdockerコンテナで利用したい場合は、docker run -v する前に、
docker-machine がやってくれていることを自分でやってあげる必要があります。

コマンドは下記のようになります。

# VboxManageでVirtualBox共有フォルダを追加する (初回のみ)
VBoxManage sharedfolder add dev --name data --hostpath "/path/to/data"

# dockerホスト上に共有フォルダをマウントする (dockerホストを起動するたび行う)
docker-machine ssh dev 'sudo mkdir -p /path/to/mount'
docker-machine ssh dev 'sudo mount -t vboxsf -o uid=0,gid=0 data /path/to/mount'

# dockerホストにマウントした共有フォルダをData Volumeとして利用する
docker run -v /path/to/mount:/data busybox ls -la /data

例) D:\ をまるごとマウントする場合

# VboxManageで D:\ を d として共有フォルダを追加
VBoxManage sharedfolder add dev --name d --hostpath 'D:/' --automount

# dockerホスト上に共有フォルダ d を /d にマウントする
docker-machine ssh dev 'sudo mkdir -p /d'
docker-machine ssh dev 'sudo mount -t vboxsf -o uid=0,gid=0 d /d'

# dockerホストにマウントした /d をコンテナ内の /d でData Volumeとして利用する
docker run -v /d:/d ubuntu ls -la /d

備考

Git for Windows など bash 上での注意

この環境から docker run すると、うまくコマンドラインオプションを解析してくれないようでした。
docker run -v //d:/d busybox ls -la //d のように最初の / を2つにしてやると良いようです。

Data Volume とは

dockerコンテナはそのままではデータを永続的に保持できませんが、
その制約を受けない特別なディレクトリということらしいです。

例えば普通にdockerでMySQLを立ち上げて、落としてしまうと
次にdocker runしたらそれまでのデータが無かったことになってしまうので (厳密には違うらしい)
そのようなデータを保持してくれなきゃ困る!といった場合に使う機能ということのようです。

Data Volume Container とは

複数のdockerコンテナで永続的なデータを共有させたい場合は、
Data Volumeだけを世話するコンテナを用意してあげて、そのコンテナを
他のコンテナから利用してやるのが良いらしいです。
今回は割愛。下記のエントリがとても参考になりました。
ref: http://qiita.com/sokutou-metsu/items/b83b275198fc9594f5a4

docker-machine がもっと賢くなるかも?

ref: https://github.com/boot2docker/boot2docker#virtualbox-guest-additions

It is also important to note that in the future, the plan is to have any share which is created in VirtualBox with the "automount" flag turned on be mounted during boot at the directory of the share name (ie, a share named home/jsmith would be automounted at /home/jsmith).

…とのことで Virtualbox上で自動マウントになってるディレクトリを
よしなにやってくれるような構想があるようです。