2017-09-14 49 views
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 

爲什麼不暴露的端口映射到實例?

注:我必須將其作爲單個容器環境運行,因此請不要建議使用多容器。

回答

-1

你公開端口的方式是錯誤的。這項工作應如下:

EXPOSE 8125 

然後運行它爲:

docker run -p 8125:8125 mycontainer 
+0

我知道這一點,但我通過彈性魔豆部署我的整個系統 - 自動啓動碼頭集裝箱。我猜想有一種方法可以用'docker run'參數來配置Beanstalk,但是我不知道如何... –

+0

說實話,我從來沒有使用它,但是,他們提供的例子在這裏:http:///docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_dockerpreconfig.walkthrough.html也是爲了實現這一點,您可能希望將容器鏈接在一起,因此,他們將能夠彼此交談而不映射任何內容。 – Sergiu

+0

不幸的是,EB並沒有完全滿足這個特定用例的需求。我無法爲此運行多容器環境,因爲我需要UDP支持,而ELB缺少UDP支持。所以我被困在一個容器環境中。我感到震驚的是,EB缺乏對開發人員定義Docker容器啓動方式的支持。 –