Docker ToolboxをVMware Workstationで使う

Docker for Windowsに対応していないWindows8.1でDockerを利用するには、Docker Toolboxで環境を構築する。
Docker Toolboxには以下が含まれている。

> + Docker CLI client for running Docker Engine to create images and containers
> + Docker Machine so you can run Docker Engine commands from Windows terminals
> + Docker Compose for running the docker-compose command
> + Kitematic, the Docker GUI
> + the Docker QuickStart shell preconfigured for a Docker command-line environment
> + Oracle VM VirtualBox

上記引用元:(https://docs.docker.com/toolbox/toolbox_install_windows/#what-you-get-and-how-it-works)

筆者の環境では、既にVMware Workstation12がインストールされているので、VirtualBoxの代わりにVMware Workstationを使う。VMware Workstationを使うには、下記ドライバが必要となる。
https://github.com/pecigonzalo/docker-machine-vmwareworkstation

以下では、上記を参考にVMware Workstationを使うための手順を示す。

# 筆者環境

+ Windows8.1
+ VMware Workstation 12
+ Docker Toolbox
+ docker-machine-vmwareworkstation v1.1.0

# 手順概要

1. Docker Toolboxのインストール
1. docker-machine-vmwareworkstationのインストール
1. docker machine の作成

# Docker Toolboxのインストール

## Docker Toolboxのダウンロード

以下の公式サイトからDocker Toolbox for Windowsをダウンロードする。

https://docs.docker.com/toolbox/toolbox_install_windows/

Dockerを実行するにあたり、OSごとに必要となる設定が変わってくるので、同ページ内の「Step1: Check your version」を参考に設定を行う。

ダウンロードしたディレクトリをcmdの管理者権限で開き、下記コマンドを実行し、インストールを進める。

```
> DockerToolbox.exe /COMPONENTS="Docker,DockerMachine,DockerCompose"
```
## start.shファイルの書き換え

下記リンク内の`Installing with Docker Toolbox > Replace contents of C:\Program Files\Docker Toolbox\start.sh with this script.`に掲載されているスクリプトで`C:\Program Files\Docker Toolbox\start.sh`を書き換える。
https://github.com/pecigonzalo/docker-machine-vmwareworkstation

上記から引用したものが以下のスクリプト

>
>```sh:start.sh
#!/bin/bash
>
export PATH="$PATH:/mnt/c/Program Files (x86)/VMware/VMware Workstation"
trap '[ "$?" -eq 0 ] || read -p "Looks like something went wrong in step ´$STEP´... Press any key to continue..."' EXIT
>
VM=${DOCKER_MACHINE_NAME-default}
DOCKER_MACHINE=./docker-machine.exe
>
BLUE='\033[1;34m'
GREEN='\033[0;32m'
NC='\033[0m'
>
if [ ! -f "${DOCKER_MACHINE}" ]; then
  echo "Docker Machine is not installed. Please re-run the Toolbox Installer and try again."
  exit 1
fi
>
vmrun.exe list | grep \""${VM}"\" &> /dev/null
VM_EXISTS_CODE=$?
>
set -e
>
STEP="Checking if machine $VM exists"
if [ $VM_EXISTS_CODE -eq 1 ]; then
  "${DOCKER_MACHINE}" rm -f "${VM}" &> /dev/null || :
  rm -rf ~/.docker/machine/machines/"${VM}"
  #set proxy variables if they exists
  if [ -n ${HTTP_PROXY+x} ]; then
    PROXY_ENV="$PROXY_ENV --engine-env HTTP_PROXY=$HTTP_PROXY"
  fi
  if [ -n ${HTTPS_PROXY+x} ]; then
    PROXY_ENV="$PROXY_ENV --engine-env HTTPS_PROXY=$HTTPS_PROXY"
  fi
  if [ -n ${NO_PROXY+x} ]; then
    PROXY_ENV="$PROXY_ENV --engine-env NO_PROXY=$NO_PROXY"
  fi  
  "${DOCKER_MACHINE}" create -d vmwareworkstation $PROXY_ENV "${VM}"
fi
>
STEP="Checking status on $VM"
VM_STATUS="$(${DOCKER_MACHINE} status ${VM} 2>&1)"
if [ "${VM_STATUS}" != "Running" ]; then
  "${DOCKER_MACHINE}" start "${VM}"
  yes | "${DOCKER_MACHINE}" regenerate-certs "${VM}"
fi
>
STEP="Setting env"
eval "$(${DOCKER_MACHINE} env --shell=bash ${VM})"
>
STEP="Finalize"
clear
cat << EOF
>
>
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
>
EOF
echo -e "${BLUE}docker${NC} is configured to use the ${GREEN}${VM}${NC} machine with IP ${GREEN}$(${DOCKER_MACHINE} ip ${VM})${NC}"
echo "For help getting started, check out the docs at https://docs.docker.com"
echo
cd
>
docker () {
  MSYS_NO_PATHCONV=1 docker.exe "$@"
}
export -f docker
>
if [ $# -eq 0 ]; then
  echo "Start interactive shell"
  exec "$BASH" --login -i
else
  echo "Start shell with command"
  exec "$BASH" -c "$*"
fi
```

# docker-machine-vmwareworkstationのインストール

下記リンク内の`Latest release > docker-machine-vmwareworkstation.exe`をダウンロードし、`C:\Program Files\Docker Toolbox\`内に保存する。
https://github.com/pecigonzalo/docker-machine-vmwareworkstation/releases


# Docker利用する

## Docker Machineの作成

以下を実行すると、先ほどダウンロードした`docker-machine-vmwareworkstation`を使ってdevという名前のmachineが作成される。
※以降では、Pathを一部改変しています

```
C:\Users\Desktop\docker>docker-machine create --driver=vmwareworkstation dev
```

以下で、machineが作成されたことを確認。

```powershell
C:\Users\Desktop\docker>docker-machine ls
NAME   ACTIVE   DRIVER              STATE     URL                         SWARM   DOCKER        ERRORS
dev    *        vmwareworkstation   Running   tcp://172.16.111.128:2376           v18.06.1-ce

C:\Users\Desktop\docker>
```

## 環境変数の設定

Docker MachineでDockerを動かすために、環境変数の設定を行う。

```
C:\Users\Desktop\docker>docker-machine env dev
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://172.16.111.128:2376
SET DOCKER_CERT_PATH=C:\Users\.docker\machine\machines\dev
SET DOCKER_MACHINE_NAME=dev
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM     @FOR /f "tokens=*" %i IN ('docker-machine env dev') DO @%i

C:\Users\Desktop\docker>SET DOCKER_TLS_VERIFY=1

C:\Users\Desktop\docker>SET DOCKER_HOST=tcp://172.16.111.128:2376

C:\Users\Desktop\docker>SET DOCKER_CERT_PATH=C:\Users\.docker\machine\machines\dev

C:\Users\Desktop\docker>SET DOCKER_MACHINE_NAME=dev

C:\Users\Desktop\docker>SET COMPOSE_CONVERT_WINDOWS_PATHS=true

C:\Users\Desktop\docker>
```

## 動作確認

以下では、動作の確認で2つほどコンテナを実行する。
行っているのは公式の下記リンクに記載されている内容。
https://docs.docker.com/machine/get-started/#run-containers-and-experiment-with-machine-commands

### hello world

以下でhello worldが表示されるか確認。

```
C:\Users\Desktop\docker>docker run busybox echo hello world
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
90e01955edcd: Pull complete
Digest: sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812
Status: Downloaded newer image for busybox:latest
hello world

C:\Users\Desktop\docker>
```

### nginx

nginxのコンテナを実行。

```
C:\Users\Desktop\docker>docker run -d -p 8000:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
f17d81b4b692: Already exists
d5c237920c39: Pull complete
a381f92f36de: Pull complete
Digest: sha256:b73f527d86e3461fd652f62cf47e7b375196063bbbd503e853af5be16597cb2e
Status: Downloaded newer image for nginx:latest
0462eb967f8a156fdcdeae651ced151f52fef0bee6d56b877a7fc828da57c53e
```

machineのipを確認し、curlでレスポンスが返ってくるか確認する。
※curlがインストールされていない場合は、ブラウザで確認してください。

```
C:\Users\Desktop\docker>docker-machine ip dev
172.16.111.128

C:\Users\Desktop\docker>curl 172.16.111.128:8000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

C:\Users\Desktop\docker>
```

#おわりに

Docker ToolboxでインストールされるVirtualBoxの代わりにVMware Workstationを利用してDockerを利用した。
タイトルは厳密には正しくないと思うが、あんまり時間をかけても意味がないので、無視。
良いタイトルがあればコメント等で

# 参考

+ https://docs.docker.com/machine/get-started/
+ https://github.com/pecigonzalo/docker-machine-vmwareworkstation