Docker - 无法从外部访问docker端口

时间:2016-05-28 16:39:19

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

所以我创建了一个新的EC2实例并在其上安装了docker。

我从(https://github.com/commonsearch/cosr-front/blob/master/INSTALL.md)部署代码并按照安装说明进行操作。

安装成功,我启动了服务器:

[ec2-user@ip-172-30-0-127 cosr-front]$ make docker_devserver
docker run -e DOCKER_HOST --rm -v "/home/ec2-user/cosr-front:/go/src/github.com/commonsearch/cosr-front:rw" -w /go/src/github.com/commonsearch/cosr-front -p 9700:9700 -i -t commonsearch/local-front make devserver
mkdir -p build
go build -o build/cosr-front.bin ./server
GODEBUG=gctrace=1 COSR_DEBUG=1 ./build/cosr-front.bin
2016/05/28 16:32:38 Using Docker host IP: 172.17.0.1
2016/05/28 16:32:38 Server listening on 127.0.0.1:9700 - You should open http://127.0.0.1:9700 in your browser!

好吧,现在当我想从外面访问它时,我不能!甚至没有卷曲本地服务器。

当我运行docker ps时,它会给我正确的端口转发:

[ec2-user@ip-172-30-0-127 ~]$ docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS                                              NAMES
1a9f77e1eeb1        commonsearch/local-front                    "make devserver"         4 minutes ago       Up 4 minutes        0.0.0.0:9700->9700/tcp                             stoic_hopper
9ff00fe3e70d        commonsearch/local-elasticsearch-devindex   "/docker-entrypoint.s"   4 minutes ago       Up 4 minutes        0.0.0.0:39200->9200/tcp, 0.0.0.0:39300->9300/tcp   kickass_wilson

这些是我的码头图片:

REPOSITORY                                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>                                      <none>              3e205118cd3f        17 minutes ago      853.3 MB
<none>                                      <none>              1d233da1fa59        2 hours ago         955.7 MB
debian                                      jessie              ce58426c830c        4 days ago          125.1 MB
commonsearch/local-front                    latest              30de7ab48d43        7 weeks ago         1.024 GB
commonsearch/local-elasticsearch-devindex   latest              b1156ada5a24        11 weeks ago        383.2 MB
commonsearch/local-elasticsearch            latest              808e72f49b4a        3 months ago        355.2 MB

我试过禁用ipv6并且所有类型的废话谷歌都提供给我,但没有成功。

有什么想法吗?

编辑:

另外,如果我输入前端的docker容器(使用docker exec),那么我可以PING和CULR前端。

但我不能从外面(也不是ssh,而不是我家用电脑使用浏览器)。

我的泊坞版:

Client:
 Version:      1.9.1
 API version:  1.21
 Go version:   go1.4.2
 Git commit:   a34a1d5/1.9.1
 Built:        
 OS/Arch:      linux/amd64

Server:
 Version:      1.9.1
 API version:  1.21
 Go version:   go1.4.2
 Git commit:   a34a1d5/1.9.1
 Built:        
 OS/Arch:      linux/amd64

2 个答案:

答案 0 :(得分:4)

我在github发了一个问题,因为一个人救了一天。

这是他的回应:

服务器侦听127.0.0.1:9700 您的应用程序正在侦听localhost。 localhost的范围限定为容器本身。因此,为了能够连接到它,您必须在容器内。 要解决此问题,您需要让应用程序在0.0.0.0上进行侦听。

答案 1 :(得分:1)

127.0.0.1是本地(EC2)实例的环回地址。我刚刚按照相同的说明重新创建了您的问题,并在EC2实例的docker容器中设置了服务器。

如果你打开另一个ssh会话到你的EC2实例,你可以卷曲环回地址,它只是吐出下面显示的HTML。

<!DOCTYPE html><html lang="en"><head><title>
      Common Search
    </title><meta content="/apple-touch-icon-precomposed.png" itemprop="image"><link href="/favicon.ico" rel="shortcut icon"><!-- CSS: This will be replaced in templates.go:preprocessTemplate() by the inline, compiled CSS
              if the file build/static/css/index.css exists --><link rel="stylesheet" href="/css/global.css"/><link rel="stylesheet" href="/css/header.css"/><link rel="stylesheet" href="/css/footer.css"/><link rel="stylesheet" href="/css/hits.css"/><link rel="stylesheet" href="/css/responsive.css"/><!-- ENDCSS --><meta name="viewport" content="width=device-width, initial-scale=1"></head><body  class="full"><header id="h"><div class="about"><a href="https://about.commonsearch.org/" tabindex="1">About</a></div><form id="f" action="/" method="GET" data-init="{&#34;q&#34;:&#34;&#34;,&#34;p&#34;:1,&#34;g&#34;:&#34;&#34;}"><a href="/" id="logo" tabindex="2">Common Search</a><div id="w"><div id="qw"><input id="q" name="q" type="text" size="60" value="" autofocus tabindex="3"/></div><span id="g"><select name="g" tabindex="4"><option  value="ar">AR</option><option  value="de">DE</option><option selected value="en">EN</option><option  value="es">ES</option><option  value="fr">FR</option><option  value="it">IT</option><option  value="ja">JA</option><option  value="ko">KO</option><option  value="nl">NL</option><option  value="pl">PL</option><option  value="pt">PT</option><option  value="ru">RU</option><option  value="vi">VI</option><option  value="zh">ZH</option><option  value="all">ALL</option></select></span><input id="s" type="submit" value="&#x1f50d;" tabindex="5"/></div></form></header><div id="hits"></div><div id="dbg"></div><div id="pager" data-page="1"></div><script src="/js/index.js" type="text/javascript"></script></body></html>

但我怀疑这是你真正想要的......

如果您希望能够从您(或任何其他)计算机访问托管服务器,则需要编辑EC2实例的安全组。

在AWS控制台左侧的导航栏中,选择“网络和电子邮件”。安全 - &gt;安全组。选择适用于当前EC2实例的安全组(假设您使用启动向导创建它,它将具有如下名称:'launch-wizard-1 created 2016-05-28T12:57:23.487-04:00') 。在控制台的下半部分,选择“入站”选项卡。编辑新规则以允许来自任何(或特定范围)IP的端口9700上的TCP。生成的条目应如下所示:AWS Security Group Rule Example

我的TCP规则设置为允许来自该端口上任意IP地址的入站流量,出于安全考虑,您可能希望以不同方式对其进行配置。

设置规则后,您应该能够在EC2实例的公共IP上访问Web服务器(可以在AWS控制台的Instances页面上找到)。您应该访问的地址应为:9700

希望这有帮助!