web-dev-qa-db-ja.com

Amazon ECS(Docker):コンテナーを特定のIPアドレスにバインド

私は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サービスがあります。

ありがとう。

24
Mark R

1つのオプション:クライアントごとにELBを作成し、特定のコンテナーを各ELBに割り当てます。

[1] http://docs.aws.Amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html

4
Adam Keck

これが実際の論理的な方法です。複雑に聞こえますが、実際には数分で実装でき、機能します。私たちが話すように私は実際にそれを実装しています。

各コンテナーのタスクを作成し、各サービスのターゲットグループと組み合わせて、各タスクのサービスを作成します。その後、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の場合、この方法は完全に機能します。

4
TheNavigat

コンテナー自体にはアクセスできませんが、EC2インスタンスを特定のコンテナー専用にすることができます。次に、そのサービスにアクセスする必要がある場所で、コンテナーを実行しているEC2ホストを参照できます。

  • この要件を持つサービス専用のクラスターを作成する
  • AMI最適化EC2インスタンスを作成 使用するインスタンスタイプを使用してください
    • そのガイドで説明されているように、必ずUserDataオプションを使用して、そのインスタンスを上記のクラスターに割り当ててください。
  • NetworkMode を「ブリッジ」に設定してTaskDefinitionを作成します(デスクトップと同じ)
  • 以下を使用してサービス定義を作成します。
    • LaunchTypeをEC2に設定
    • 上記で作成したクラスターに設定されたクラスター
    • 上記で作成したタスク定義に設定されたタスク定義
  • セキュリティグループをEC2インスタンスに割り当てます。

EC2インスタンスと直接通信している場合でも、EC2インスタンスと同じように(間接的に)コンテナーのIPを制御できます。これにより、「ベアメタル」でサービスを実行する頭痛が軽減され、サービスとその構成を簡単に管理および構成できます。

1
Patrick Twohig