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
はコンテナー内で解決でき、ping
ing apiは機能しますが、nginxはそこで独自のことを行います。
dnsmasq
についても読みましたが、このパッケージをインストールせずにこれを実行したいのですが、ここでも選択肢がありますか?
Nginxに/ etc/hostsからのエントリを使用させる方法はありません。
ただし、nginx構成でマップ{}を使用して、ホスト名をIPに変換する方法をnginxに指示できます。/etc/hostsをマップで使用できる形式、つまりhostname ip
とip 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
Nginxなし-問題ありません。 アプリケーションロードバランサー に置き換えるだけです。そして、リンクされたコンテナ内のリクエストはどうですか?とにかく、nginxをバイパスして、リンクされたコンテナに直接移動するため、ここでは役に立ちません。コンテナー内でポート80を使用し、それらを異なるホストポートに配置してロードバランサーを接続できます。