使用docker-compose,我正在尝试在公共端口8080和私有端口9324上的sqs服务上运行我的API .API需要能够与sqs服务通信。为此,我设置了以下docker-compose.yml:
version: '2'
services:
api:
image: api
ports:
- "8080:8080"
sqs:
image: pakohan/elasticmq
我尝试了几次迭代,包括为api添加链接别名:
links:
- "sqs:localhost"
并公开sqs的端口:
ports:
- "9324:9324"
但似乎都不起作用。尝试与sqs服务通信时,API始终会收到连接拒绝错误。
当sqs端口公开暴露时,在docker之外运行的API能够正常通信(因此sqs服务正在初始化正确)。
有没有人对如何解决这个问题有任何想法?
答案 0 :(得分:8)
尝试欺骗api
容器与sqs
连接,告诉它实际连接到localhost
并不能正常工作。您需要以sqs
的名义向api
提供不具有特殊含义的名称,例如:
links:
- sqs:original-name
甚至:
links:
- sqs
使sqs
可以api
访问名称" sqs
"。
然后,当然,您需要告诉api
它应该连接到original-name
或sqs
的端口9324而不是localhost
的端口9324。你如何做到这取决于api
实际上是什么。
答案 1 :(得分:3)
请注意,links
是Docker现在(see Docs)的遗留功能。
当您在单个docker-compose
文件中声明多个服务时,它们实际上将位于同一网络内(是默认网络还是用户定义的网络)。然后,诀窍是使用服务的名称而不是localhost。然后使用原始示例:
version: '2'
services:
api:
image: api
ports:
- "8080:8080"
sqs:
image: pakohan/elasticmq
您只需要确保您访问的是sqs
而不是localhost
(您的sqs服务的主机名应为sqs
)