version 20.10.0以降(2021/02/02追記)
後述のissueのうち一つがリリースされたので記述が簡便になっています。
docker-compose.override.yaml
に以下を記載
version: "3.5" # docker-compose.yamlのバージョンと合わせる
services:
app: # host.docker.internalを使用したいサービス名
extra_hosts:
- "host.docker.internal:host-gateway"
version 20.10.0より古い場合
docker-compose.override.yaml
に以下を記載
version: "3.5" # docker-compose.yamlのバージョンと合わせる
services:
app: # host.docker.internalを使用したいサービス名
extra_hosts:
- "host.docker.internal:172.101.0.1" # 下のsubnetの指定に合わせる
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.101.0.0/16 # 他のnetworkと被らないように指定
firewall設定
firewallが動いている場合は、上記subnetからのアクセスを許可する必要があるかもしれません。
firewalldのコマンド例を記載しておきます。
sudo firewall-cmd --permanent --zone=trusted --add-source=172.101.0.0/16
host.docker.internal
docker for Mac, docker for Windowsでサポートされている、コンテナからホストのネットワークにアクセスするための特殊なドメイン。
macが開発者の主流になっているので、気軽にプロジェクトで使われ、その度にlinuxユーザーは悩みを抱える。
Support host.docker.internal DNS name to host
Support host.docker.internal in dockerd on Linux
[RFD] add configuration option to add host.docker.internal by default
これらのissueによって最終的にはlinuxでも host.docker.internal
が使えるようになる予定ですが、リリースされるまでまだ少し掛かりそうなのでWorkaroundを記載しておきます。
というより、作業内容としては上述の通りなので、解説を書きます。
docker-compose.override.yaml
このファイルはdocker-composeコマンドを実行した時に自動で読まれるので、レポジトリに含めたくない自分専用の設定などを書く際に重宝します。
ただし、-fオプションを使用する際は自動では読まれないので、その際にはこのファイルも一緒に指定する必要があります。
extra_hosts
コンテナの /etc/hosts
に内容を追記します。
networks
全てのコンテナは特に設定をしなければdefaultという名前のnetworkに属するので、defaultという名前のネットワークに設定を書けば全てのコンテナに自動で反映されます。
ここで設定しているのは、default networkのCIDRです。普通であればnetworkのCIDRは、既存のnetworkと被らないように自動で選ばれますが、今回は固定したいため手動で設定します。
dockerホストは全てのdocker networkに自動的に追加され、そのIPは「CIDRのLSBを1にしたもの」になるようです。(実際に試してそうっぽいと言うだけでドキュメントにそういう記載を見つけたわけではないので、もしかしたらそうならないケースもあるかもしれません。)
なので、このIPをextra_hostsに指定すればドメインを割り当てられるというわけです。