VMWareWorkstationを使ってwindows から docker を使う
普段 VMWareWorkstation を使っていて VirtualBox や Hyper-V を使いたくない人向けです。
- Windows Professioanl であれば Hyper-V が使えるのでそっちの方が良いでしょう。
- VirtualBoxを使っている人は Docker Toolbox を使いましょう。
参照元:
- https://superuser.com/questions/1195676/is-it-possible-to-have-docker-running-inside-of-vmware
- https://chocolatey.org/install
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
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 !