让容器在 Elastic Container Service (ECS) 中相互通信?
Getting containers to talk to each other in Elastic Container Service (ECS)?
我正在使用 AWS 和弹性容器服务 (ECS)。我有 6 个服务,每个 运行 都在自己的容器中,需要相互通信才能工作。
当我在我的本地机器上执行 'docker-compose' 时,每个服务都在自己的容器中启动,并使用 docker 给它的默认名称作为主机名。我可以使用 'registration-service' 容器中的主机名 'database' 访问数据库容器,依此类推:
PORTS NAMES
0.0.0.0:8901->8901/tcp common_authenticationservice_1
0.0.0.0:8888->8888/tcp common_configserver_1
0.0.0.0:5555->5555/tcp common_zuulserver_1
0.0.0.0:8761->8761/tcp common_eurekaserver_1
0.0.0.0:8082->8082/tcp common_registrationservice_1
0.0.0.0:5432->5432/tcp common_database_1
当我使用 'ecs-cli compose' 部署到 ECS 时,服务无法在 EC2 实例中找到彼此。 'registration-service' 查找主机名 'database' 但找不到,与其他人一样:
PORTS NAMES
0.0.0.0:8888->8888/tcp ecs-common-41-configserver-fa98a8edd6fabfd98f01
0.0.0.0:5432->5432/tcp ecs-common-41-database-9e95dfb9d591e1d2f101
0.0.0.0:8901->8901/tcp ecs-common-41-authenticationservice-92c4e6b7f5f49dcf0500
0.0.0.0:8082->8082/tcp ecs-common-41-registrationservice-c4e384f7f39581a28901
0.0.0.0:8761->8761/tcp ecs-common-41-eurekaserver-9eb6bc89ebf79ba50200
0.0.0.0:5555->5555/tcp ecs-common-41-zuulserver-be8ff59cc0eee2965400
据我了解,我需要能够识别我所有容器的东西,让它们注册并检查它们的健康状况。理想情况下,此解决方案会为我提供一个主机名,我可以将其用于每项服务(以及我想要扩展的任何相同服务)并将 DNS 请求路由到这些服务之一。
我尝试在我的 ECS 集群上使用 'service discovery' 功能创建服务,但它要求指向我的一个容器,然后抱怨它们使用相同的端口并拒绝启动.也许这不是我想的那样?
这是我的 docker-ECS 组合文件:
version: "3"
services:
eurekaserver:
container_name: eurekaserver
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/eureka-server:latest
ports:
- "8761:8761"
configserver:
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/configuration-server:latest
ports:
- "8888:8888"
environment:
EUREKASERVER_PORT: 8761
EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
ENCRYPT_KEY: "IMSYMMETRIC"
zuulserver:
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/johncarnell/tmx-zuulsvr:chapter7
ports:
- "5555:5555"
environment:
PROFILE: "default"
SERVER_PORT: "5555"
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
CONFIGSERVER_URI: "http://configserver:8888"
EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
database:
image: postgres:9.5
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=******
- POSTGRES_DB=practicejournal
registrationservice:
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/registration-service:latest
ports:
- "8082:8082"
environment:
PROFILE: "default"
SERVER_PORT: "8082"
ES_PORT: 9200
DATABASE_PORT: 5432
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
AUTHSERVER_PORT: 8091
CONFIGSERVER_URI: "http://configserver:8888"
EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
AUTHSERVER_URI: "http://authenticationservice:8901/auth/user"
ENCRYPT_KEY: "IMSYMMETRIC"
authenticationservice:
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/authentication-service:latest
ports:
- "8901:8901"
environment:
PROFILE: "default"
SERVER_PORT: "8901"
DATABASE_PORT: 5432
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
CONFIGSERVER_URI: "http://configserver:8888"
EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
ENCRYPT_KEY: "IMSYMMETRIC"
此外,我有一个脚本在启动后立即在 docker 容器上运行。最终,这个脚本启动了 Java 微服务:
#!/bin/sh
echo "********************************************************"
echo "Waiting for the eureka server to start on port $EUREKASERVER_PORT"
echo "********************************************************"
while ! `nc -z eurekaserver $EUREKASERVER_PORT`; do sleep 3; done
echo "******* Eureka Server has started"
echo "********************************************************"
echo "Waiting for the database server to start on port $DATABASE_PORT"
echo "********************************************************"
while ! `nc -z database $DATABASE_PORT`; do sleep 3; done
echo "******** Database Server has started "
echo "********************************************************"
echo "Waiting for the configuration server to start on port $CONFIGSERVER_PORT"
echo "********************************************************"
while ! `nc -z configserver $CONFIGSERVER_PORT`; do sleep 3; done
echo "******* Configuration Server has started"
echo "********************************************************"
echo "Starting Organization Service "
echo "********************************************************"
java -Djava.security.egd=file:/dev/./urandom -Dserver.port=$SERVER_PORT \
-Deureka.client.serviceUrl.defaultZone=$EUREKASERVER_URI \
-Dspring.cloud.config.uri=$CONFIGSERVER_URI \
-Dspring.profiles.active=$PROFILE \
-Dsecurity.oauth2.resource.userInfoUri=$AUTHSERVER_URI \
-jar /usr/local/registrationservice/@project.build.finalName@.jar
这不可能是一个独特的问题。我错过了什么吗?什么 AWS 解决方案可以帮助我在 ECS 中注册容器、在它们之间路由请求并检查它们的运行状况,我该如何设置?
1: 我看到从容器 A 连接到容器 B 容器应该有一个名称。
2:依赖于容器A的容器B应该有Link个容器A。
3:在你的情况下,Container Configserver 依赖于 Eurekaserver。所以Configserver中应该有一个Eurekaserver的link。
4:应该指定唯一的容器名称,以便其他容器可以使用它与他们交谈。
5:我已经更新了 docker-compose 文件,请检查它,如果有任何问题请告诉我。
version: '3'
services:
eurekaserver:
container_name: eurekaserver
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/eureka-server:latest'
ports:
- '8761:8761'
configserver:
container_name: configserver
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/configuration-server:latest'
ports:
- '8888:8888'
environment:
EUREKASERVER_PORT: 8761
EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
ENCRYPT_KEY: IMSYMMETRIC
links:
- eurekaserver
zuulserver:
container_name: zuulserver
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/johncarnell/tmx-zuulsvr:chapter7'
ports:
- '5555:5555'
environment:
PROFILE: default
SERVER_PORT: '5555'
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
CONFIGSERVER_URI: 'http://configserver:8888'
EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
links:
- eurekaserver
- configserver
database:
container_name: database
image: 'postgres:9.5'
ports:
- '5432:5432'
environment:
- POSTGRES_USER=postgres
- 'POSTGRES_PASSWORD=******'
- POSTGRES_DB=practicejournal
authenticationservice:
container_name: authenticationservice
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/authentication-service:latest'
ports:
- '8901:8901'
environment:
PROFILE: default
SERVER_PORT: '8901'
DATABASE_PORT: 5432
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
CONFIGSERVER_URI: 'http://configserver:8888'
EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
ENCRYPT_KEY: IMSYMMETRIC
links:
- eurekaserver
- configserver
registrationservice:
container_name: registrationservice
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/registration-service:latest'
ports:
- '8082:8082'
environment:
PROFILE: default
SERVER_PORT: '8082'
ES_PORT: 9200
DATABASE_PORT: 5432
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
AUTHSERVER_PORT: 8091
CONFIGSERVER_URI: 'http://configserver:8888'
EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
AUTHSERVER_URI: 'http://authenticationservice:8901/auth/user'
ENCRYPT_KEY: IMSYMMETRIC
links:
- eurekaserver
- configserver
- authenticationservice
最好为Container添加HealthCheck和Depends-On Key value Pairs。查看 Link 此处了解详细信息。
我正在使用 AWS 和弹性容器服务 (ECS)。我有 6 个服务,每个 运行 都在自己的容器中,需要相互通信才能工作。
当我在我的本地机器上执行 'docker-compose' 时,每个服务都在自己的容器中启动,并使用 docker 给它的默认名称作为主机名。我可以使用 'registration-service' 容器中的主机名 'database' 访问数据库容器,依此类推:
PORTS NAMES
0.0.0.0:8901->8901/tcp common_authenticationservice_1
0.0.0.0:8888->8888/tcp common_configserver_1
0.0.0.0:5555->5555/tcp common_zuulserver_1
0.0.0.0:8761->8761/tcp common_eurekaserver_1
0.0.0.0:8082->8082/tcp common_registrationservice_1
0.0.0.0:5432->5432/tcp common_database_1
当我使用 'ecs-cli compose' 部署到 ECS 时,服务无法在 EC2 实例中找到彼此。 'registration-service' 查找主机名 'database' 但找不到,与其他人一样:
PORTS NAMES
0.0.0.0:8888->8888/tcp ecs-common-41-configserver-fa98a8edd6fabfd98f01
0.0.0.0:5432->5432/tcp ecs-common-41-database-9e95dfb9d591e1d2f101
0.0.0.0:8901->8901/tcp ecs-common-41-authenticationservice-92c4e6b7f5f49dcf0500
0.0.0.0:8082->8082/tcp ecs-common-41-registrationservice-c4e384f7f39581a28901
0.0.0.0:8761->8761/tcp ecs-common-41-eurekaserver-9eb6bc89ebf79ba50200
0.0.0.0:5555->5555/tcp ecs-common-41-zuulserver-be8ff59cc0eee2965400
据我了解,我需要能够识别我所有容器的东西,让它们注册并检查它们的健康状况。理想情况下,此解决方案会为我提供一个主机名,我可以将其用于每项服务(以及我想要扩展的任何相同服务)并将 DNS 请求路由到这些服务之一。
我尝试在我的 ECS 集群上使用 'service discovery' 功能创建服务,但它要求指向我的一个容器,然后抱怨它们使用相同的端口并拒绝启动.也许这不是我想的那样?
这是我的 docker-ECS 组合文件:
version: "3"
services:
eurekaserver:
container_name: eurekaserver
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/eureka-server:latest
ports:
- "8761:8761"
configserver:
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/configuration-server:latest
ports:
- "8888:8888"
environment:
EUREKASERVER_PORT: 8761
EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
ENCRYPT_KEY: "IMSYMMETRIC"
zuulserver:
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/johncarnell/tmx-zuulsvr:chapter7
ports:
- "5555:5555"
environment:
PROFILE: "default"
SERVER_PORT: "5555"
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
CONFIGSERVER_URI: "http://configserver:8888"
EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
database:
image: postgres:9.5
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=******
- POSTGRES_DB=practicejournal
registrationservice:
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/registration-service:latest
ports:
- "8082:8082"
environment:
PROFILE: "default"
SERVER_PORT: "8082"
ES_PORT: 9200
DATABASE_PORT: 5432
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
AUTHSERVER_PORT: 8091
CONFIGSERVER_URI: "http://configserver:8888"
EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
AUTHSERVER_URI: "http://authenticationservice:8901/auth/user"
ENCRYPT_KEY: "IMSYMMETRIC"
authenticationservice:
image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/authentication-service:latest
ports:
- "8901:8901"
environment:
PROFILE: "default"
SERVER_PORT: "8901"
DATABASE_PORT: 5432
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
CONFIGSERVER_URI: "http://configserver:8888"
EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
ENCRYPT_KEY: "IMSYMMETRIC"
此外,我有一个脚本在启动后立即在 docker 容器上运行。最终,这个脚本启动了 Java 微服务:
#!/bin/sh
echo "********************************************************"
echo "Waiting for the eureka server to start on port $EUREKASERVER_PORT"
echo "********************************************************"
while ! `nc -z eurekaserver $EUREKASERVER_PORT`; do sleep 3; done
echo "******* Eureka Server has started"
echo "********************************************************"
echo "Waiting for the database server to start on port $DATABASE_PORT"
echo "********************************************************"
while ! `nc -z database $DATABASE_PORT`; do sleep 3; done
echo "******** Database Server has started "
echo "********************************************************"
echo "Waiting for the configuration server to start on port $CONFIGSERVER_PORT"
echo "********************************************************"
while ! `nc -z configserver $CONFIGSERVER_PORT`; do sleep 3; done
echo "******* Configuration Server has started"
echo "********************************************************"
echo "Starting Organization Service "
echo "********************************************************"
java -Djava.security.egd=file:/dev/./urandom -Dserver.port=$SERVER_PORT \
-Deureka.client.serviceUrl.defaultZone=$EUREKASERVER_URI \
-Dspring.cloud.config.uri=$CONFIGSERVER_URI \
-Dspring.profiles.active=$PROFILE \
-Dsecurity.oauth2.resource.userInfoUri=$AUTHSERVER_URI \
-jar /usr/local/registrationservice/@project.build.finalName@.jar
这不可能是一个独特的问题。我错过了什么吗?什么 AWS 解决方案可以帮助我在 ECS 中注册容器、在它们之间路由请求并检查它们的运行状况,我该如何设置?
1: 我看到从容器 A 连接到容器 B 容器应该有一个名称。 2:依赖于容器A的容器B应该有Link个容器A。 3:在你的情况下,Container Configserver 依赖于 Eurekaserver。所以Configserver中应该有一个Eurekaserver的link。 4:应该指定唯一的容器名称,以便其他容器可以使用它与他们交谈。 5:我已经更新了 docker-compose 文件,请检查它,如果有任何问题请告诉我。
version: '3'
services:
eurekaserver:
container_name: eurekaserver
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/eureka-server:latest'
ports:
- '8761:8761'
configserver:
container_name: configserver
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/configuration-server:latest'
ports:
- '8888:8888'
environment:
EUREKASERVER_PORT: 8761
EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
ENCRYPT_KEY: IMSYMMETRIC
links:
- eurekaserver
zuulserver:
container_name: zuulserver
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/johncarnell/tmx-zuulsvr:chapter7'
ports:
- '5555:5555'
environment:
PROFILE: default
SERVER_PORT: '5555'
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
CONFIGSERVER_URI: 'http://configserver:8888'
EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
links:
- eurekaserver
- configserver
database:
container_name: database
image: 'postgres:9.5'
ports:
- '5432:5432'
environment:
- POSTGRES_USER=postgres
- 'POSTGRES_PASSWORD=******'
- POSTGRES_DB=practicejournal
authenticationservice:
container_name: authenticationservice
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/authentication-service:latest'
ports:
- '8901:8901'
environment:
PROFILE: default
SERVER_PORT: '8901'
DATABASE_PORT: 5432
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
CONFIGSERVER_URI: 'http://configserver:8888'
EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
ENCRYPT_KEY: IMSYMMETRIC
links:
- eurekaserver
- configserver
registrationservice:
container_name: registrationservice
image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/registration-service:latest'
ports:
- '8082:8082'
environment:
PROFILE: default
SERVER_PORT: '8082'
ES_PORT: 9200
DATABASE_PORT: 5432
CONFIGSERVER_PORT: 8888
EUREKASERVER_PORT: 8761
AUTHSERVER_PORT: 8091
CONFIGSERVER_URI: 'http://configserver:8888'
EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
AUTHSERVER_URI: 'http://authenticationservice:8901/auth/user'
ENCRYPT_KEY: IMSYMMETRIC
links:
- eurekaserver
- configserver
- authenticationservice
最好为Container添加HealthCheck和Depends-On Key value Pairs。查看 Link 此处了解详细信息。