お久しぶりです、石原です。
開発用のPCをarm版Macに変えたので、開発時にはdockerを使用しています。
さて、平常時はコンテナ一つを動かして開発していけば十分なのですが、時には旧版と新版の環境で動作が同じか確認したくなるケースがあります。
もし両方のバージョンで使っている各種モジュールのバージョンや設定値が同じなら、一つの仮想環境内でVirtualHostの設定をすれば十分です。ところが、たまーに複数の環境を同時起動して使いたくなることがあります。例えば、PHP5.xからPHP7.xにバージョンアップして同じ動きをしているか確認したい時とかですね。
こういう時、どの環境も単純な設定で8080ポートを使っていたりすると、ポートが使用中のため二つ目以降のコンテナの起動に失敗します。仮想環境ごとに接続先のポート番号を変えてもいいのですが、その設定をどこかにメモしておいて毎回参照するのもなかなか手間です。組み合わせを丸暗記できればいいんでしょうが、あいにくそこまで記憶力に自信はありません。
というわけで、dockerのコンテナを複数起動できるようにしつつ、ポート番号は全部揃えるということに挑戦してみました。
結果はこのとおり、docker上の3つの仮想環境を、全部80と443のポートが使える状態で起動できるようになりました!
やったこと
流れとしては概ね以下です。
- ローカルループバックアドレスを追加設定する
- 仮想環境ごとに使用するローカルループバックアドレスを変える
- /etc/hostsでそれぞれのローカルループバックアドレスに対してホスト名を設定する
なお、以下は全てMac OS用の記述のため、Windowsでは使えない可能性が高いです。ご了承ください。
軽く調べた範囲では、Windowsではifconfigコマンドが使えませんが、Microsoft loopback adapterなるものを使えばローカルループバックアドレスを追加設定できるようです。
詳しいやり方
こんな感じのフォルダ構造を想定して説明します。
1 2 3 4 5 6 7 |
dockers/ ├ app_com/ │ ├.env │ └docker-compose.yml └ app_org/ ├.env └docker-compose.yml |
PCのローカルループバックアドレスを追加設定する
ローカルループバックアドレス(Local Loopback Address)は、自分自身を常に指す特殊なIPアドレスです。
MacのPCのデフォルトでは127.0.0.1しか設定されていませんが、 ifconfigコマンドで追加することができます。
1 2 |
sudo ifconfig lo0 alias 127.0.1.1 sudo ifconfig lo0 alias 127.0.1.2 |
このコマンドはPCの起動のたびにリセットされるので、必要な際に毎回実行してください。
Tips 自動化したい時は
ifconfigは管理者権限が必要なコマンドですが、設定次第ではログイン時に自動でローカルループバックアドレスを設定することも可能です。
例えば、bashを使っているなら~/.bash_profileに、zshの場合は~/.zprofileに以下を設定することで、一切の手動入力なしで実行できます。
1 2 3 |
PASSWORD="password" echo $PASSWORD | sudo -S ifconfig lo0 alias 127.0.1.1 #app.com用 echo $PASSWORD | sudo -S sudo ifconfig lo0 alias 127.0.1.2 #app.org用 |
この方法では、パスワードをechoすることで、パイプラインを通してsudoコマンドに標準入力で渡しています。
これだとパスワードがスクリプト内に直接書き込まないといけないので、使うかどうかはセキュリティレベルによってご判断ください。セキュリティと便利さの妥協点を考えると、ifconfigシェルスクリプトを作成し、パスワードはreadか引数の指定を使って入力するのがおすすめです。
仮想環境ごとに使用するローカルループバックアドレスを変える
それぞれの.envに個別のローカルループバックアドレスを設定します。
1 |
IP=127.0.1.1 |
1 |
IP=127.0.1.2 |
同じポートを複数のdockerから使えるようにするため、yamlファイルのポート指定箇所にもローカルループバックアドレスを設定します。ポートは複数指定も可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: "3" services: webapp: image: app/com privileged: true command: /sbin/init build: context: ./db dockerfile: Dockerfile volumes: - app-data:/var/www/app ports: - "${IP}:80:80" - "${IP}:443:443" volumes: app-data: |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: "3" services: webapp: image: app/org privileged: true command: /sbin/init build: context: ./db dockerfile: Dockerfile volumes: - app-data:/var/www/app ports: - "${IP}:80:80" - "${IP}:443:443" volumes: app-data: |
この設定により、それぞれのコンテナが設定したローカルループバックアドレスのポートを使うようになります。
それぞれのローカルループバックアドレスに対してホスト名を設定する
VirtualHostサーバに接続するために、/etc/hostsにIPアドレスとURLの組み合わせを登録します。
1 2 |
127.0.1.1 www.example.com 127.0.1.2 www.example.org |
完成!
これで、www.example.com用とwww.example.org用にそれぞれdockerコンテナを起動しつつ、どちらも80番・443番ポートからアクセスできるようになります。ポートの被りを気にすることなく、使いたい時に起動したいコンテナを起動してください。