我的应用程序有2个依赖关系,它们是我在 docker-compose 中指定的一种postgres和kafka服务:
services:
postgres:
image: postgres:9.6-alpine
ports:
- "5432:5432"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
我运行我的代码并在外部进行测试,并将这两个容器用作我的依赖项。
由于这两个都暴露了端口,因此我可以配置我的应用以通过以下方式访问它们:localhost:5432,localhost:9092。这行得通。
我遇到的问题是,我想测试应用程序映像本身时,将其作为服务添加到docker-compose文件中:
app:
image: myapp
links:
- postgres
- kafka
该应用仍配置为使用localhost,因此我允许该应用容器使用-net = host
访问我的网络虽然应用程序容器现在可以访问localhost:5432和localhost:9092(通过从容器内部卷曲确认),但是当代码运行且依赖项无法访问时,主机名无法解析-可能是使用localhost的结果从容器内部并混淆客户端库?我真的不确定。
感觉在这里在应用程序配置中使用localhost不是正确的方法。是否可以从docker网络的外部引用服务名称“ postgres”和“ kafka”?
答案 0 :(得分:1)
为什么要继续在应用中使用localhost:xxx
?
对您来说,最好的方法是从docker-compose
启动应用程序时更改应用程序中的连接字符串。您只需要使用postgres:5432
和kafka:9092
,一切都将起作用,因为在docker-compose网络内部,所有计算机在其服务名称下都是彼此可见的。
如果出于某些原因您坚持使用localhost
作为连接目标,则需要将所有服务转换为host
模式。但是请记住-在这种情况下,端口未公开,因此您可以使用其原始端口值访问服务。
version: '3'
services:
postgres:
image: postgres:9.6-alpine
network_mode: "host"
kafka:
image: wurstmeister/kafka
network_mode: "host"
app:
image: myapp
network_mode: "host"
顺便说一句,忘记链接。 They are deprecated.