【问题标题】:Docker Containers in swarm can not see eachotherswarm 中的 Docker 容器互相看不到
【发布时间】:2018-06-26 19:18:31
【问题描述】:

我刚刚开始学习 docker。我有一个 swarm 正在运行,我正试图让我的 asp.net 核心应用程序与 redis 服务器通信。我没想到我会有这么多问题:(

我的 docker-compose:

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 将允许任何容器在同一网络中查看它。如果我的假设有误,请告诉我。

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

谢谢

【问题讨论】:

  • 另外请注意,您的容器在同一个网络中。您的 docker-compose 中没有“网络”部分。见docker-compose docs
  • @Tseng 当我通过 swarm 初始化我的 compose 文件时,它会根据名称创建一个默认网络,例如:docker stack deploy --compose-file=docker-compose.yml prod 将创建一个 prod_bridge 并自动连接任何通过它打开的容器它在那个网络下

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


【解决方案1】:

127.0.0.1 与 0.0.0.0 的描述取自 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是环回地址(也称为localhost)。

0.0.0.0 是一个不可路由的元地址,用于指定无效、未知或不适用的目标(无特定地址占位符)。

在路由条目的上下文中,它通常表示默认路由。

在服务器上下文中,0.0.0.0 表示“服务器上的所有 IPv4 地址 本地机器”。如果主机有两个 IP 地址,192.168.1.110.1.2.1,并且在主机上运行的服务器侦听 0.0.0.0,这两个 IP 都可以访问它。

那么这是什么意思?这意味着在您的隔离应用程序容器中,您告诉应用程序在 localhost 中查看此端口上的 Redis 实例,这是不正确的,因为 Redis 在单独的隔离 Redis 容器中运行。

您想要做的是在您的应用程序中使用您的webfarm_redis 名称,这将询问 Docker DNS 服务webfarm_redis 的位置,它会为您提供 docker 的Redis IP。

services.AddDistributedRedisCache(options =>
{
    options.Configuration = “webfarm_redis”;
    options.InstanceName = “redisInstance”;
});

我会将webfarm_redis 作为环境变量传递,这样就可以在不重新构建的情况下对其进行更改。

【讨论】:

  • 所以我之前确实尝试过这条路线,感谢您提供的信息,但是您如何将 webfarm_redis 作为环境变量传递?当我尝试将字符串直接放入其中时,它不起作用,当我尝试放入一个实际的环境变量时,例如:REDIS_SERVER=webfarm_redis 然后使用 `Environment.GetEnvironmentVariable('REDIS_SERVER') 它只是返回 webfarm_redis 作为再次字符串而不是该容器的地址
  • 它不会通过IP。情况是,你在一个集群中启动 5 个 Redis 容器。你会使用哪一个,或者应该 docker 给你哪一个?因此,如果您使用该名称,那么 docker 可以在那一刻为您提供最好的 redis 容器。如果容器在下一秒死亡,它会给你下一个最好的容器。
  • 终于试了一下,效果不错。太感谢了。我之前一定是关闭了一些其他配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 2018-07-02
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多