LoginSignup
7
10

More than 5 years have passed since last update.

【Docker×Windows】Hyper-Vが使えないならVagrantを使えば良いじゃない

Last updated at Posted at 2017-03-18

はじめに

 私物の開発PCにおいて、Windows10のHyper-VとDockerを使ってPHPの開発環境を作ろうと、ずっと下記のようなことをやってきました。
Docker for Windowsでローカル開発環境(LAMP)を作るのにどハマリしたので備忘録。 - Qiita
DockerでXDebug使ってPHPデバッグする際はremote_connect_backが使えない - Qiita

 私物の開発PCはこれで安定稼働したものの、今度は会社の業務PCを新調することになり、またWindowsのDocker環境を作ることとなりました。

 私物PCはWindows10 Professionalだったので、Hyper-Vを活用したDocker for Windowsが使えましたが、新調した業務PCはWindows10 Home。
つまりは、Hyper-Vが使えない=Docker for Windowsが使えない。
※Docker for Windowsは動作環境としてHyper-Vを要求します。

DockerToolboxとBoot2Dockerがあるから問題ないやろと思っていたら予想以上にハマったので、自分用の備忘録として残しておきます。

とりあえず結論

 Hyper-Vが使えないならVagrantを使えば良いじゃない

なぜ上記結論に至ったか

  • infoレベルとはいえdockerコマンドを打つ度にエラーが出る
  • Gitbash(+ConEmu)からdockerコマンドが打てない
    ・いちいちDocker Quickstart Terminalを使うか、KitematicからPowerShellを呼ばないと使えない
    ・ついでに言えばQuickstart Terminalは全然Quickstartじゃない
  • ボリューム共有が利かない

この3点が決め手となり、上記結論に至りました。

検証環境

今回新調した業務PC(当初)

  • Windows10 Home
  • Docker Toolbox + Boot2Docker
  • Virtualbox
  • Gitbash MINGW64 + ConEmu

今回新調した業務PC(最終的に落ち着いた環境)

  • Windows10 Home
  • Docker(CentOS)
  • Virtualbox + Vagrant + bento/centos-7.3
  • Gitbash MINGW64 + ConEmu

参考:現状安定稼働している私物PC

  • Windows10 Professional
  • Docker for Windows
  • Hyper-V
  • Gitbash MINGW64 + ConEmu

infoレベルとはいえdockerコマンドを打つ度にエラーが出る

Docker_Quickstart_Terminal
$ docker ps
time="2017-03-18T18:41:38+09:00" level=info msg="Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows

level=infoなので無視しても良いのですが、毎回出るのは地味にイヤ。
これを書いている3/18時点で現在進行系のバグ?らしいので解決を待つしかないようです。
https://github.com/docker/docker/pull/31705

Gitbash(+ConEmu)からdockerコマンドが打てない

MINGW64
$ docker ps
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.26/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.

GitbashのMINGW64をConEmu経由で使用して、docker psを実行した結果がこれ。
Docker Quickstart Terminalから呼ばれるのもGitbashのMINGW64。
ここに何の違いがあるというのだ!

もっとも、dockerが実際に動いている環境はWindowsネイティブではなく、Virtualboxで動いているLinuxのVM上なので、その違いはあるかもしれません。
とはいえ、Quickstart Terminalで呼ばれるGitbashも普通にローカルの操作が出来るので、果たして何が違うのだろう、というのが疑問なのですが。。

ボリューム共有が利かない

私物PCで使ってたのと同じ記述をdocker-compose.yml(+Dockerfile)に記載して実行。

docker-compose.yml
version: '2'
services:
  testapp:
    container_name: testapp
    build: .
    expose:
      - '9000'
      - '587'
      - '25'
    ports:
      - '8000:80'
    volumes:
      - ../:/var/www/html
    privileged: true
    command: /sbin/init
Dockerfile
FROM docker.io/centos:6.8
RUN yum -y update
RUN yum -y install httpd
RUN yum -y install postfix
RUN yum -y install php
CMD chkconfig httpd on
CMD service httpd start
CMD chkconfig postfix on
CMD chkconfig postfix start

ボリューム共有もちゃんと記載してます。
満を持してdocker-compose buildからのdocker-compose up -d

docker execして、/var/www/htmlを見るとファイルが・・・えっ、無い。

挙句Kitematicからは書き込めないだの、コンフリクトしただの言われたので、ここでついにブチ切れました。

Vagrantを使えば良いじゃない

 というわけでサクッとVagrantに移行。
boxには「bento/centos-7.3」を使用して、vagrant up→vagrant ssh。

$ sudo su // vagrant→root

// docker-ioのインストール
# yum -y install docker-io
# systemctl enable docker
# systemctl start docker

// 公式マニュアルに従ってdocker-composeの導入
// cf. http://docs.docker.jp/compose/install.html
# curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

// 試してみる
# docker-compose --version
bash: docker-compose: command not found

docker-composeにパスを通す

docker-composeにパスが通っていない ので、パスを通します。

# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

usr/local/binにパスが通っていないのが原因なので、ここにパスを通します。

# cd ~
# pwd
/root
# vi .bash_profile

rootユーザーのホームディレクトリの.bash_profileを編集します。

PATH=$PATH:$HOME/bin

となっている行を

PATH=$PATH:$HOME/bin:/usr/local/bin

と書き換えて保存。そして、

source .bash_profile

として、.bash_profileの変更を即時反映しちゃいます。

# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/bin
# docker-compose --version
docker-compose version 1.11.2, build dfed245

これで無事にパスも通り、Vagrant上でdocker-composeが使えるようになりました。
あとは普通に使うだけ。

おまけ

・Dockerコンテナ上ではHTMLファイルの類を/var/www/htmlに置いてやる必要がありますが、ボリューム共有をするのであれば、 DockerホストのCentOS上ではどこでも良かったりします。
(極端な話、CentOS上の/vagrantから/var/www/htmlでも可)

・ホストOSは Apacheやnginxすら不要 だったりします。ホストOSの80番ポートに用は無いので。

あとがき

 WindowsでDocker使うなら、実はHyper-Vで動くDocker for Windowsを使うのが楽なんじゃないかと思いました。結局のところ、一度vagrant upした上で更にsshで入らないと行けない、という手間が入るので。。
おまけにこのパターンではKitematicが使えない。
…まぁこれはさすがにコマンド慣れたので別にそんなに困りゃしないのですが。

 ちなみに同僚さんはMacなのですが、そちらは普通に動きました。

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10