更新:现在我遇到了问题。在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
答案 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所述修复它。
我希望这可以帮助有类似问题的人。