web-dev-qa-db-ja.com

ホストDNSサーバーを使用するDocker構成コンテナー

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

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

コンテナからプライベートDNSを使用する実用的なソリューションを知っていますか?それとも、ホストのネットワークDNS構成を使用しますか?

PS:もちろん、私のdocker-compose.ymlファイルのサービスの_extra_hosts_属性を使用して、会社のサービスにリンクできます。しかし... ...それは間違いなく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ページを返します。

そして、「もちろん」_another-service.private.network_は4つのDNSサーバー(192.168.3.7、192.168.111.1、192.168.10.5、192.168.10.15)で知られています。

14
Olivier

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

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

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

ちょっとした落とし穴は、Docker Mac、Docker Machine、またはDocker for Windowsを使用して実行している場合、Dockerホストは実際には物理的なボックスではなく、マシンで実行されているVMそのため、VMに正しいDNS解決オプションが設定されていることを確認する必要があります。DNS解決の変更を取得するには、コンテナを再起動する必要があります。

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

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

これらの機能に関するドキュメントがあります こちら

19
Rob Blake