我刚开始学习码头工人。我有一个swarm运行,我正在尝试让我的asp.net核心应用程序与redis服务器通信。我不认为我会遇到这么多问题:(
我的码头组成:
version: ‘3.3’
services:
webfarm_api:
image: dispersia/webfarm.api
ports:
- 8080:80
environment:
- SERVICE_PORTS=8080
depends_on:
- webfarm_redis
webfarm_redis:
image: dispersia/redis
ports:
- 6379:6379
volumes:
- ‘redis:/data’
volumes:
redis:
我已将redis.conf设置为绑定到0.0.0.0,并且在我的应用程序中我有
services.AddDistributedRedisCache(options =>
{
options.Configuration = “0.0.0.0”;
options.InstanceName = “redisInstance”;
});
如果我在docker之外手动运行redis-server和我的asp.net核心应用程序,他们会看到彼此,一切正常,但我不能为我的生活让它在docker中工作。
如果我运行docker inspect network prod_default我得到两个容器都在运行,并且它们有不同的IP(10.0.0.6/24)和(10.0.0.4/24)但是我认为0.0.0.0会允许任何容器在同一个网络中看到它。如果我在假设中错了,请告诉我。
这是使这些容器通信的正确方法吗?
由于
答案 0 :(得分:3)
从https://superuser.com/questions/949428/whats-the-difference-between-127-0-0-1-and-0-0-0-0
取得的127.0.0.1与0.0.0.0的说明127.0.0.1和0.0.0.0之间有什么区别?
127.0.0.1
是环回地址(也称为localhost)。
0.0.0.0
是一个不可路由的元地址,用于指定无效的,未知的或不适用的目标(没有特定的地址占位符)。
在路由条目的上下文中,它通常表示默认路由。
在服务器环境中,
0.0.0.0
表示“所有IPv4地址 本地计算机“。如果主机有两个IP地址,192.168.1.1
和10.1.2.1
,并且主机上运行的服务器侦听0.0.0.0
,这两个IP都可以访问它。
那是什么意思?这意味着在隔离的应用程序容器中,您告诉应用程序在此端口查看localhost以查找Redis
实例,但这不是正确的,因为Redis
正在一个单独的隔离{{1}中运行容器。
您想要做的是在您的应用中使用您的Redis
名称,该名称将要求Docker DNS服务webfarm_redis
,它将为您提供码头工具webfarm_redis
IP
Redis
我会将services.AddDistributedRedisCache(options =>
{
options.Configuration = “webfarm_redis”;
options.InstanceName = “redisInstance”;
});
作为环境变量传递,以便在不重新构建的情况下进行更改。