Networking Docker:向localhost发送日志不需要';不起作用,但0.0.0.0起作用,为什么?

Networking Docker:向localhost发送日志不需要';不起作用,但0.0.0.0起作用,为什么?,networking,logging,docker,elastic-stack,docker-swarm,Networking,Logging,Docker,Elastic Stack,Docker Swarm,更新:现在我有一个问题。当容器在logstash之前启动时,UDP日志不会到达logstash。根据这一点,这是因为 linux内核保存每个连接的状态。尽管 udp是无连接的 据我所知,这些连接是缓存的。Logstash接收到一个新的IP,因此没有包,当我使用localhost(而不是0.0.0.0)时不会发生这种情况,因为该IP永远不会更改,docker会将消息转发到公开的端口 你知道我如何让它与localhost(或者我使用docker swarm后的服务名)一起工作吗 我有一个停靠的应用

更新:现在我有一个问题。当容器在logstash之前启动时,UDP日志不会到达logstash。根据这一点,这是因为

linux内核保存每个连接的状态。尽管 udp是无连接的

据我所知,这些连接是缓存的。Logstash接收到一个新的IP,因此没有包,当我使用localhost(而不是0.0.0.0)时不会发生这种情况,因为该IP永远不会更改,docker会将消息转发到公开的端口

你知道我如何让它与localhost(或者我使用docker swarm后的服务名)一起工作吗


我有一个停靠的应用程序(logstash),它发布端口12201/udp来侦听日志。这符合

这会将容器的端口8080绑定到主机127.0.0.1上的端口80

但是,如果我使用netcat向localhost:12201/udp发送消息,应用程序将不会收到任何消息。然而,当我向0.0.0.0:12201/udp发送消息时,一切都按预期工作

为什么?这是否会带来性能/安全问题?这可能是一个bug吗?

据我所知,0.0.0.0被翻译成机器的所有ip地址,机器有自己的ip地址和一些172..0。docker根据创建的地址/网络

出于某种原因,发布的端口似乎没有映射到localhost,而是映射到其他网络。我在swarm中运行我的应用程序,0.0.0.0可以在swarm上的任何机器上运行

 logstash:
    image: docker.elastic.co/logstash/logstash:5.3.1
    logging:
      driver: "json-file"
    networks:
      - logging
    ports:
      - "127.0.0.1:12201:12201/udp"

下面是我的撰写文件的相关部分:

networks:
  logging:

volumes:
    logging_data:

services:
  logstash:
    image: docker.elastic.co/logstash/logstash:5.3.1
    logging:
      driver: "json-file"
    networks:
      - logging
    ports:
      - "12201:12201"
      - "12201:12201/udp"
    entrypoint: logstash -e 'input { gelf { } } output { stdout{ } elasticsearch { hosts => ["http://elasticsearch:9200"] } }'
    depends_on:
      - elasticsearch


    test:
    image: ubuntu
    networks:
      - logging
    logging:
      driver: gelf
      options:
        gelf-address: "udp://0.0.0.0:12201"
        tag: "log-test-tagi-docker"
    entrypoint: /bin/sh -c 'while true; do date +%H:%M:%S:%3N ; sleep 1; done'
    depends_on:
      - logstash
      - elasticsearch

我找到了一种避免使用0.0.0.0的方法。我现在发布127.0.0.1:12201:12201/udp。我现在可以从swarm中的任何机器使用127.0.0.1,而不是0.0.0.0。但是,端口12201仍然可以从集群外部访问

 logstash:
    image: docker.elastic.co/logstash/logstash:5.3.1
    logging:
      driver: "json-file"
    networks:
      - logging
    ports:
      - "127.0.0.1:12201:12201/udp"
仍然存在的问题是,日志存储被终止并重新启动后,日志不会到达。这是因为conntrack跟踪一个连接(在linux中),尽管udp是无连接的,应该可以按照描述修复它

我希望这能帮助有类似问题的人