群中的Docker容器无法看到彼此

时间:2018-01-17 20:00:03

标签: asp.net docker asp.net-core redis docker-swarm

我刚开始学习码头工人。我有一个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会允许任何容器在同一个网络中看到它。如果我在假设中错了,请告诉我。

这是使这些容器通信的正确方法吗?

由于

1 个答案:

答案 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”; }); 作为环境变量传递,以便在不重新构建的情况下进行更改。