Docker:将日志发送到localhost不起作用,但0.0.0.0确实有效,为什么?

时间:2017-04-26 09:09:50

标签: networking logging docker elastic-stack docker-swarm

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

  

linux内核保持每个连接的状态。即使   udp是无连接的

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

我知道如何使用localhost(或者因为我使用的是docker swarm而使用服务名称)?

我有一个dockerized应用程序(logstash),它发布端口12201 / udp来监听日志。这符合docker documentation

  

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

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

为什么呢?这会引入性能/安全问题吗?这可能是个错误吗?

据我所知,0.0.0.0被转换为机器的所有IP地址,机器有自己的IP地址和一些172. .0。地址/网络码头根据the docker container networking documentation.

出于某种原因,似乎已发布的端口未映射到localhost,而是映射到其他网络。我正在群中运行我的应用程序,0.0.0.0可以从群集中的任何计算机上运行。

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

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

1 个答案:

答案 0 :(得分:1)

我找到了避免使用0.0.0.0的方法。我现在发布127.0.0.1:12201:12201/udp。我现在可以从群中的任何机器使用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"

剩下的问题是在logstash被终止并重新启动后日志没有到达。这是因为conntrack跟踪连接(在linux中)虽然udp是无连接的,应该可以按照here所述修复它。

我希望这可以帮助有类似问题的人。