VMWareWorkstationを使ってwindows から docker を使う

普段 VMWareWorkstation を使っていて VirtualBoxHyper-V を使いたくない人向けです。

  • Windows Professioanl であれば Hyper-V が使えるのでそっちの方が良いでしょう。
  • VirtualBoxを使っている人は Docker Toolbox を使いましょう。

参照元:


1. Chocolatey を入れる
管理者権限の cmd.exe から

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"


2. docker, docker-machine, docker-machine-vmwareworkstation を入れる
続けて管理者権限の cmd.exe から

choco install -y docker  
choco install -y docker-machine  
choco install -y docker-machine-vmwareworkstation  


3. VMWareWorkstationにdocker-vmを作る
cmd.exe から

docker machine --native-ssh create -d vmwareworkstation default


4. dockerコマンドをdocker-vmへ向ける設定
普段使いが cmd.exe であれば cmd.exe から

docker-machine env

で表示される最後の行を実行するようにします。

 @FOR /f "tokens=*" %i IN ('"C:\ProgramData\chocolatey\lib\docker-machine\bin\docker-machine.exe" env') DO @%i

普段使いが bash であれば bash から

eval $(docker-machine env)

を実行するか ~/.profile にでも書いておきましょう。


5. VMの設定を変更する
VMは %USERPROFILE%.docker\machine\machines\default に作られます。
VMWareWorkstationのGUIには登録されないので必要なら default.vmx ファイルをドロップして追加します。
デフォルトでは

  • メモリ: 1GB
  • CPU: 1コア

で構成されているので、適宜変更します。


6. VMの共有フォルダ設定を変更する
デフォルトでは C:/Users が Users (VMからは /mnt/hgfs/Users) として設定されています。
今回の方法でインストールした場合、Windowsのフォルダをhgfs経由で参照するパス変換がされていないので、VM自体を調整します。
調整しなくても以下のように指定することはできます。

$ docker run -it --rm -v //mnt/hgfs/Users://mnt:ro busybox ls //mnt
<C:/Users/ の内容が ls される>


6.1. VMの共有フォルダ設定を追加する
ドライブCを c (小文字)で追加します。
ドライブDを Volumeオプションに指定する場合は、ドライブDを d (小文字)で追加します。


6.2 VMシンボリックリンクを作る
default VMを開くと /mnt/hgfs に Users/, c/ (, d/) がある筈です。
/mnt/hgfs/c がドライブC, /mnt/hgfs/d がドライブD です。
これらをルートから参照できるようにシンボリックリンクを張ります。

$ cd /
$ ln -s /mnt/hgfs/c /
$ ln -s /mnt/hgfs/d /


6.3 Volumeオプションで指定してみる
これで /c/Users/ の形(MinGW-bashのパス指定と同じ)で指定できるようになります。
MinGW-bash からであれば以下のように記述できます。

$ docker run -it --rm -v //c/Users/suzumura://mnt:ro busybox ls //mnt
<C:/Users/suzumura/ の内容が ls される>

$ docker run -it --rm -v //d://mnt:ro busybox ls //mnt
<D:/ の内容が ls される>

全てのパス指定を // で始めているのは、MinGW-bash のパス文字列変換を避ける記述です。


Enjoy !