普通にdockerを使っている場合は、docker run -v /source:/destination
とするとコンテナホストの/source
をコンテナの/destination
にマウントして、コンテナからアクセスできる。
では、Docker for WindowsでC:\Source
をコンテナの/destination
にマウントしたいときはどうするか。VMホストのC:\Source
をコンテナの中に直接マウントすることは当然できない。
まず最初に、 docker-machineでVMを作成するときにC:\Source
を共有フォルダとして設定する。共有フォルダはVirtualBox deriverの--virtualbox-share-folder
オプションで以下のように指定できる。
docker-machine create --driver virtualbox --virtualbox-share-folder=C:\Source:Source
C:\Source:Source
は、C:\Source
を共有名Source
で共有フォルダにすることを意味する。VMがこれを 自動的にコンテナホストの/Source
にマウントする。
それから、docker run -v /Source:/destination docker-machine
としてコンテナホストの/Source
をコンテナの/destination
にマウントすると、以下の図のようにそこからC:\Source
にアクセスできる。
ところで、VirtualBoxの自動マウントでは、通常は共有名Source
はゲストOSの/media/sf_Source
にマウントされる。しかし、VirtualBoxドライバーの作るVMでは/Source
にマウントされる。これはVMの設定で以下のようにMountDir
(/media
)とMountPrefix
(sf_
)を/
にしているからだ。
C:\Users
の場合
--virtualbox-share-folder
を指定しない場合は、VirtualBox deriverはデフォルト値として\\?\c:\Users:c/Users
を使用する。VMはC:\Users
をコンテナホストの/c/Users
にマウントするので、docker run -v /c/Users:/destination
とすると/destination
からC:\Users
が見える。つまりC:\Users
をマウントするのなら--virtualbox-share-folder
は指定しなくてもよい。
VMware Workstationの場合
Docker for WindowsをVMware Workstationで使う方法は、Docker Machine VMware Workstation DriverのInstallationに説明がある。
VMware Workstationドライバーはオプションで共有フォルダを指定できないので、VMを作成した後に設定を書き換える。VM名にdev
を指定した場合には、%USERPROFILE%/.docker/machine/machines/dev/dev.vmx
に以下の設定が見付かるはずだ。これはC:\Users
を共有名Users
で共有フォルダに設定している。
sharedFolder0.hostPath = "C:\Users\"
sharedFolder0.guestName = "Users"
これをC:\Source
に書き換える。あるいはVMwareを使って同様の設定を行ってもよい。
sharedFolder0.hostPath = "C:\Source\"
sharedFolder0.guestName = "Source"
VMwareは共有フォルダSource
をコンテナホストの/mnt/hgfs/Source
に自動的にマウントするので、docker run -v /mnt/hgfs/Source:/destination
で/destination
からC:\Source
にアクセスできる。
VMware WorkstationのC:\Users
の場合
どころで、docker-machineのVMwareドライバーは、デフォルトでC:\Users
を共有フォルダに設定しているだけでなく、これをコンテナホストの/Users
にマウントした上で、さらに/c/Users -> /Users
とシンボリックリンクまで張っている。
つまり、C:\Users
をコンテナの/destination
にマウントする方法は、VirtualBoxドライバの場合とまったく同じでdocker run -v /c/Users:/destination
でよいということだ。
これを実現するために、VMwareドライバはdocker-machine start
で以下のシェルスクリプトをコンテナホストに実行させている。実物はワンライナーだが適宜改行している。
"C:/Program Files (x86)"/VMware/VMware Workstation/vmrun.exe -gu docker -gp tcuser \
runScriptInGuest C:\Users\fujie\.docker\machine\machines\dev\dev.vmx \
/bin/sh [ ! -d /Users ]&& sudo mkdir /Users; \
[ ! -d /c ]&& sudo mkdir -p /c; \
[ ! -d /c/Users ]&& sudo ln -s /Users /c/Users; \
[ -f /usr/local/bin/vmhgfs-fuse ]&& \
sudo /usr/local/bin/vmhgfs-fuse -o allow_other .host:/Users /Users || \
sudo mount -t vmhgfs .host:/Users /Users