我有一个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默认端口EXPOSE
和8080
的{{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
答案 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&ei=rfP9V_P9M8_G8AeSsrWwBw">here</A>.
</BODY></HTML>
更新:从你的tcpdump输出,它看起来像是这里可能出现问题的返回路径。 Flags [S.]
是握手后的SYN-ACK。你可以在你的本地盒子上tcpdump看看你是否收到了这个数据包?我不认为你需要打开出站端口..防火墙/安全组应该将此视为响应流,所以我有点困惑,但至少你可以看到初始数据包到达。思考....
答案 1 :(得分:0)
经过多次调查,发现问题与内部网络有关。
很奇怪的行为!
对于任何看到类似问题的人,我的建议是尽可能多地测试变量 - 不同的网络/主机/位置。