WindowsでDocker Toolbox&docker-composeを動かす

仕事でWindows利用者にDocker環境を構築してもらう事があったのですが
結構苦労したので手順を残します。

■□ 注意 ■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
MacやLinuxでdocker-composeを普通に使える前提で手順を書きます。
Dockerやdocker-compose自体の説明はあまり書きません
□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□

もし、Windows10 64bit(Home以外)を使っている人であればこの記事の作業は不要です。
Docker ToolboxではなくDocker for Windowsをインストールしてください。
(たぶん、Docker for Windowsの方が楽に構築できると思われます)

Docker Toolboxのインストール

まずDocker Toolboxをダウンロードします。
以下のページにてDocker Toolboxをダウンロードしてください。
https://docs.docker.com/toolbox/overview/#ready-to-get-started

ダウンロードしてきたEXEファイルを実行するとインストーラーが走りますので、
そのまま次へ次へと進みます。

インストールが完了すると『Docker Quickstart Terminal』というショートカットが
デスクトップに作られるので実行します。
しばらく待つとDockerが立ち上がります。(クジラのAAが表示されます)

docker-compose.ymlの作成

docker-compose.ymlを書きます。
基本的な書き方はMacやLinuxと同じなので割愛します。

気をつけなければいけないのはvolumesの書き方です。
相対パスで記載する場合は以下のように他OS同様の記載ができます。

volumes:
    ./php.ini:/etc/php.ini

次に絶対パスで記載する場合ですが、「C:¥」の部分は「/c/」と書きます。
例えば「C:¥develop¥app」にあるディレクトリを共有する場合は以下のような記載になります。

volumes:
    /c/develop/app:/var/www/html

後に出てくるVirtualboxの共有フォルダ設定次第ではこの通りにしない事も可能かもしれませんが、
できるだけシンプルに構築するため、このようにします。

もしMySQLのコンテナを作成する場合は
データの永続化のためのホスト側ディレクトリを指定することはできません。

つまり、この書き方だとNGで

services:
  mysql:
    〜中略〜
    volumes:
      - ./mysql/data:/var/lib/mysql

この書き方ならOKです

services:
  mysql:
    〜中略〜
    volumes:
      - mydb:/var/lib/mysql
    〜中略〜

volumes:
  mydb

VirtualBoxの設定

Docker Toolboxでコンテナを動かす場合に一番引っかかる部分かもしれません。

ポートフォワーディングの設定

docker-compose.ymlにてポートフォワーディングを8080:80と設定しただけでは
ローカルPCにて http://localhost:8080にアクセスしてもDockerコンテナに
リクエストは飛びません。

なぜかというと、WindowsでDocker Toolboxを使ってコンテナを動かした場合は
『Windows上でVirtualBoxにて仮想環境が作られ、その中でDockerコンテナが動く』
という仕組みになっているからです。

つまり、docker-compose.ymlに記載したポートフォワーディングは
VirtualBox => Dockerコンテナ でしかないため
Windows => VirtualBoxのポートフォワーディングは別で設定する必要があります。

まず、VirtualBoxを開き、『設定』をクリックします。

次に『ネットワーク > 高度 > ポートフォワーディング』と、クリックしていきます。

ポートフォワーディングルールが表示されるので、追加ボタンをクリックしてルールを追加していきます。
ここで設定しているのはWindows => VirtualBoxのポートフォワーディングなので、docker-compose.ymlに記載したポートフォワーディングが8080:80だとしたら
ここで設定するのは8080:8080です。
全体で見ると『Windows(8080) => VirtualBox(8080) => Docker(80)』と
ポートフォワーディングされていくイメージです。

共有フォルダの設定

ホストPCのどのフォルダをDockerと共有するかを設定します。
Docker for Macにある「File Sharing」の設定と同じです。
VirtualBox設定画面にて「共有フォルダー」を選択し、追加ボタンをクリックすると共有フォルダが追加できます。
C:¥Users はデフォルトで共有になっているので、ホームディレクトリ以外にソースコードを置いた場合に設定が必要となります。

追加画面では以下のように設定します
■フォルダーのパス
 共有したいフォルダーのパスです。
 右側の「∨」マークをクリックすれば選択ウィンドウが開きます。
■フォルダー名
 共有フォルダに名称を付けます。
 基本的にはフォルダーのパスをスラッシュ区切りにしたものにしておけば分かりやすいです。

例えば、『C:¥develop』を共有したい場合は下図のようになります。

これでVirtualBoxを再起動し、docker-compose up -d をすればコンテナが立ち上がりました