Docker:将日志发送到本地主机不起作用,但 0.0.0.0 却起作用,为什么?
Docker: sending logs to localhost doesn't work but 0.0.0.0 does work, why?
更新:现在我遇到了问题。当容器在 logstash 之前启动时,UDP 日志不会到达 logstash。根据这个 bug report 这是因为
The linux kernel keeps state of each connection. Even though
udp is connectionless
据我所知,这些连接已被缓存。 Logstash 收到一个新的 IP,因此没有包,当我使用本地主机(而不是 0.0.0.0)时不会发生这种情况,因为 IP 永远不会改变并且 docker 将消息转发到公开的端口。
知道如何让它与 localhost(或服务名称,因为我使用的是 docker swarm)一起工作吗?
我有一个 docker 化的应用程序 (logstash),它发布端口 12201/udp 来侦听日志。这根据 docker documentation
This binds port 8080 of the container to port 80 on 127.0.0.1 of the host machine.
但是,如果我使用 netcat 将消息发送到 localhost:12201/udp,应用程序什么也接收不到。而当我向 0.0.0.0:12201/udp 发送消息时,一切都按预期进行。
为什么?这会引入 performance/security 问题吗?会不会是bug?
据我所知 0.0.0.0 被翻译成机器的所有 ip 地址并且机器有自己的 ip 地址和一些 172..0. addresses/networks docker 根据 the docker container networking documentation.
创建
出于某种原因,发布的端口似乎未映射到本地主机,而是映射到其他网络。我是 运行 我在 swarm 中的应用程序,0.0.0.0 可以在 swarm 中的任何机器上运行。
这里是我撰写文件的相关部分:
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。但是仍然可以从 swarm 外部访问端口 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.
中的描述修复它
我希望这对遇到类似问题的人有所帮助。
更新:现在我遇到了问题。当容器在 logstash 之前启动时,UDP 日志不会到达 logstash。根据这个 bug report 这是因为
The linux kernel keeps state of each connection. Even though udp is connectionless
据我所知,这些连接已被缓存。 Logstash 收到一个新的 IP,因此没有包,当我使用本地主机(而不是 0.0.0.0)时不会发生这种情况,因为 IP 永远不会改变并且 docker 将消息转发到公开的端口。
知道如何让它与 localhost(或服务名称,因为我使用的是 docker swarm)一起工作吗?
我有一个 docker 化的应用程序 (logstash),它发布端口 12201/udp 来侦听日志。这根据 docker documentation
This binds port 8080 of the container to port 80 on 127.0.0.1 of the host machine.
但是,如果我使用 netcat 将消息发送到 localhost:12201/udp,应用程序什么也接收不到。而当我向 0.0.0.0:12201/udp 发送消息时,一切都按预期进行。
为什么?这会引入 performance/security 问题吗?会不会是bug?
据我所知 0.0.0.0 被翻译成机器的所有 ip 地址并且机器有自己的 ip 地址和一些 172..0. addresses/networks docker 根据 the docker container networking documentation.
创建出于某种原因,发布的端口似乎未映射到本地主机,而是映射到其他网络。我是 运行 我在 swarm 中的应用程序,0.0.0.0 可以在 swarm 中的任何机器上运行。
这里是我撰写文件的相关部分:
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。但是仍然可以从 swarm 外部访问端口 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.
中的描述修复它我希望这对遇到类似问题的人有所帮助。