Docker Composeでhost.docker.internal:host-gatewayを設定する方法
問題の概要
Dockerバージョン20.10以降、--add-host=host.docker.internal:host-gateway
フラグを使用することで、Linux環境においてDockerコンテナ内からホストマシンへの直接接続が可能になりました。しかし、Docker Composeファイルで同等の設定を実現する方法について疑問が生じます。
基本的な解決策
Docker Composeでは、extra_hosts
パラメータを使用してホスト名の追加を行うことができます。
version: '3.9'
services:
postgres:
image: postgres:14.1-bullseye
environment:
POSTGRES_PASSWORD: ****
ports:
- "5433:5432"
extra_hosts:
- "host.docker.internal:host-gateway"
この設定により、コンテナ内から host.docker.internal
というホスト名でホストマシンにアクセスできるようになります。
確認方法
設定が正しく機能しているか確認するには、以下のコマンドを実行します:
docker-compose up -d
docker-compose exec postgres bash
コンテナ内で:
apt update && apt -y install netcat
nc -vz host.docker.internal 80
重要な注意点
ネットワークゲートウェイの違い
Docker Composeを使用する場合、自動的に作成されるネットワークのゲートウェイアドレスはデフォルトの 172.17.0.1
とは異なる場合があります(例:172.22.0.1
)。これにより、ホストマシンのサービスが特定のIPアドレスからの接続のみを許可している場合、接続問題が発生する可能性があります。
推奨される解決策
方法1: カスタムネットワークの定義
IPアドレスを明示的に制御するために、カスタムネットワークを定義することをお勧めします。
version: '3.9'
networks:
network1:
name: my-network
attachable: true
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
ip_range: 172.18.5.0/24
gateway: 172.18.0.1
services:
postgres:
image: postgres:14.1-bullseye
environment:
POSTGRES_PASSWORD: ****
ports:
- "5433:5432"
networks:
- network1
CIDR表記について
IP範囲を定義する際は、オンラインCIDR計算ツールを活用すると便利です。
方法2: デフォルトブリッジネットワークの使用
既存のデフォルトブリッジネットワークに接続する方法もあります。
version: '3.9'
services:
postgres:
image: postgres:14.1-bullseye
environment:
POSTGRES_PASSWORD: ****
ports:
- "5433:5432"
network_mode: bridge
extra_hosts:
- "host.docker.internal:host-gateway"
セキュリティ注意点
デフォルトブリッジネットワークを使用すると、コンテナが同一ネットワーク上の他のすべてのコンテナと通信可能になります。分離が必要な場合は、カスタムネットワークの使用を推奨します。
トラブルシューティング
ネットワーク関連のエラーが発生した場合:
sudo service docker restart
場合によっては、コンピュータの再起動が必要なこともあります。
参考資料
この記事の内容は以下の環境で検証されています:
- Ubuntu: 18.04.6 LTS
- Kernel: 5.4.0-94-generic
- Docker: 20.10.12
- Docker Compose: 1.27.4