0
嘗試使用Influx的Telegraf運行Statsd Docker容器。該Dockerfile是超級簡單:Elastic Beanstalk單碼頭集裝箱 - UDP端口暴露,但未映射到EC2實例
FROM telegraf:latest
# Configure Telegraf
ADD telegraf.conf /etc/telegraf/
# Expose the statsd port
EXPOSE 8125:8125
# Start the service
CMD telegraf
注:在端口8125
的暴露端口當我運行一個docker ps -a
我可以看到,端口確實暴露:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8398e36c4e48 e26197bce0cc "/entrypoint.sh /b..." 16 hours ago Up 16 hours 8094/tcp, 8092/udp, 8125/udp, 8125/tcp inspiring_goodall
問題是他們沒有被映射。從docker inspect <ID>
,我可以看到從網絡設置如下:通過測試
"Ports": {
"8092/udp": null,
"8094/tcp": null,
"8125/tcp": null,
"8125/udp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8125"
}
]
}
我可以驗證這一切,如果數據包做:
"Ports": {
"8092/udp": null,
"8094/tcp": null,
"8125/tcp": null,
"8125/udp": null
}
如果我是正確的,那麼就應該像這樣的事情將其發送到EC2實例,然後在碼頭容器中。
一個實例本身(而不是在容器內),我可以通過tcpdump
像這樣監控流量的數據包,並看到該實例是閱讀UDP包在端口8125:
[[email protected]_HOTNAME ec2-user]# tcpdump -n udp port 8125
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
10:34:56.190739 IP BLOCKED_HOSTNAME > BLOCKED_HOSTNAME: UDP, length 46
10:34:57.199689 IP BLOCKED_HOSTNAME > BLOCKED_HOSTNAME: UDP, length 46
10:34:58.179673 IP BLOCKED_HOSTNAME > BLOCKED_HOSTNAME: UDP, length 46
但是當我docker exec
倒入容器中,並運行tcpdump
我什麼也沒有 - 它只是坐在這裏:
[email protected]:/# tcpdump -i eth0 -n udp port 8125
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
爲什麼不暴露的端口映射到實例?
注:我必須將其作爲單個容器環境運行,因此請不要建議使用多容器。
我知道這一點,但我通過彈性魔豆部署我的整個系統 - 自動啓動碼頭集裝箱。我猜想有一種方法可以用'docker run'參數來配置Beanstalk,但是我不知道如何... –
說實話,我從來沒有使用它,但是,他們提供的例子在這裏:http:///docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_dockerpreconfig.walkthrough.html也是爲了實現這一點,您可能希望將容器鏈接在一起,因此,他們將能夠彼此交談而不映射任何內容。 – Sergiu
不幸的是,EB並沒有完全滿足這個特定用例的需求。我無法爲此運行多容器環境,因爲我需要UDP支持,而ELB缺少UDP支持。所以我被困在一個容器環境中。我感到震驚的是,EB缺乏對開發人員定義Docker容器啓動方式的支持。 –