我正在研究一种微服务架构,其中我们有许多不同的项目,并且所有项目都连接到相同的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 build
和docker-compose up -d
时,它就像一个超级按钮,可以使用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
进行了一些测试。
当我尝试对redis-cli ping
进行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.1
或0.0.0.0
的IP地址从其他容器连接到Redis服务器,但是我可以使用192.168.16.3
进行连接,每次重启Docker容器时,它都会更改。这是什么原因造成的?
答案 0 :(得分:1)
容器具有命名空间网络。每个容器都有其自己的回送接口,以及您连接到的每个网络的容器IP。因此,一个容器中的回送或127.0.0.1是该容器,而不是redis ip。要连接到redis,请在命令中使用服务名称,docker会将其解析为运行redis的容器的ip:
redis:6379