使用外部网络连接Docker容器

时间:2018-07-30 11:58:05

标签: docker docker-compose

我正在研究一种微服务架构,其中我们有许多不同的项目,并且所有项目都连接到相同的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时,它就像一个超级按钮,可以使用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.10.0.0.0的IP地址从其他容器连接到Redis服务器,但是我可以使用192.168.16.3进行连接,每次重启Docker容器时,它都会更改。这是什么原因造成的?

1 个答案:

答案 0 :(得分:1)

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

redis:6379