Docker for Windowsで快適な環境を得るまでの そこそこ長い闘い

はじめに

Macで開発する人も多いと思います。たしかにMacはBSDベースで開発便利ですが
Windowsこそ最高の開発環境である という前提で、Windowsで最高の開発環境を構築しようと思います

結果だけ見たい人は下の方をw

Windowsのメリットは、ハードウェアの選択肢が多い事
特にゲームや人工知能開発には ハイスペックGPU選べるのが良いですね
DirectXも動きます

ではWindows開発の問題は何か?

一番は シェルです
WindowsにはBash等 Linuxと互換性のあるシェルがなく、コマンドプロンプトやパワーシェルという独特なシェルです
一般的には bash等のシェルスクリプトが使われるため、これは不利です

もう一つは、Windowsに PHPやらPythonやらApache・・・をインストールしたくない事。
そして、OSの機能。たとえばファイアウォール等の設定がLinuxと違う事やディレクトリ名
このあたりは、DockerやVMなどで開発すれば問題ないですね

ので、Dockerを使う前提で考えます
WindowsでDockerを使うためには 2つの方法があります
1つは DockerToolsを使う方法で、VirtualBox上のLinuxからDockerを使う方法で、Macでもこの方法ですし
Linux上なので シェル問題も解決するので、何も問題ありません
これで満足する人は DockerToolsを使ってください。
共有ディレクトリやポートフォワードも VirtualBoxの設定で可能なので 何も問題なく使えます

Windows10 Pro 64bitの人は Docker for Windowsを使う事が出来ます
ホスト型のVirtualBoxで動かすよりも、ハイパーバイザーで動くHyper-Vのほうが
オーバーヘッドが少なくより快適になるのではないかと期待しています
ただし、色々と不便があり やっと快適に使う方法を手にしたので
少し環境構築が大変です
でも、最高の開発環境のために 頑張ります!

シェル問題

VirtualBoxを使う

LinuxをVMに入れるので何も問題ない
ただ、今回はより最高の環境のため Docer for Windowsを使うため、使用しない

Windows専用のバッチファイルを作る

コマンドプロンプトやPowerShellを使えば Bashと同等の事はおそらく可能であるが管理コストが増えるし
普段使うシェルもBashのほうが慣れているので、出来れば避けたいところ

Cygwinを使う

古典的な手法だが、Cygwinはいいぞ
ただし Dockerコンテナに入ろうとすると
cannot enable tty mode on non tty input
と怒られてしまうので Cygwinは使えない

Gitのbashやmingwを使う

mingwを使えば問題ないらしいぞ!
ただし、あくまでWindows上なため、シェルの設定等あまり出来ないだろうし
パッケージもインストールできない

Windows Subsystem for Linux(Bash on Ubuntu on Windows)

Windows内のLinuxを使う!!
これが最も最強っぽい響きがあるので あえてこれで挑戦します
(多分 mingw使うのが一番楽なんだけど・・)
シェルではなく Ubuntuなので aptで色々とインストールも出来たりします
カオス!
ただし 色々な問題があります

不具合

日本語対応が怪しかったりするので日本語パスとかやめましょう
コンソールに高確率でゴミが残ります
vimなどよく固まる。大きいファイル扱うと固まります
その他いろいろと 不具合あります

β機能なので 温かい心が必要です!

こっちもHyper-Vで動いているので Dockerにつながらない

大問題です(が解決できます)
Docker for Windowsは ホストOS(Windows10)のHyper-V上で動いていますが
Bash on Winowsも ホストOSのHyper-Vで動いているためか
bashでdockerコマンドうっても Bash on Windows上のdockerに接続にいきます
(そして Bash on WindowsのDockerは 対応してないのか落ちる)

という事で、 Bash on Winowsから ホストのDockerを叩けるように してみます!

インストール

Docker for Windowsのインストールと Bash on Windowsをインストール
この辺の手順は 色々なサイトであるので 書かない
また Docker for Windowsには docker-composeも入っているので素晴らしい!
Hyper-Vの有効化や BIOSの有効化も忘れずに

ドライブシェアの設定

SnapCrab_NoName_2017-11-10_2-23-34_No-00.png

私のPCはCドライブしかないけど、複数ドライブある時は、シェアするドライブを指定します
また、チェックしたときに Firewallがなんたら・・ と怒られる事がるので その場合は
Firewallで445ポートをオープンすればよい
ただし それだけではダメで 一度Windowsの ファイル共有サービスを削除してインストールすれば直るとのこと
https://qiita.com/shwld/items/7aad11ca53e2e5daad46

bashでdockerをうっても コマンドがない!
それは Bash on Windowsに dockerクライアントがインストールされてないからです

Bash on WindowsでDockerのインストール

Docker本家より

sudo apt-get install \
    apt-transport-https  ca-certificates curl \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update
sudo apt-get install docker-ce

こんな感じでインストールできます
ただし このままでは 起動しない Bash on WindowsのDockerをみにいくので
環境変数を設定し、ホストOSのDockerを見るようにします

ホストのDockerを見に行く設定

export DOCKER_HOST='tcp://0.0.0.0:2375'

これを .bashrc に追加しておけば大丈夫です

そして、ホストのDockerにて 2357ポートを許可する必要があります
(私はこの設定をしらず 3か月 コマンドプロンプトで Dockerを使う不便を味わった)

SnapCrab_NoName_2017-11-10_2-24-38_No-00.png

この Expose daemon on tcp://localhost:2375 without TLS
これをチェックする必要があります
もしかすると、TLSを使い dockerコマンド送る方法もあるのかもしれないけど、今回はそこは調べません

これで
$ docker hogehoge
で ホストOSのDockerを動かすことができます

docker-composeのバージョンアップ

$ docker-compose up

とすると、docker-composeのバージョンが古く、書式が通りませんでした・・・
docker-compose -v とすると version 1.3 でした
古い・・・

という事でバージョンアップします。
まずはホストOSですが、Dockerの公式より

https://docs.docker.com/compose/install/

のWindowsタブを見ます
ホストOSの PowerShellを管理者モードで起動し
ps1
Invoke-WebRequest "https://github.com/docker/compose/releases/download/1.17.0/docker-compose-Windows-x86_64.exe" -UseBasicParsing -OutFile $Env:ProgramFiles\docker\docker-compose.exe

のようにします。 今回は 1.17.0を取得

インストールが完了しても、Bash on WindowsのDocker-composeはバージョンが古いので、まだ怒られます

Bash on Windows上のdocker-compose バージョンアップ

上記URLの Linuxのところをみると
bash
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

と書いてますが 今回は pipで行おうと思います

http://docs.docker.jp/compose/install.html

https://bootstrap.pypa.io/get-pip.py
上記URLからダウンロードし get-pip.py という名前で保存し

$ sudo python get-pip.py
$ sudo pip install docker-compose

結論

bash on windowsから docker-compose up もちゃんと動いたし
bashも問題なく使える
ちょっと不具合はあるけど 今後解消されるのを待ちましょう

最強の開発環境完成です!!

パス問題

Bash on WindowsでDockerを使えて便利になったけど相対パスを指定すると不具合が出る
例えば docker-compose.ymlで volumesを相対パスで設定

    volumes:
      - .:/myapp

うまくマウントされない
原因は、Bash on Windowsだと Cドライブは Bashでは
/mnt/c/...  でも /c/... でもどちらでもアクセスできるのだが
WSLでは /c/... でアクセスする必要がある
が、設定ファイルにて相対パスを指定すると Cygwinパス /mnt/c/... になってしまうようで
うまくマウントできない

https://github.com/Microsoft/WSL/issues/1854

細かい事は調べてないんだけど とりあえず解決法として、今行っているのは
yaml
volumes:
- $PWD:/myapp

と、環境変数をつかい絶対パスにすることである