我正在使用AWS和Elastic Container Service(ECS)。我有6个服务,每个服务都在各自的容器中运行,这些容器需要相互通信才能工作。
当我在本地计算机上执行“ docker-compose”时,每个服务都在其自己的容器中启动,并使用docker为其提供的默认名称作为其主机名。我可以从“注册服务”容器中使用主机名“数据库”访问数据库容器,依此类推:
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与其他主机一样查找主机名“数据库”,但找不到它:
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群集上创建服务,但是它要求指向我的一个容器,然后抱怨它们使用相同的端口,并拒绝启动。也许这不是我想的那样?
这是我的ECS的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:
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中注册容器,在容器之间路由请求并检查其运行状况,我该如何设置?
答案 0 :(得分:1)
1:我看到了从容器A到容器B的连接。容器应该有一个名称。 2:依赖于容器A的容器B应该具有容器A的链接。 3:在您的情况下,Container Configserver取决于Eurekaserver。因此,Configserver中应该有一个Eurekaserver链接。 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
最好为容器添加HealthCheck和Depends-On键值对。在此处查看Link以获得详细信息。