Amazon ECS (Docker) : 컨테이너를 특정 IP 주소에 바인딩


24

Amazon ECS (Docker의 재 패키징)를 사용하고 있는데 ECS가 제공하지 않는 Docker 기능이 하나 있습니다. 즉, 인스턴스에서 여러 컨테이너를 실행하고 IP 주소 1로 들어오는 요청을 컨테이너 1에 매핑하고 IP 주소 2로 오는 요청을 컨테이너 2에 매핑하는 등을 원합니다.

Docker에서 컨테이너를 특정 IP 주소에 바인딩하는 것은 다음을 통해 수행됩니다.

docker run -p myHostIPAddr:80:8080 imageName command

그러나 Amazon ECS에는이를 수행 할 수있는 방법이 없습니다.

여러 개의 탄력적 IP 주소로 EC2 인스턴스를 설정했습니다. 작업 정의의 일부로 컨테이너를 구성 할 때 호스트 포트를 컨테이너 포트에 매핑 할 수 있습니다. 그러나 Docker와 달리 ECS는 매핑의 일부로 호스트 IP 주소를 지정하는 방법을 제공하지 않습니다.

컨테이너 N의 아웃 바운드 요청이 컨테이너 N의 외부 IP 주소를 갖기를 원합니다.

위의 모든 작업을 수행 할 수있는 방법이 있습니까?

AWS CLI 설명서와 Java 용 AWS SDK를 살펴 보았습니다. CLI가 다음과 같은 요소를 포함하는 networkBindings 배열을 반환 할 수 있음을 알 수 있습니다.

{
  "bindIP": "0.0.0.0", 
  "containerPort": 8021, 
  "hostPort": 8021
},

Java SDK에는 동일한 정보를 나타내는 NetworkBinding이라는 클래스가 있습니다. 그러나이 정보는 요청에 대한 응답으로 출력 전용으로 나타납니다. 이 바인딩 정보를 ECS에 제공하는 방법을 찾을 수 없습니다.

내가 원하는 이유는 동일한 EC2 인스턴스에서 잠재적으로 다른 컨테이너를 사용하여 서로 다른 구성 요소에 대해 완전히 다른 VM을 설정하기 때문입니다. 각 VM에는 자체 웹 서버 (고유 SSL 인증서 포함)와 자체 FTP 및 SSH 서비스가 있습니다.

감사.


워크 플로와 동일한 문제가 있습니다. aws ecs describe-container-instances도움이되지 않는 것 같습니다. 그들은 정말로 당신에게 ELB를 사용하도록 강요하고 싶습니다. 우리의 경우에는 바보입니다.
four43

지금 할 수있는 한 가지 방법이있는 것 같습니다 (2017 년 4 분기) : stackoverflow.com/a/46577872/6309
VonC

답변:


4

하나의 옵션 : 각 클라이언트에 대해 ELB를 작성한 후 각 컨테이너에 특정 컨테이너를 지정하십시오.

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


13
캐싱! 한 ELB 당 한 달에 18 달러. 이제 ECS로 마이크로 서비스를 원하는 사람은 누구입니까? aws.amazon.com/elasticloadbalancing/pricing
Knots

1
@ 우리는 같은 문제가있었습니다. 그런 다음 Lambda + API Gateway로 전환하여 비용이 10 센트로 줄었습니다.
grepe

이제 서비스 당 1이 아닌 모든 서비스에 단일 ELB (클래식 ELB 대신)를 사용할 수 있습니다. 호스트 이름에 다른 호스트 이름이나 다른 경로에 있어야합니다.
AJ Brown

4

실제적이고 논리적 인 방법이 있습니다. 너무 복잡하게 들리지만 실제로 몇 분 안에 구현할 수 있으며 작동합니다. 우리가 말한대로 실제로 구현하고 있습니다.

각 컨테이너에 대한 작업을 생성하고 각 서비스에 대한 대상 그룹과 함께 각 작업에 대한 서비스를 생성합니다. 그런 다음 단 하나의 Elastic Load Balancer를 생성합니다.

애플리케이션 기반 탄력적로드 밸런서는 요청 된 경로를 기반으로 요청을 라우팅 할 수 있습니다. 대상 그룹을 사용하면 elb-domain.com/1컨테이너 1, elb-domain.com/2컨테이너 2 등으로 들어오는 요청을 라우팅 할 수 있습니다 .

이제 당신은 한 걸음 떨어져 있습니다. 리버스 프록시 서버를 작성하십시오.

필자의 경우 우리는 nginx를 사용하므로 원하는 수의 IP로 nginx 서버를 만들 수 있으며 nginx의 역방향 프록시 기능을 사용하여 IP를 ELB의 경로로 라우팅하여 올바른 컨테이너로 라우팅 할 수 있습니다 (에스). 도메인을 사용하는 경우의 예입니다.

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"에 대해 해당 클러스터에서 요청이 균형을 이루는 도커 머신 클러스터를 가질 수 있기 때문입니다. 머신을 다시 생성해도 정적 IP에는 영향을 미치지 않으며 많은 구성을 다시 실행할 필요가 없습니다.

FTP 및 SSH를 사용할 수 없기 때문에 귀하의 질문에 완전히 대답하지는 않지만 Docker를 사용하여 그렇게해서는 안되며 클라우드 서버를 대신 사용해야한다고 주장합니다. Docker를 사용하는 경우 FTP 또는 SSH를 사용하여 서버를 업데이트하는 대신 컨테이너 자체를 업데이트해야합니다. 그러나 HTTP 및 HTTPS의 경우이 방법이 완벽하게 작동합니다.


1

컨테이너 자체로는 할 수 없지만 EC2 인스턴스를 특정 컨테이너 전용으로 만들 수 있습니다. 그런 다음 해당 서비스에 액세스해야하는 경우 컨테이너를 실행하는 EC2 호스트를 참조 할 수 있습니다.

  • 이 요구 사항으로 서비스를위한 전용 클러스터 생성
  • 원하는 인스턴스 유형을 사용하여 AMI 최적화 EC2 인스턴스 생성
    • 해당 안내서에 설명 된대로 UserData 옵션을 사용하여 해당 인스턴스를 위의 클러스터에 할당하십시오.
  • NetworkMode 가 "bridge"(데스크탑과 동일)로 설정된 TaskDefinition을 작성하십시오.
  • 다음을 사용하여 서비스 정의를 작성하십시오.
    • 실행 유형을 EC2로 설정
    • 위에서 생성 한 클러스터로 설정된 클러스터
    • 위에서 정의한 작업 정의로 설정된 작업 정의
  • 달리 보안 그룹을 EC2 인스턴스에 할당하십시오.

여전히 EC2 인스턴스와 직접 대화하고 있지만 EC2 인스턴스와 마찬가지로 컨테이너의 IP를 간접적으로 제어 할 수 있습니다. 이를 통해 "베어 메탈"에서 서비스를 실행해야하는 번거 로움을 덜어 서비스 및 구성을보다 쉽게 ​​관리하고 구성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.