我的应用程序有两个依赖项,我在docker-compose中指定了一个postgres和kafka服务:
services:
postgres:
image: postgres:9.6-alpine
ports:
- "5432:5432"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
我在docker网络之外运行我的代码和测试,并使用这两个容器作为我的依赖项。
由于这些都暴露了端口,我可以通过以下命令配置我的应用程序:localhost:5432,localhost:9092。这有效。
我遇到的问题是当我想测试应用程序映像本身时,我将其作为服务添加到docker-compose文件中:
app:
image: myapp
links:
- postgres
- kafka
该应用程序仍配置为使用localhost,因此我允许应用程序容器使用--net = host访问我的网络
虽然app容器现在可以访问localhost:5432和localhost:9092(通过容器内部卷曲确认),但是当代码运行且依赖关系无法访问时,主机名无法解析 - 可能是因为使用了localhost容器和混淆客户端库?我真的不确定。
感觉就像在app配置中使用localhost不是正确的方法。是否可以从docker网络外部引用服务名称'postgres'和'kafka'?
为什么你想继续在你的应用程序中使用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.