内部的に VirtualBox を利用して Linux OS な VM を建てて Windows や Mac 環境で Docker ツール一式を利用可能にする。複数コンテナ管理のための docker-compose など必要なパッケージが一通り揃っている。
- インストーラ 実行
- Select Components にて Git for Windows や Kitematic など不要なものをチェックアウト
- VirtualBox は Docker Toolbox とバージョンを合わせる都合上既存のを一度削除してこのインストールで入れ直す
- 環境変数設定
- win → env → 環境変数を設定
- ユーザ環境変数の以下を調整
- 変数名: COMPOSE_CONVERT_WINDOWS_PATHS
- 値: 1
- PC 再起動
- Docker ホスト VM ( docker-machine ) 構築
- Windows メニューより
Docker Quickstart Terminal
を起動 - Docker ホストの IP は開発時にアクセスするのでメモ
- デフォルト: 192.168.99.100
- Windows メニューより
- Windows と Docker ホスト VM の同期設定 ( デフォルト
C:\\User
)- VM を
docker-machine stop
で停止 - VirtualBox の「設定 → 共有フォルダー」よりディレクトリ設定
- パス: マウントさせる Windows ディレクトリ ( e.g.
D:\
) - フォルダ名: Docker ホスト上のディレクトリ名 ( e.g
d
) - パス / フォルダ名は少しでも間違うとマウントされないので注意
- Windows で
C:\\User
以外を同期する場合は 必ずルートディレクトリ c や d をマウントしないと相対パス解決できないっぽい ので注意
- パス: マウントさせる Windows ディレクトリ ( e.g.
- VM を
- PC 再起動 →
docker-machine start
で Docker ホスト VM 起動
上記設定では、Docker ホストのファイルシステム上の
/d
ディレクトリに Windows マシンのD:\
配下がマウントされ、docker コンテナ内から参照・同期が可能になる。
Docker Toolbox では docker-machine ツールにより VirtualBox 内に Docker ホスト VM を構築している。なんかおかしくなったら Docker ホスト再起動したり、rm → create で作り直してもよい。
$ docker-machine ls
> NAME ACTIVE DRIVER STATE URL
> default * virtualbox Running tcp://192.168.99.100:2376
# SSH でログインする場合は以下
$ ssh -i ~/.docker/machine/machines/default/id_rsa [email protected]
$ docker-machine ssh default # SSH ログイン ( 簡易版 )
$ docker-machine stop default # 停止
$ docker-machine start default # 起動
$ docker-machine restart default # 再起動
$ docker-machine rm default # 削除
$ docker-machine create default # 新規作成
Docker for Windows の Docker ホストは VirtualBox で作成した VM なので、CPU やメモリなどハードウェア構成は当然 VirtualBox から行う。
# VM 名が default のとき ...
$ docker-machine stop
$ VBoxManage modifyvm default --cpus 2
$ VBoxManage modifyvm default --memory 4096
$ docker-machine start
docker-machine start
時に、Docker Toolbox 側 ( docker-machine ) からは VM が終了してるから起動しようとしているのに、VirtualBox 側からは当該 VM は既に起動していると判定されて起きるエラーっぽい。
VirtualBox さんこの VM 起動/停止判定ずっとバグってるよね ... ? VirtualBox の GUI から当該 VM ( default とか ) を停止させてから docker-machine start
したら動いた。
Docker ホスト VM ( docker-machine ) の DNS 参照先が古く、Heroku で Docker アプリをリリースする際に AWS の S3 などに名前解決ができないケースがあった。ホスト側の DNS サーバ参照先を Google 提供の 8.8.8.8
などへ変更することで解決した。
# heroku container:push など内部で Docker ホストの
# docker コマンドを利用するコマンドを実行したところエラー
# ※ 直前まで AWS にて DNS 解決不具合の Issue が立っていた
#
> Head https://xxxx: dial tcp: lookup xxxx on 10.0.2.3:53: server misbehaving
> ! Error: docker push exited with Error: 1
# docker-machine へ ssh して resolv.conf を確認
#
$ docker-machine ssh default
$ cat /etc/resolv.conf
> nameserver 10.0.2.3
# root 権限で DNS サーバ参照先を変更
#
$ sudo su
$ vi /etc/resolv.conf
> nameserver 8.8.8.8
$ exit
# エラーが起きたコマンドを再実行するとちゃんと名前解決できた