私はAmazon ECS(Dockerの再パッケージ)で遊んでいて、ECSが提供していないように見えるDocker機能が1つあることに気づきました。つまり、インスタンスで複数のコンテナーを実行し、IPアドレス1に着信するリクエストをコンテナー1にマップし、IPアドレス2に着信するリクエストをコンテナー2にマップする、などです。
Dockerでは、コンテナを特定のIPアドレスにバインドするには、次のようにします。
docker run -p myHostIPAddr:80:8080 imageName command
ただし、Amazon ECSでは、これを行う方法がないようです。
複数のElastic IPアドレスを使用してEC2インスタンスを設定しました。コンテナーをタスク定義の一部として構成する場合、ホストポートをコンテナーポートにマップすることができます。ただし、Dockerとは異なり、ECSはマッピングの一部としてホストIPアドレスを指定する方法を提供しません。
追加のひねりは、コンテナーNからのアウトバウンド要求にコンテナーNの外部IPアドレスを持たせたいことです。
上記のすべてを行う方法はありますか?
AWS CLIのドキュメントとAWS SDK for Javaを確認しました。 CLIが次のような要素を含むnetworkBindings配列を返すことができることがわかります。
{
"bindIP": "0.0.0.0",
"containerPort": 8021,
"hostPort": 8021
},
およびJava SDKには、同じ情報を表すNetworkBindingという名前のクラスがあります。ただし、この情報は、要求に応じて出力専用のように見えます。提供する方法が見つかりませんECSへのこのバインディング情報。
これを実行する理由は、同じEC2インスタンスで異なるコンテナーを使用する可能性があるため、異なるConstituencyに対して完全に異なるVMをセットアップするためです。各VMには、独自のWebサーバー(個別のSSL証明書を含む)、および独自のFTPおよびSSHサービスがあります。
ありがとう。
1つのオプション:クライアントごとにELBを作成し、特定のコンテナーを各ELBに割り当てます。
[1] http://docs.aws.Amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html
これが実際の論理的な方法です。複雑に聞こえますが、実際には数分で実装でき、機能します。私たちが話すように私は実際にそれを実装しています。
各コンテナーのタスクを作成し、各サービスのターゲットグループと組み合わせて、各タスクのサービスを作成します。その後、Elastic Load Balancerを1つだけ作成します。
アプリケーションベースのElastic Load Balancerは、リクエストされたパスに基づいてリクエストをルーティングできます。ターゲットグループを使用すると、elb-domain.com/1
に送信されるリクエストをコンテナ1にルーティングしたり、elb-domain.com/2
をコンテナ2にルーティングしたりできます。
今、あなたはほんの一歩です。リバースプロキシサーバーを作成します。
私の場合、nginxを使用しているので、好きなだけIPを持つnginxサーバーを作成でき、nginxのリバースプロキシ機能を使用して、IPをELBのパスにルーティングし、それに応じて正しいコンテナーにルーティングできます。 (s)。ドメインを使用している場合の例を次に示します。
server {
server_name domain1.com;
listen 80;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://elb-domain.com/1;
}
}
もちろん、実際にIPをリッスンしている場合は、server_name
行を省略して、対応するインターフェイスのみをリッスンできます。
これは、コンテナーごとに静的IPを割り当てるよりも実際に優れています。これにより、各 "IP"のクラスター上で要求が分散されるDockerマシンのクラスターを作成できます。マシンを再作成しても静的IPに影響はなく、多くの構成をやり直す必要はありません。
FTPとSSHを使用できないため、これはあなたの質問に完全に答えるものではありませんが、Dockerを使用してこれを行うことは絶対に避けてください。代わりにクラウドサーバーを使用する必要があります。 Dockerを使用している場合は、FTPまたはSSHを使用してサーバーを更新する代わりに、コンテナ自体を更新する必要があります。ただし、HTTPおよびHTTPSの場合、この方法は完全に機能します。
コンテナー自体にはアクセスできませんが、EC2インスタンスを特定のコンテナー専用にすることができます。次に、そのサービスにアクセスする必要がある場所で、コンテナーを実行しているEC2ホストを参照できます。
EC2インスタンスと直接通信している場合でも、EC2インスタンスと同じように(間接的に)コンテナーのIPを制御できます。これにより、「ベアメタル」でサービスを実行する頭痛が軽減され、サービスとその構成を簡単に管理および構成できます。