複雑な場合のDockerコンテナーからのドメイン名解決

DNSに関連する質問で、私はDocker krovushkiを徹底的に飲みました。なぜなら、大切な数字を書くように求められる場所が非常に多く、本当に見上げているからです。

そのため、タスク: example.appのようなドメインにぶら下がっているいくつかのWebプロジェクトを同時に処理するには、開発者の環境を上げる必要があります。 同時に、これらのドメインは、コンテナ、ホスト、 Genymotionエミュレータなどからアクセスできる必要があります。 さらに、コンテナから外部インターネットを利用できるようにする必要があります。 これはすべて、社内DNSサーバーを備えた企業イントラネットによってさらに悪化します。

これを解決するには、次のものが必要です。

  1. ドッカー -コンテナエンジン
  2. docker-compose-マルチコンテナソリューションでの作業
  3. dnsmasq-軽量DNS(およびDHCPおよびTFTP)サーバー
  4. laradock (オプション)-開発者向けの既製のマルチコンテナソリューション

明らかなように、1〜3段落のインストールはスキップします。 docker-compose バージョンに注意してください。 バージョン1.8以降が必要です(執筆時点では、古いバージョンはリポジトリにありました)。

経験豊富なドック Docker ワーカーが必要なイメージを選択し、それらをリンクし、ポートを転送し、追加のライブラリをインストールするのに問題はありません-このトピックに関する十分な情報があります。 しかし、すぐに作業を開始したい場合は、集合意識の製品-laradockを使用しましょう。

名前laradockから、Laravel + Dockerの弓のヒントを識別できます。 そして、当初はそうでしたが、現時点では、このオリエンテーションはなくなっており、プロジェクトはあらゆるWebアプリケーションに焦点を当てています。

laradockはymlファイルであり、 docker docker-compose一連の付随する設定済みイメージです。これにより、nginx、mysql、mongoDB、およびMemcached、Aerospikeなどのさまざまなグッズを含むコンテナのセットをデプロイできます。 (現在、このセットは非常に広く、常に拡大しています)。
また、いくつかの追加のプラグインまたはライブラリのインストールが、ymlファイルの簡単な編集に帰着することも重要です。次に例を示します。

 - INSTALL_XDEBUG=true 

そして、イメージを再構築します。

 docker-compose build php-fpm 

さらに、laradockにはすべてのプロジェクトを好きなだけ配置する準備ができています./nginx/sites構成例に注意して./nginx/sites

laradockは、ポート80をnginx / apacheコンテナからホストマシンに転送するため、必要なコンテナを持ち上げた後(自分でセットを選択します)

 docker-compose up -d nginx mysql phpmyadmin 

nginx / apacheで事前に設定されたexample.appおよびmysite.appサイトを表示するには、それらのローカルIPを/ etc / hostsファイルに登録するだけです

 127.0.0.1 example.app 127.0.0.1 mysite.app 

phpmyadminコンテナーはポート8080に自身をスローするため、 http://localhost:8080で作業中に確認できます。 さて、マッスルを持つコンテナは、接続する必要があるmysqlホスト上の他のすべてのコンテナで機能することに注意してください。

実際、独立したプロジェクトがあり、企業イントラネットがない場合は、この場所で中断して、すでに開発を開始できます。 DNSの問題は関係ありません。

さらに読む場合は、おそらく次のものが必要です。

  1. アプリケーションから、別のドメイン上の独自の個別のバックエンドにアクセスします。
  2. Androidエミュレーター(iOSなど)で実行されているアプリケーションから、バックエンドにアクセスします。
  3. アプリケーションからサードパーティAPIを使用しますが、ローカルDNSサーバーを備えたイントラネットに座っています。

したがって、ポイント1と2を解決します。ポイント3は、イントラネットDNSのアドレスを1行だけ追加することで、単独で解決されます。 コンテナから(特にphp-fpmから)ドメインにアクセスできるようにします。 これにはdnsmasqが必要です

まだインストールしていない場合はインストールします。

 sudo apt-get install dnsmasq 

DNS名を解決するために、dnsmasqは/etc/resolv.confを検索して、より高レベルのDNSサーバーのIPを探します。 原則として、そこに登録することもできますが、このファイルには、変更する価値がないと明記されています。 上書きできます。 したがって、次の内容を持つ独自のファイル/etc/resolv.ext.confを作成します。

 #  DNS nameserver 8.8.8.8 nameserver 8.8.4.4 #  DNS (     ,      ) nameserver <IP  DNS> 

これを使用するには、dnsmasqが必要です。 /etc/dnsmasq.confファイルで、そこにファイルを指定して、パラメーターを見つけてコメントを外し、修正する必要があります。

 resolv-file=/etc/resolv.ext.conf 

しかし、すべてがそれほど単純ではない... ...なdnsmasqは、もう1つの操作を実行するまでそれを使用しません。

ここで、小さな注意をする必要があります:独自の構成ファイルを気にすることはできませんが、元のresolv.confにネームサーバーを配置しますが、正しく配置します。 それらは/etc/resolvconf/resolv.conf.d/headに格納する必要があり、resolv.confの先頭に自動的に追加されますが、ネームサーバーは3つしかなく、ファイルには好きなだけ追加できることに注意してください。

しかし、私たちのケースに戻ります。 それでもresolv.ext.confを読み取るには、/ etc / default / dnsmasqファイルで指定する必要があります。

 IGNORE_RESOLVCONF=yes 

あなたはどういうナンセンスなことを言うのですか...それを読むためにファイルを無視しますか? あまり好きではありません。 このオプションの前のコメントは、それが何をするかを明確に説明しています。 resolvconfがインストールされている場合、 resolvconfの出力を無視させ、ファイルに注意を払わせます。

一般に、それですべてです。 私たちの小さな世界ではdnsmasqがDNSの解決に責任があることをDockerに説明するだけです。 インストールすると、Dockerはdocker0インターフェイスを作成し、このサブネットでコンピューターのIPを定義します。

 ifconfig | grep -A1 docker0 

次のようなものが得られます。

 docker0 Link encap:Ethernet HWaddr 02:82:c5:3c:31:60 inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 

/ etc / default / dockerを開き、見つかったIPを指定します。

 DOCKER_OPTS="--dns 172.17.0.1" 

サービスを再起動します:

 sudo service dnsmasq restart sudo service docker restart 

そして...

...再びヒッチ:

LinuxシステムがUpstartまたはSysVinit初期化システムを使用している場合にのみ、すべてが機能します(これはこのファイルに明確に記述されています)。 ただし、たとえばUbuntu 15.04以降を使用している場合は、すでにより高度なsystemdを使用しているため、追加の身体の動きが必要になります。 しかし、まず、使用するものを確認しましょう。

 $ sudo stat /proc/1/exe : '/proc/1/exe' -> '/lib/systemd/systemd' 

ご覧のとおり、systemdを使用していることはコマンドの出力から明らかです。

さて、これを治します。 サービスの構成は、最初は/lib/systemd/system/docker.serviceにあります。 単純にコピーして修正できます。

 sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service 

しかし、私たちはよりきちんと行動します-変更すべきものだけを変更します:

 sudo [ ! -e /etc/systemd/system/docker.service.d/ ] && mkdir -p /etc/systemd/system/docker.service.d/ sudo cat << 'EOF' > /etc/systemd/system/docker.service.d/docker.conf [Service] EnvironmentFile=-/etc/default/docker ExecStart= ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS EOF 

既に理解しているように、標準パラメーターに変更を加えたファイル/etc/systemd/system/docker.service.d/docker.conf(いわゆるドロップイン)を作成し、 /etc/default/dockerに登録されたdnsパラメーターを渡しますサービスの開始。

サービスを再起動するだけです。

 sudo systemctl daemon-reload sudo service docker restart 

そして、すべてが正しいことを確認してください:

 sudo service docker status 

このコマンドの出力には、接続されたドロップインとDNSで開始されたサービスの両方の、すでによく知られている多くのことが表示されます。 今本当にすべて

更新:
DOCKER_OPTSでは、docker0サブネットのホストIPを指定することをお勧めします。

便利なリンク:

Source: https://habr.com/ru/post/J315500/


All Articles