Docker for MacでNameVirtualHostを使った開発環境を楽に作る方法


Apache1台でNameVirtualHostでローカルドメインで振り分けるタイプのプロジェクトが多々ありますが、Hostファイルの書き換えに使っていたHosterがMojaveアップデート後いよいよ使えなくなりました。

目的

  • /etc/hostsの書き換えはやりたくない
  • できればワイルドカードで指定したい(*.testなど)

まとめ

  • hostsファイル書き換えからの乗り換えであれば、ローカル用のDNSを導入する
  • Webのみで良ければnginx-proxyを使う

パターン1 ローカル環境のDNSサーバーを使う

DNSサーバーをローカルに作ります。dnsmasqが軽量で入れやすいのでこちらを使います。

※ 最初.devを設定していましたが、devドメインはChrome環境でhttpsにリダイレクトする仕様になっているので、.testドメインに変更しました。

dnsmasqのインストール

brew経由でdnsmasqをインストールします。

$ brew install dnsmasq

dnsmasqの自動起動設定を行います。

$ sudo brew services start dnsmasq

*.testを -> 127.0.0.1 に向ける設定

$ echo 'address=/.test/127.0.0.1' > /usr/local/etc/dnsmasq.conf

*.testのネームサーバーをdnsmasqに指定

$ sudo mkdir -v /etc/resolver
$ echo "nameserver 127.0.0.1" | sudo tee -a /etc/resolver/test

試してみる

$ ping hogehoge.test 
$ ping fugafgua.test

表示だけならばapache側のNameVirtualHostで振り分けるだけで完了します。

nginx-proxyを使う

webさえなんとかなるのであればnginx-proxyのリバースプロキシを利用するのが最も簡単です。

docker-compose経由で簡単に導入できます。

nginx-proxy:
  image: jwilder/nginx-proxy
  ports:
    - 80:80
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro

web1:
  environment:
    VIRTUAL_HOST: "web1.localhost, web3,localhost"

web2:
  environment:
    VIRTUAL_HOST: "web2.localhost"

enviroment.VIRTUAL_HOSTで割り当てるホスト名を指定します。

複数の指定やワイルドカードの指定も可能です。

上記設定の場合は次のような設定となります。

NameVirtualHostも不要となるため、webのみで良ければこちらが良いです。

pingなど、名前解決が必要となる場合はdnsmasqを利用しましょう。

$ ping web1.localhost