docker工人:发送日志到本地主机不起作用,但0.0.0.0确实工作,为什么?

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

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

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

任何想法如何使它与本地主机(或服务名称,因为我使用docker群)工作?


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

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

但是,如果我发送消息与netcat到本地主机:12201 / udp应用程序收到什么。 而当我发送消息到0.0.0.0:12201/udp一切按预期工作。

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

据我所知0.0.0.0被翻译成机器的所有IP地址,机器有自己的IP地址和一些172.0 docker根据Docker容器联网文档创build的地址/networking。

出于某种原因,似乎发布的端口不是映射到本地主机,而是一些其他networking。 我正在群中运行我的应用程序,并且从群中的任何机器运行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 

我find了一种避免使用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" 

仍然存在的问题是,在logstash被终止并重新启动后,日志不会到达。 这是因为conntrack跟踪连接(在Linux中),虽然udp是无连接的,应该可以按照这里所述来修复它。

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