我正在开发一个微服务架构,其中我们有许多不同的项目,并且所有项目都连接到相同的Redis实例。我想将此架构移至Docker以在开发环境上运行。由于所有项目都有单独的存储库,所以我不能仅使用一个docker-compose.yml文件将它们全部连接起来。经过研究后,我发现可以创建一个共享的外部网络来连接所有项目,因此我首先创建了一个网络:
docker network create common_network
我为诸如mongodb,redis,rabbitmq(所有项目使用的服务)之类的通用服务创建了一个单独的项目。这是该项目的示例docker-compose文件:

version: '3'
services:
  redis:
    image: redis:latest
    container_name: test_project_redis
    ports:
      - "6379:6379"
    networks:
      - common_network

networks:
  common_network:
    external: true

现在,当我运行docker-compose builddocker-compose up -d时,它就像一个 super 按钮一样工作,我可以使用127.0.0.1:6379从本地计算机连接到Redis。但是当我尝试从另一个容器连接到此Redis容器时出现问题。

这是另一个运行Node.js的项目的另一个示例docker-compose.yml(我没有放置Dockerfile,因为它与该问题无关)
version: '3'
services:
  api:
  build: .
  container_name: sample_project_api
  networks:
    - common_network

networks:
  common_network:
    external: true

当我也构建并运行此docker-compose时没有问题,但是Node.js项目出现CONNREFUSED 127.0.0.1:6379错误,显然它无法通过127.0.0.1连接到Redis服务器

因此,我在api容器(docker exec -i -t sample_project_api /bin/bash)中打开了一个实时ssh并安装了redis-tools进行了一些测试。

当我尝试ping redis-cli ping时,它将返回Could not connect to Redis at 127.0.0.1:6379: Connection refused

我使用docker network inspect common_network检查了外部网络,以查看是否所有容器都已正确连接到该网络。没问题,所有容器都在“容器”下列出,从那里我注意到sample_project_redis容器的ip地址为192.168.16.3作为最终解决方案,我尝试使用redis容器的内部ip地址:

从sample_project_api容器中,我运行redis-cli -h 192.168.16.3 ping,并返回其有效的PONG。
所以我的问题是我无法使用127.0.0.10.0.0.0的IP地址从其他容器连接到Redis服务器,但是我可以使用192.168.16.3进行连接,每次重启Docker容器时,它都会更改。这背后的原因是什么?

最佳答案

容器具有命名空间网络。每个容器都有其自己的回送接口(interface),以及您连接到的每个网络的容器IP。因此,一个容器中的回送或127.0.0.1是该容器,而不是redis ip。要连接到redis,请在您的命令中使用服务名称,docker会将其解析为运行redis的容器的ip:

redis:6379

关于docker - 使用外部网络连接Docker容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51593484/

10-16 23:52