1. ホーム
  2. networking

[解決済み] ホストDNSサーバを使用したDocker-composeコンテナ

2022-03-07 22:32:26

質問

Ubuntu 16.10 Server" で、compose 2.9 (in a yml version 2.1) を使って、いくつかのコンテナをカスタムブリッジネットワークで動かしています。私のコンテナのほとんどは、内部で同じポートを使用しているため、"host"ネットワークドライバを使用する方法はありません。 私のコンテナはすべて一緒にリンクされており、専用の links 属性を使用します。

しかし、私は自分のコンテナの外で公開されているサービスにもアクセスする必要があります。これらのサービスは、私の会社のDNSサーバーに登録された名前で専用のURLを持っています。 パブリックDNSを使用して、コンテナ内からパブリックサービスにアクセスするのは問題ありませんが、プライベートDNSにアクセスすることはできません。

コンテナからプライベートDNSを使用するための実用的な解決策をご存知ですか?あるいはさらに良い方法は、ホストのネットワークDNSの設定を使用することでしょうか?

追記:もちろん、自分の会社のサービスへのリンクは extra_hosts 属性は、docker-compose.yml ファイルにある私のサービスの中にあります。しかし...それはDNSを持つことの目的とは決定的に違うのです。YMLファイルにすべてのサービスを登録する必要はありませんし、社内でサービスのIPが更新されるたびに更新するのも嫌です。

コンテキスト:

  • ホスト Ubuntu 16.10サーバー
  • Dockerエンジン: 1.12.6
  • Docker Compose: 1.9.0
  • docker-compose.yml。2.1
  • ネットワーク 独自のブリッジ。

docker-compose.ymlファイル(抜粋)。

version: '2.1'
  services:
    nexus:
    image: sonatype/nexus3:$NEXUS_VERSION
    container_name: nexus
    restart: always
    hostname: nexus.$URL
    ports:
      - "$NEXUS_81:8081"
      - "$NEXUS_443:8443"
    extra_hosts:
      - "repos.private.network:192.168.200.200"
    dns:
      - 192.168.3.7
      - 192.168.111.1
      - 192.168.10.5
      - 192.168.10.15
    volumes_from:
      - nexus-data
    networks:
      - pic

  networks:
    pic:
      driver: bridge
      ipam:
        driver: default
        config:
          - subnet: 172.18.0.0/16
            gateway: 172.18.0.1

の有無で試してみました。 ipam の設定は pic ネットワークに接続することができます。

テスト & 結果。 docker exec -ti nexus curl repos.private.network は、このサービスによって提供される HTML ページを適切に返します。

docker exec -ti nexus curl another-service.private.network 戻り値 curl: (6) Could not resolve host: another-service.private.network; Name or service not known 一方 curl another-service.private.network を送信すると、適切なHTMLページが返されます。

そして、"of course" another-service.private.network が4つのDNSサーバー(192.168.3.7, 192.168.111.1, 192.168.10.5, 192.168.10.15) で既知であることがわかりました。

解決方法を教えてください。

docker-compose を実行する環境が Mac、Windows、Unix などと指定されていないため、どのような変更が必要なのかに少し依存します。また、docker のデフォルトのブリッジネットワークと、ユーザーが作成したブリッジネットワークのどちらを使用しているかも指定されていません。

どちらの場合でも、デフォルトでは、DockerはDocker HostからコンテナにDNS解決をマッピングしようとするはずです。したがって、Docker HostがプライベートDNSアドレスを解決できる場合、理論的にはコンテナも解決できるはずです。

このDocker DNSの公式ドキュメントはかなり合理的なので、読むことをお勧めします。 これ は、デフォルトのDockerブリッジネットワークです。 こちら は、ユーザーが作成したブリッジネットワーク用です。

Docker for Mac、Docker Machine、またはDocker for Windowsを使用している場合、Docker Hostは実際にはあなたのマシン上で動作するVMであり、物理的なボックスそのものではないことに留意する必要があります。DNS解決への変更をコンテナに反映させるには、コンテナを再起動する必要があります。

もちろん、デフォルトの設定をすべてオーバーライドするには docker-compose . DNSサーバ、DNS検索オプションなどを明示的に設定するための完全なオプションがあります。例として

version: 2
services:
 application:
  dns:
   - 8.8.8.8
   - 4.4.4.4
   - 192.168.9.45

これらの機能に関するドキュメントはこちら ここで .