Dockerのポートを考える手間を削減したい!

背景

今所属している会社では複数の案件が並行することがよくあるので、その度に「このポート番号使ってなかったからこのポートを使おう」みたいなことを起こり、プロジェクトで「このポート何番で立ち上げてたっけ?」とよくなるのでIPアドレスから変えようと思いました。

概要

docker-compose.yml

version: "3"
services:
  web:
    image: "httpd:2.4"
    ports:
      - "${IP}:80:80"
    volumes:
      - "./public/:/usr/local/apache2/htdocs/"

.env

IP=127.0.0.2

/etc/hostsの説明

127.0.0.1   localhost         // デフォルトで127.0.0.1とlocalhostが紐づいている
255.255.255.255 broadcasthost // ???
::1             localhost     // IPv6でのループバックアドレス(この一つのみ) 

127.0.0.2 example.com

結果

Name                          Command               State                  Ports               
-----------------------------------------------------------------------------------------------------------
server_app_1          /scripts/run.sh                  Up      80/tcp, 9000/tcp                   
server_db_1           docker-entrypoint.sh mysqld      Up      127.0.0.2:3306->3306/tcp, 33060/tcp
server_phpmyadmin_1   /docker-entrypoint.sh apac ...   Up      127.0.0.2:1234->80/tcp             
server_web_1          nginx -g daemon off;             Up      127.0.0.2:80->80/tcp

発生した問題

🐛 ターミナルを開くと毎度パスワードを求められるようになった

  • /etc/sudoersにifconfigコマンドだけパスワードを求めないように設定して解決
  • ターミナルの起動が遅くなる

🐛 IPアドレスが異なるのにポートがかぶるとコンテナが立ち上がらなくなった

  • docker-compose.ymlにホストを指定せずにポートのみ指定すると、0.0.0.0とバインドされる
  • 127.0.0.10.0.0.0は意味が異なる
    • 127.0.0.1:ローカルループバックインターフェースのIPアドレス
    • 0.0.0.0:ローカルマシン上の全てのIPv4アドレス

🐛 Macで名前解決をすると遅くなる

  • /private/etc/hostsIPv4だけではなくて、IPv6の名前解決も記述すると早くなった

まとめ

複数人で行う際に、みんなMacだと127.0.0.1以外のIPアドレスを使用できる設定をしたり、sudoersを編集したりと色々大変なので、これからも使い続けるか検討中

参考

まだdocker-composeのホスト側portを考えるのに疲弊しているの? 〜IP指定してwell-known ports使い放題、同時に1677万案件回す〜 - 勉強日記