【问题标题】:Service name not resolved in docker-compose network服务名称未在 docker-compose 网络中解析
【发布时间】:2022-06-15 23:27:00
【问题描述】:

我正在使用 docker-compose 运行一些容器,并在容器之间进行一些通信。更具体地说,microservice 容器完成所有实际工作,另一个容器运行 Redis 服务器,我将日志记录分离到另一个容器。这一切都在 nginx 反向代理之后。

docker-compose.yml 文件如下所示(稍微简化,名称已更改):

version: '3'

services:

  # nginx
  reverse-proxy:
    image: nginx:1.17.10
    container_name: reverse_proxy_nginx
    depends_on:
        - microservice
    volumes:
      - ./NginxService/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 7300:7300
  
  # microservice
  microservice:
    image: microservice-image
    container_name: microservice-container
    build:
      context: ./Microservice
    ports:
      - 6300:7500
  
  # redis database
  redis:
    image: "redis:alpine"
    ports:
      - 6379:6379

  # logger process
    logger:
      image: logger-image:latest
      container_name: logger-container
      ports:
        - 6901:6901

当我用docker-compose up 启动swarm 时,redismicroservice 之间有完美的通信,我的代码可以按预期访问redis:6379 的redis 服务器。 (我使用的是 python redis 客户端,StrictRedis,但不确定是否相关)。

但是,与logger 的通信无法正常工作,没有消息到达logger:6901。我正在使用 python 日志记录模块,SocketHandler 应该从microservice 容器与记录器容器中的socketserver.ThreadingTCPServer 通信(遵循此配方:https://docs.python.org/3/howto/logging-cookbook.html#sending-and-receiving-logging-events-across-a-network)。

当我在容器外运行所有进程(所以主机是localhost)时,一切正常。所以我认为我的流程很好,只是网络是问题所在。另外,如果我直接提供虚拟机的 IP,并公开6901 端口,那么我再次与记录器进行了完美的通信,所以它只发生在 docker-compose 网络中。

我能够在 docker-container 网络上的 loggermicroservice 之间进行通信的唯一方法是在 .yml 文件中显式定义一个网络,并为 logger 提供别名。 (我在下面的答案中添加了 yml 配置文件。)

我希望:

  • redislogger 的服务名称解析方式相同,但只有前者有效。
  • 服务名称被解析为别名,但只有别名有效。

为什么?

【问题讨论】:

    标签: docker docker-compose tcp network-programming


    【解决方案1】:

    解决方法是在 docker-compose 配置文件中显式定义网络,并为 logger 服务定义别名。现在我可以在loggeralias:6901上交流了。

    配置文件:

    version: '3'
    
    services:
    
      # nginx
      reverse-proxy:
        image: nginx:1.17.10
        networks:
          - customnetwork
        container_name: reverse_proxy_nginx
        depends_on:
            - microservice
        volumes:
          - ./NginxService/nginx.conf:/etc/nginx/nginx.conf
        ports:
          - 7300:7300
      
      # microservice
      microservice:
        image: microservice-image
        networks:
          - customnetwork
        container_name: microservice-container
        build:
          context: ./Microservice
        ports:
          - 6300:7500
      
      # redis database
      redis:
        image: "redis:alpine"
        networks:
          - customnetwork
        ports:
          - 6379:6379
    
      # logger process
        logger:
          image: logger-image:latest
          networks:
            customnetwork:
              aliases:
                - "loggeralias"
          container_name: logger-container
          ports:
            - 6901:6901
    networks:
      customnetwork:
    

    虽然这解决了问题,但我仍然不明白为什么会这样,而 logger:6901 却没有,所以我希望看到更好的答案。

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多