Docker EC2&端口绑定

时间:2016-10-12 08:01:58

标签: amazon-web-services networking docker amazon-ec2

我有一个Ubuntu EC2实例。安装当前版本的Docker。

在EC2主机上运行Jenkins container

我正在使用的Docker运行命令是:

docker run \
-d \
-p 9000:8080 \
-p 5000:5000 \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/jenkins

命令成功完成,我的容器已启动。

如果我通过SSH连接到EC2实例curl容器,如:

curl http://localhost:9000

我收到回复。

如果我通过EC2实例公共IP地址尝试相同的操作:

curl http://55.55.55.55:9000

我没有收到回复。

EC2实例安全组9000向任何地方开放,我可以通过以下方式确认它已接受9000上的连接:

telnet 55.55.55.55 9000

哪个能够连接。

所以我的猜测是,似乎实例正在接受9000上的连接,但这些连接并没有传递给Docker。

在Dockerfile中,我可以看到Jenkins默认端口EXPOSE8080的{​​{1}}命令。当我绑定5000时会出现这个问题吗?

非常感谢任何想法或调试,我目前难倒!

还应该指出,不幸的是,将容器绑定到9000不是一个选项。

更新

本地卷曲响应:

8080

<html> <head> <meta http-equiv='refresh' content='1;url=/login?from=%2F'/> <script>window.location.replace('/login?from=%2F');</script> </head> <body style='background-color:white; color:white;'> Authentication required </body></html> 输出:

docker ps

56c3ad9f1085 jenkinsci/jenkins "/bin/tini -- /usr/lo" About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp, 50000/tcp, 0.0.0.0:9000->8080/tcp jenkins 输出

iptables -L -n

Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination DOCKER-ISOLATION all -- 0.0.0.0/0 0.0.0.0/0 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain DOCKER (1 references) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:8080 ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:5000 Chain DOCKER-ISOLATION (1 references) target prot opt source destination RETURN all -- 0.0.0.0/0 0.0.0.0/0 可在此处找到:https://gist.github.com/timothyclifford/f9b51d5528dbe74f491bb7c35153c667

2 个答案:

答案 0 :(得分:1)

听起来有点奇怪..特别是telnet能够连接,但curl不能。 (如果不是那个位,那么我可能会说它可能是一个iptables的东西?)通常,我会达到tcpdump ..大概curl能够建立TCP连接(与telnet相同)但我可以'那么为什么HTTP层会失败呢。在你的ubuntu盒子上安装tcpdump,然后以root身份运行:

tcpdump -nn port 9000

您还可以尝试使用telnet发出HTTP请求并查看是否有效....从您的telnet连接中,只需键入类似

的内容
GET / HTTP/1.1
Host: 55.55.55.55:9000
然后点击输入几次。你应该得到一个HTTP响应。你可以试试这个,例如谷歌,以确保你明白这里应该发生什么:

# telnet www.google.com 80
Trying 216.58.212.132...
Connected to www.google.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.google.com

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.co.uk/?gfe_rd=cr&ei=rfP9V_P9M8_G8AeSsrWwBw
Content-Length: 261
Date: Wed, 12 Oct 2016 08:26:21 GMT

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.uk/?gfe_rd=cr&amp;ei=rfP9V_P9M8_G8AeSsrWwBw">here</A>.
</BODY></HTML>

更新:从你的tcpdump输出,它看起来像是这里可能出现问题的返回路径。 Flags [S.]是握手后的SYN-ACK。你可以在你的本地盒子上tcpdump看看你是否收到了这个数据包?我不认为你需要打开出站端口..防火墙/安全组应该将此视为响应流,所以我有点困惑,但至少你可以看到初始数据包到达。思考....

答案 1 :(得分:0)

经过多次调查,发现问题与内部网络有关。

很奇怪的行为!

对于任何看到类似问题的人,我的建议是尽可能多地测试变量 - 不同的网络/主机/位置。