VMWare Workstation で Docker 生活
はじめに
こん**わ。
なんだか VMWare 自体がやる気がないように見える VMWare Workstation。 Docker も Hyper-V 対応になって、時代は Hyper-V なんじゃないの...と思い出しているかもしれない皆様、いかがお過ごしでしょうか。
私はしばらくの間 Docker は VMWare Workstation 上で使えないのだと思っていて、Vagrant + VMWare Workstation で CoreOS を動かしてその上で Docker を扱っていましたが、実は VMWare Workstation でも Docker が扱えることがわかったので、今日はこの話をまとめます。
Docker Machine VMWare Workstation Drive の導入
世の中には VMWare 愛のある人がいるもので、Docker 用の VMWare Workstation ドライバーを書いてくれています。
Docker for Windows というのは簡単に言うと、docker-machine というコマンドを使って Docker を動かす Linux 仮想マシンを起動して、その環境を docker コマンド経由で操作するようなことをしています。 通常、docker-machine コマンドのドライバーは Hyper-V か VirtualBox なわけですが、これを上記の docker-machine-vmwareworkstation を使うことで、VMWare 上で動作する仮想マシンを用意することができます。
インストール手順は、上記の GitHub のページの "Installation" に書いてあるので読んでください。 なお、最初にある "Install Docker Toolbox" というのは、以下にあります。
start.sh のスクリプトはまるっと置き換えてしまえば大丈夫です。
docker-machine-driver-vmworkstation.exe はパスが通っているフォルダーに置くか、docker-machine.exe のあるフォルダーのどちらかに置くことになりますが、私は docker-machine.exe のフォルダに直接置いています。*1
docker-machine を実行する
docker-machine コマンドを使って、docker を動かす Linux (boot2docker) 仮想マシンを作成します。
docker-machine create --driver=vmwareworkstation default
私は既定のまま使っていますが、ディスクやメモリ、CPU 数などはパラメータで変更可能です。詳しくはこちらも GitHub のページの記載を見てください。 実行すると以下のような流れで仮想マシンが作成されます (それなりに時間がかかります)。
Running pre-create checks... Creating machine... (default) Copying C:\Users\<YourName>\.docker\machine\cache\boot2docker.iso to C:\Users\<YourName>\.docker\machine\machines\default\boot2docker.iso... (default) Creating SSH key... (default) Creating VM... (default) Creating disk 'C:\Users\<YourName>\.docker\machine\machines\default\default.vmdk' (default) Virtual disk creation successful. (default) Starting default... (default) Waiting for VM to come online... Waiting for machine to be running, this may take a few minutes... Detecting operating system of created instance... Waiting for SSH to be available... Detecting the provisioner... Provisioning with boot2docker... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Checking connection to Docker... Docker is up and running! To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env default
作成が完了しているかどうかを念のため確認してみます。
docker-machine ls
以下のような結果が帰ってくるはずです。
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - vmwareworkstation Running tcp://192.168.32.139:2376 v18.05.0-ce
次に、docker-machine create のレスポンスの最後にあるように、作成した仮想マシン上で docker コマンドが使えるように接続します。
docker-machine env default
以下のような結果が帰ってきます (実はこの記述は置き換えた start.sh の中に書いてあります)。
SET DOCKER_TLS_VERIFY=1 SET DOCKER_HOST=tcp://192.168.32.139:2376 SET DOCKER_CERT_PATH=C:\Users\<YourName>\.docker\machine\machines\default SET DOCKER_MACHINE_NAME=default SET COMPOSE_CONVERT_WINDOWS_PATHS=true REM Run this command to configure your shell: REM @FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i
"Run this command to configure your shell" と書かれているように、表示されたコマンドを次のように実行します。
@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i
これで、Docker コマンドを実行する準備ができました。
docker コマンドを試す
実際に docker コマンドが使えるかどうかを hello-world というイメージを使用して確認します
docker run hello-world
すると、以下のような結果が返ってきます。
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 9bb5a5d4561a: Pull complete Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
これで、無事に docker が使えることが確認できました!(ヤッタ!)
ホストとコンテナのフォルダを共有する
ホスト (Windows) のフォルダーをコンテナ上で扱えないと不便ですよね。
なぜか Docker Machine VMWare Workstation Drive の README.md には記載がないのですが、docker-machine コマンドで仮想マシンを作成したときに、VMWare の機能を使用して C:\Users フォルダーが /Users として共有されています。これまでに説明したように、"Windows <-> Linux (boot2docker) 仮想マシン <-> Container" という流れなので、docker コマンドの --volume で /Users をマッピングすればいいことになります。
たとえば、以下は ubuntu コンテナ上で Windows 上の C:\Users を /share としてマッピングする時のコマンドです。
docker run --name mycontainer -v /Users:/share -it ubuntu /bin/bash
なお、Windows の世界の人は忘れがちですが、大文字・小文字を区別するので、"/Users" とするのがポイントです。
"C:\Users" 配下ではないフォルダーをマウントしたい
上記を見て、「え? C:\Users 配下しか使えないの?」と思った方々、私たちには mklink
コマンドがあります。
これは、シンボリックリンクを作成するコマンドです。シンボリックリンクというのを知らない人に簡単に説明すると、特定のフォルダーに実態があるものを、あたかもそのフォルダーにあるかのようにリンクを作成するものと思ってください。たとえば、"D:\Works" を使いたい場合には、まず C:\Users 配下にシンボリックリンクを作成すればよいことになります。
以下は、自分のユーザープロファイル配下に Share フォルダーがあるように D:\Works フォルダーをリンクした例です。
mklink/d C:\Users\<YourName>\share D:\Works
あとは docker コマンド実行時に -v を使ってマッピングすればよいだけです。
docker run --name mycontainer -v /Users/<YourName>/share:/share -it ubuntu /bin/bash
これで、楽しく Docker が使えますね。
それでは、楽しい Docker ライフを。Enjoy!
*1:どうせ start.sh ファイルの内容を置き換えしているし、いいかなという感覚で置いています。ちなみに、変更していなければ既定の場所は "C:\Program Files\Docker Toolbox" です。