Skip to content

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 パラメータを使用してホスト名の追加を行うことができます。

yaml
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 というホスト名でホストマシンにアクセスできるようになります。

確認方法

設定が正しく機能しているか確認するには、以下のコマンドを実行します:

bash
docker-compose up -d
docker-compose exec postgres bash

コンテナ内で:

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アドレスを明示的に制御するために、カスタムネットワークを定義することをお勧めします。

yaml
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: デフォルトブリッジネットワークの使用

既存のデフォルトブリッジネットワークに接続する方法もあります。

yaml
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"

セキュリティ注意点

デフォルトブリッジネットワークを使用すると、コンテナが同一ネットワーク上の他のすべてのコンテナと通信可能になります。分離が必要な場合は、カスタムネットワークの使用を推奨します。

トラブルシューティング

ネットワーク関連のエラーが発生した場合:

bash
sudo service docker restart

場合によっては、コンピュータの再起動が必要なこともあります。

参考資料

この記事の内容は以下の環境で検証されています:

  • Ubuntu: 18.04.6 LTS
  • Kernel: 5.4.0-94-generic
  • Docker: 20.10.12
  • Docker Compose: 1.27.4