从一个 Docker 容器记录到另一个
Posted
技术标签:
【中文标题】从一个 Docker 容器记录到另一个【英文标题】:Logging from one Docker Container to Another 【发布时间】:2016-08-13 15:59:31 【问题描述】:在我的 ubuntu 16.04 主机上尝试连接两个容器时,我无法从一个容器向另一个容器发送消息,而主机上的地址可用。
我启动了一个容器(由syslog-ng
提供系统日志服务):
docker run -d -p 127.0.0.1:515:514/udp --name syslog-ng bobrik/syslog-ng
此容器定义在:https://github.com/bobrik/docker-syslog-ng。根据https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/configuring-sources-network.html syslog-ng.conf 中的udp(ip(0.0.0.0), port(514));
应该可以接受所有的ip-connections。
现在我可以使用以下命令从主机登录到容器:
logger -n 127.0.0.1 -P 515 test123
第二个容器被启动(一次使用--link
,一次没有)
docker run -it --link syslog-ng ubuntu /bin/bash
在这两种情况下,容器都无法使用日志记录,即
logger -n 127.0.0.3 -P 515
不返回错误消息,但也不会将消息添加到日志中。 (在链接容器的情况下也使用 127.0.0.1 和 syslog-ng 进行了尝试)。
所以问题是:为什么无法登录容器?
如果我启动另一个容器,它们都在同一个网络上,docker network inspect bridge
返回:
[
"Name": "bridge",
"Id": "6836c8a52555f30f27001daf9b111ad41a035a31783250e043c34602ea83cfe3",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM":
"Driver": "default",
"Options": null,
"Config": [
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
]
,
"Internal": false,
"Containers":
"3acef55e018280571410b63b0cb7314ba354b67fb6523662b48ad09be8424423":
"Name": "syslog-ng",
"EndpointID": "d6f2ad9cc9b5f6a5030e6061c4abb600ff7b0f16711f169954dd446f1351cb08",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
,
"4f7d0101f97dca63b160e16a5e298c45f2ff51aa35085d0cdec96497a598be1a":
"Name": "goofy_lamarr",
"EndpointID": "e357d6a99f67964bac4619d1ac984cd361a9c39137ea8d67a1ebc641e498919b",
"MacAddress": "02:42:ac:11:00:05",
"IPv4Address": "172.17.0.5/16",
"IPv6Address": ""
,
"Options":
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
,
"Labels":
]
这是我尝试登录的 ubuntu 容器上的 /etc/hosts
:
cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 syslog-ng 3acef55e0182
172.17.0.5 4f7d0101f97d
所以 syslog-ng 应该可以与 syslog-ng 或 172.17.0.3 一起使用。
如果我正确理解https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/,那么链接应该可以直接登录到syslog-ng
,并且没有链接,我应该仍然能够将消息从一个容器发送到暴露端口的容器ip,根据https://docs.docker.com/engine/userguide/networking/。
这似乎与:Logging from one docker container to another 相同,但没有提供具体容器。
有人知道为什么无法进行此日志记录吗?
【问题讨论】:
【参考方案1】:它有效。问题出在端口号(515)上,使用以下命令:
docker run -d -p 127.0.0.1:515:514/udp --name syslog-ng bobrik/syslog-ng
您说可以从具有 127.0.0.1:515 的主机访问内部端口 514。但是如果你想直接从另一个容器访问容器,你可以使用 syslog-ng:514 或 172.17.0.2:514 访问它:
所以正确的记录器将是:
logger -n syslog-ng -P 514 test123345
希望对你有帮助
兄弟,
老鼠
【讨论】:
谢谢,这就是问题所在!容器似乎通过其“正常”端口在其网络内部进行通信,而暴露的端口仅在主机上使用。以上是关于从一个 Docker 容器记录到另一个的主要内容,如果未能解决你的问题,请参考以下文章
如何在 docker 中从一个容器获取数据到另一个容器?我收到 ECONNREFUSED 错误
nginx 容器 proxy_pass 到另一个 docker 容器