服务访问127.0.0.1上的其他服务?

时间:2018-02-06 11:29:35

标签: docker docker-compose

我希望我的Web Docker容器能够从Web容器中访问127.0.0.1:6379上的Redis。我已将Docker Compose文件设置如下。我得到了ECONNREFUSED

version: "3"

services:
  web:
    build: .
    ports:
      - 8080:8080
    command: ["test"]
    links:
      - redis:127.0.0.1
  redis:
    image: redis:alpine
    ports: 
      - 6379

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

对此的简短回答是“不要”。 Docker容器每个都有自己的loopback接口127.0.0.1,它与主机环回和其他容器分开。你无法重新定义127.0.0.1,如果可以,那几乎肯定会破坏其他东西。

有一种技术上可行的方法,可以通过直接在主机上运行所有容器来实现:

network_mode: "host"

但是,这会删除容器所需的docker网络隔离。

您还可以将一个容器附加到另一个容器的网络(因此它们具有相同的环回接口):

docker run --net container:$container_id ...

但是我不确定在docker-compose中是否存在这样做的语法,并且它在群集模式下不可用,因为容器可能在不同的节点上运行。我对此语法的主要用途是附加网络调试工具,如nicolaka/netshoot

您应该做的是将redis数据库的位置作为webapp容器的配置参数。将位置作为环境变量,配置文件或命令行参数传递。如果Web应用程序无法直接支持此功能,请使用在启动Web应用程序之前运行的入口点脚本更新配置。这会将您的撰写yml文件更改为:

version: "3"

services:
  web:
    # you should include an image name
    image: your_webapp_image_name
    build: .
    ports:
      - 8080:8080
    command: ["test"]
    environment:
      - REDIS_URL=redis:6379

    # no need to link, it's deprecated, use dns and the network docker creates
    #links:
    #  - redis:127.0.0.1
  redis:
    image: redis:alpine
    # no need to publish the port if you don't need external access
    #ports: 
    #  - 6379