Windows で開発環境を構築する

Windows で開発環境を構築する

Mac から Windows に乗り換えた件は前回書きました。今回は、Windows 上での開発環境構築について書いていきます。

やりたいこと

web、スマホアプリの開発が主です。(それ以外の開発もありますが、今回は軽く触れるだけにするか、全く触れません。)

Mac で動かしていた、主に、以下のようなものが Windows で動くと良いです。

  • 実行環境
    • Docker, docker-compose を使った、コンテナ内の環境
    • Vagrant と Ansible を使った、Vagrant box 内の Linux 環境
    • (コンテナや仮想マシンではなく)直接実行
      • Node.js
      • sbt
  • コード書いたり
    • JetBrains のツール類
    • Emacs
  • ツール類
    • Git
    • ssh
    • Ansible
    • Terraform

Windows Subsystem for Linux は神

Windows 上で開発を行うに当たって、Windows Subsystem for Linux (以下 WSL)を使わないというのは考えられません。WSL 上では、Linux 系の大抵のツールが動きます。

なので、何はともあれこれをインストールしましょう。

ちなみに、WSL 2 が現在 Windows Insider Preview 版で使えるようになっていて、来年には正式版でも使えるようになると思います。

WSL の仕組み、WSL 1 と 2 の違いは、本題ではありませんので、ここでは扱いません。

インストール方法は非常に簡単

WSL 1 のインストール方法は、ドキュメントに従うだけで難しいところはありませんが、一応書いておきます。

PowerShell を管理者として実行して、以下のコマンドを入力します。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

後は、Microsoft Store で好みのディストリビューションをインストールするだけです。詳しくない人は Ubuntu 18.04 にしておくのが無難です。

WSL でできること

上の「やりたいこと」に書いたうちの半分くらいはできてしまいます。具体的には、以下は WSL 内で、通常の Linux と同じように実行できてしまいます。

  • 実行環境
    • (コンテナや仮想マシンではなく)直接実行
      • Node.js
      • sbt
  • ツール類
    • Git
    • ssh
    • Ansible
    • Terraform

Windows Terminal とかも入れておく

このように便利な WSL なので、実務では当然複数起動することになります。従って、タブ型のターミナルソフトを入れておくと良いです。Mac の iTerm2 みたいなのです。

探せばもっといいのはありそうですが、とりあえず Windows Terminal というものを入れました。機能はいまいちですが、最低限の仕事はしてくれます。

Get Windows Terminal (Preview) – Microsoft Store

Docker 関連

Windows 10 Pro 64bit 4GB メモリが必須

セットアップを始めるまで気づかなかったんですが、Docker Desktop を動かすには Hyper-V などが有効になっている必要があります。詳細な要件は、以下のドキュメントを参照して下さい。

Install Docker Desktop on Windows | Docker Documentation

Windows 10 Home でも、昔の Docker Toolbox を使うって方法もあるようですが、面倒そうなので、今回はその方法は使いません。

私の PC も Windows 10 Home だったので、Pro を購入しました。64bit, 4GBメモリなどの要件はクリアしているため問題ありませんでした。

Windows ネイティブ環境 or WSL

Windows で Docker 関連を動かす場合、普通の Windows ネイティブ環境で動かすことも出来ますが、今回は WSL からも使えるようにします。他の Linux 系ツール類を WSL 内で動かすことが多そうなので、WSL 内で作業が完結する方が便利というのが理由です。

Docker を WSL で動かすためのセットアップ方法

Docker を WSL で動かす方法は以下のサイトに詳しくまとまっていて、基本的にはその通りにやれば良いだけです。

Setting Up Docker for Windows and WSL to Work Flawlessly — Nick Janetakis

それだけだとあんまりなので、簡単に手順をまとめておきます。

  1. Docker for Windows を普通に Windows 上でインストールする
  2. Docker for Windows の設定で “Expose daemon on tcp://localhost:2375 without TLS” にチェックを入れる
  3. WSL 内で Docker と Docker compose をインストールする
  4. WSL 内の Docker が、Docker for Windows の Docker daemon につなぎにいくように環境変数を設定する
    • export DOCKER_HOST=tcp://localhost:2375
  5. WSL が Windows のドライブをマウントする場所を /mnt ではなく / に変更する(Cドライブは /mnt/c ではなく /c にマウントされる)
  6. 環境によってはここまでで動かない場合がある(というか多そうな)ので、その他、細かい作業をいくつか

他の方法

ネットで “Docker WSL” で検索するといろいろなページが見つかると思いますが、Docker を WSL で動かすにはいくつか方法があるようです。以下のような方は、本ページではなく他サイトのページを参考にしてください。

  • Windows 10 Home を使っている(Docker for Windows がインストールできない)
  • 何らかの理由で、VM 上で Docker を動かしたい
  • WSL2 を使っている

トラブルシューティング

ファイアウォールに阻まれる

ファイアウォールが悪さをしている場合に、以下のようなメッセージがでます。

Docker – Error: A firewall is blocking file sharing between Windows and the containers

Windows ファイアウォールや、セキュリティソフトのファイアウォールの設定を以下のように変更して下さい。

  • 以下のポートを開ける
    • UDP 137 と 138
    • TCP 139 と 445
  • 接続元は 10.0.75.1 と 10.0.75.2

ネットワークプロファイルの制限

Windows のネットワークが「パブリック」になっていると、いろいろな制限があります。Docker のネットワーク・インターフェースを「プライベート」へ変更すると解決します。

変更するには、管理者権限で立ち上げた PowerShell で以下のコマンドを実行します。

Set-NetConnectionProfile -interfacealias "vEthernet (DockerNAT)" -NetworkCategory Private

以下の StackOverflow のスレッドを参考にしました。

Settings to Windows Firewall to allow Docker for Windows to share drive – Stack Overflow

一度はうまくいった共有ドライブ設定が動かなくなった

マシンを再起動した後とかに、上の方で設定した共有ドライブの設定がうまく動かなくなっている場合があります。その場合は、Docker Desktop の共有ドライブの設定のところで「Reset Credentials」をクリックするとうまくいく場合があります。以下の SO のスレッドを参考にしました。

docker – Are you trying to mount a directory onto a file (or vice-versa)? – Stack Overflow

Vagrant を使うのは面倒

Docker が動くようになったので、次に Vagrant について書きます。結論から先に書くと、いろいろ面倒なので、Vagrant を使う場合は以前の MBP を使おうかなと思っています。

Hyper-V と VirtualBox の併用は出来ない

開発者が Mac の場合、Vagrant + VirtualBox で作った開発環境は結構多いかと思います。Windows で同じようなことをやろうとした場合に、 Hyper-V と VirtualBox の併用は出来ないため、 結論から言うと、 以下のどちらかのやり方をとるしかありません。

  • Hyper-V を無効にして、Vagrant + VirtualBox を使う
    • Docker が使えない
  • Vagrant の Hyper-V provider を使う

前者は機能的には問題ないものの、デメリットとしては、Hyper-V の有効化・無効化のためには PC を再起動する必要があるということです。つまり、Docker と VirtualBox は両方同時に起動することが出来ません。

例えば、プロジェクトAでは Docker で開発環境を作っており、プロジェクトBでは Vagrant で開発環境を作っているというときに、2つの開発環境を同時に動かすことが出来ません。

後者の制限事項は、以下の Vagrant のドキュメントに記載されています。

Limitations – Hyper-V Provider – Vagrant by HashiCorp

また、後者のそれ以外のデメリットとして、Hyper-V provider に対応していない Vagrant box があるということも挙げておきます。

WSL での Vagrant の使い方

WSL 上で Vagrant を使う手順を簡単にまとめておきます。

  1. Windows 上で VirtualBox をインストールする
  2. WSL 上に Vagrant をインストールする
  3. WSL 上で環境変数を設定する
    • export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
    • export PATH="$PATH:/c/Program Files/Oracle/VirtualBox"
  4. Hyper-V を無効にする

制限事項

NFS が使えない

Windows では NFS がサポートされていません。上の手順のように Vagrant を WSL 内で使う場合も、Windows ネイティブ環境で Vagrant を使う場合でも、いずれの場合も Vagrant のファイル共有に NFS が使えません。使おうとすると以下のエラーが出ます。

Bringing machine 'default' up with 'virtualbox' provider...
It appears your machine doesn't support NFS, or there is not an
adapter to enable NFS on this machine for Vagrant. Please verify
that `nfsd` is installed on your machine, and try again. If you're
on Windows, NFS isn't supported. If the problem persists, please
contact Vagrant support.

Hyper-V プロバイダに対応してない Vagrant box がある

HashiCorp が提供している Vagrant box は、VirtualBox, Hyper-V の両方に対応していると思いますが、他のベンダーなどが提供しているものだと VirtualBox にしか対応していないものがあります。その場合、以下のようなエラーが出ます。

vagrant up --provider=hyperv
Bringing machine 'default' up with 'hyperv' provider...
==> default: Verifying Hyper-V is enabled...
==> default: Verifying Hyper-V is accessible...
==> default: Box 'bento/centos-6.7' could not be found. Attempting to find and install...
    default: Box Provider: hyperv
    default: Box Version: >= 0
==> default: Loading metadata for box 'bento/centos-6.7'
    default: URL: https://vagrantcloud.com/bento/centos-6.7
The box you're attempting to add doesn't support the provider
you requested. Please find an alternate box or use an alternate
provider. Double-check your requested provider to verify you didn't
simply misspell it.

If you're adding a box from HashiCorp's Vagrant Cloud, make sure the box is
released.

Name: bento/centos-6.7
Address: https://vagrantcloud.com/bento/centos-6.7
Requested provider: [:hyperv]

個人的な結論としては、Vagrant の環境が必要な時は MBP を使うようにした

さすがに、いろいろ制約がありすぎなので、個人的には Vagrant が必要なプロジェクトは引き続き Mac で開発を進めようと思います。

その他、開発環境

JetBrains 製ツールは Windows で問題なし

IntelliJ などは、Windows でも全く問題なく動きます。

プロジェクトのファイルは Windows の通常のファイルシステム内に配置して、それを WSL からアクセスすることで、WSL 環境と問題なく併用できます。

WSL から Windows のファイルシステムにアクセスするには、デフォルトだと /mnt/ドライブ名 ですが、上の方で書いたとおり Docker のセットアップの際に設定変更したので、/ドライブ名 でアクセスします。

Emacs

古参ユーザーであれば、テキストエディタとして Emacs を使うかと思います。

Windows ユーザーは以下から取得できます。私の場合は、MinGW64 + MSYS2 を入れて、その上で emacs をインストールしました。詳しくは以下のページを参照してください。

GNU Emacs download – GNU Project

設定に関しては別エントリーにしようと思いますが、Mac の時と比べて、フォントの設定を少し変えたくらいです。

フォント

Emacs のところを書いていて思い出したのですが、(私はあまりこだわらないのですが、)プログラマー向けに見やすいフォントがいろいろあるようなので、それをインストールしました。

まとめ

(かなり長くなって疲れました。)

正直、Mac の方が開発環境構築は楽だなと思いました。ただ、Windows マシンの方が比較的安いですし、セットアップにいろいろな知識が求められるので、勉強になるような気がします。

今回は触れていませんが、WSL2 は WSL1 と仕組みが大きく違うので、WSL2 が普通のユーザーにも使えるようになったら、新たに記事にしようと思います。

we are hiring

優秀な技術者と一緒に、好きな場所で働きませんか

株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。

現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。