dockerのコンテナを複数、同じポートを使って立ち上げたい

2022.04.26.火
Docker

お久しぶりです、石原です。
開発用の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なるものを使えばローカルループバックアドレスを追加設定できるようです。

詳しいやり方


こんな感じのフォルダ構造を想定して説明します。


PCのローカルループバックアドレスを追加設定する


ローカルループバックアドレス(Local Loopback Address)は、自分自身を常に指す特殊なIPアドレスです。
MacのPCのデフォルトでは127.0.0.1しか設定されていませんが、 ifconfigコマンドで追加することができます。


このコマンドはPCの起動のたびにリセットされるので、必要な際に毎回実行してください。

Tips 自動化したい時は

ifconfigは管理者権限が必要なコマンドですが、設定次第ではログイン時に自動でローカルループバックアドレスを設定することも可能です。
例えば、bashを使っているなら~/.bash_profileに、zshの場合は~/.zprofileに以下を設定することで、一切の手動入力なしで実行できます。


この方法では、パスワードをechoすることで、パイプラインを通してsudoコマンドに標準入力で渡しています。
これだとパスワードがスクリプト内に直接書き込まないといけないので、使うかどうかはセキュリティレベルによってご判断ください。セキュリティと便利さの妥協点を考えると、ifconfigシェルスクリプトを作成し、パスワードはreadか引数の指定を使って入力するのがおすすめです。

仮想環境ごとに使用するローカルループバックアドレスを変える


それぞれの.envに個別のローカルループバックアドレスを設定します。


 

同じポートを複数のdockerから使えるようにするため、yamlファイルのポート指定箇所にもローカルループバックアドレスを設定します。ポートは複数指定も可能です。


この設定により、それぞれのコンテナが設定したローカルループバックアドレスのポートを使うようになります。


 

それぞれのローカルループバックアドレスに対してホスト名を設定する


VirtualHostサーバに接続するために、/etc/hostsにIPアドレスとURLの組み合わせを登録します。


 

完成!


これで、www.example.com用とwww.example.org用にそれぞれdockerコンテナを起動しつつ、どちらも80番・443番ポートからアクセスできるようになります。ポートの被りを気にすることなく、使いたい時に起動したいコンテナを起動してください。

石原加奈子

石原加奈子

2019年入社、開発部所属。 主にWebFileの開発に携わっています。 自由時間にjavascriptやshellscript,、PHPなんかを使って効率化ツールを作るのが好きです。