ブラウザからローカル開発環境にドメインでアクセスする

ブラウザからローカル開発環境のサーバーにドメインを指定してアクセスする場合は/etc/hostsに追記することで可能になる。

echo '127.0.0.1       example-app.test' | sudo tee -a /etc/hosts

ネイティブアプリからローカル開発環境にドメインでアクセスする

ネイティアプリからローカル開発環境のサーバーにドメインをしてアクセスする場合はサーバーを起動している端末をDNSサーバーにすることで可能になる。

Dockerでdnsmasqサービスを立ち上げ、ローカルの/etc/hostsからマッピングを生成することで実現する。ローカルのIPアドレスが変わるたびに再ビルドが必要になる。

> compose.yaml <<COMPOSE
services:
  dnsmasq:
    build:
      dockerfile_inline: |-
        FROM alpine:3.11
        ARG LOCAL_IP
        COPY hosts /root/hosts
        RUN apk --no-cache add dnsmasq && \\
            { \\
              echo "bogus-priv" ; \\
              echo "cache-size=0" ; \\
              echo "log-queries" ; \\
              echo "log-facility=/dev/stdout" ; \\
              echo "no-hosts" ; \\
              grep 127.0.0.1 /root/hosts | grep -v localhost | awk "{print \\"address=/\\"\\\$2\\"/\$\${LOCAL_IP}\\"}" ; \\
            } > /etc/dnsmasq.conf && \\
            { \\
              echo "#!/usr/bin/env sh" ; \\
              echo "grep address= /etc/dnsmasq.conf | awk -F'/' '{printf \\"%-16s %s\\\\n\\",\\\$3,\\\$2}'" ; \\
              echo "dnsmasq -k" ; \\
            } > /bin/docker-entrypoint.sh && \\
            chmod 755 /bin/docker-entrypoint.sh
        EXPOSE 53 53/udp
        ENTRYPOINT ["/bin/docker-entrypoint.sh"]
    platform: linux/x86_64
    environment:
      TZ: "Asia/Tokyo"
    ports:
      - "53:53/udp"
    cap_add:
      - NET_ADMIN
COMPOSE
cp /etc/hosts hosts
docker compose build --build-arg LOCAL_IP="$(ifconfig | grep 'inet ' | grep -v '127.0.0.1' | head -n 1 | awk '{print $2}' | sed -e 's/addr://')"
docker compose up