azukipochette's weblog

memory dump (mini)

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" です。