web-dev-qa-db-ja.com

AWS上のマルチコンテナドッカー-Nginxはホストマシン/ etc / hostsリゾルバーを使用します

Amazon Elastic Beanstalkに次のDockerrun.aws.jsonファイルを含むマルチコンテナDocker環境があります。

{ 
    "AWSEBDockerrunVersion": 2, 
    "containerDefinitions": [ 
      { 
        "name": "web", 
        "memoryReservation": 256, 
        "image": "my/nginx/repo/image",  
        "portMappings": [ 
          { 
            "hostPort": 80, 
            "containerPort": 80 
          } 
        ], 
        "links": [ 
          "api" 
        ], 
        "essential": true 
      }, 
      { 
        "name": "api", 
        "memoryReservation": 256, 
        "image": "my-api/repo", 
        "essential": true, 
        "portMappings": [ 
          { 
            "hostPort": 3000, 
            "containerPort": 80 
          } 
        ]
      } 
    ] 
  }

最終的には、nginxが提供するノードアプリがリンクされたコンテナから名前付きアドレスへのリクエストを解決できるようにしたいので、webイメージ(ノードアプリ)でhttp://api/some/resourceにリクエストを送信して、nginxにそれをapiコンテナーに解決します。

ここで、指定されたリンクによりdockerがAPIコンテナーのホストエントリを追加するため、nginxサーバーにhosts etc/hostsファイルからのアドレスを解決させますが、nginxは独自のリゾルバーを使用していることがわかりました。問題を少し調べたところ、Elastic Beanstalkのマルチコンテナソリューションとユーザー定義のネットワークでは、127.0.0.11のdockerによってリゾルバーが提供されることがわかりましたが、現在ユーザーを定義することはできません。 Dockerrun.aws.jsonで定義されたネットワーク、私は別のソリューションを探し続けています。 linksはコンテナー内で解決でき、pinging apiは機能しますが、nginxはそこで独自のことを行います。

dnsmasqについても読みましたが、このパッケージをインストールせずにこれを実行したいのですが、ここでも選択肢がありますか?

6
the_critic

Nginxに/ etc/hostsからのエントリを使用させる方法はありません。

ただし、nginx構成でマップ{}を使用して、ホスト名をIPに変換する方法をnginxに指示できます。/etc/hostsをマップで使用できる形式、つまりhostname ipip hostnameに変換するためのスクリプトが必要になります。

マップの例を次に示します。

map $container_hostname $container_ip {
    default 127.0.0.1;
    containerA X.X.X.X;
    containerB Y.Y.Y.Y;
}

後で設定ファイルで次のことができます。

server_name   ~^(www\.)?(?<container_hostname>.+)$;

location / {
    proxy_pass http://$container_ip:80;
}

nginxは、リクエストされたserver_nameを照合して、$ container_hostnameに保存します。

http://nginx.org/en/docs/http/server_names.html#regex_names

次に、マップでホスト名を検索し、対応するIPを取得して、proxy_passに渡します。

地図の詳細: http://nginx.org/en/docs/http/ngx_http_map_module.html

1
Luca Gibelli

Nginxなし-問題ありません。 アプリケーションロードバランサー に置き換えるだけです。そして、リンクされたコンテナ内のリクエストはどうですか?とにかく、nginxをバイパスして、リンクされたコンテナに直接移動するため、ここでは役に立ちません。コンテナー内でポート80を使用し、それらを異なるホストポートに配置してロードバランサーを接続できます。

0
ei-grad