【问题标题】:Can't access docker over the internet无法通过互联网访问 docker
【发布时间】:2014-11-16 03:43:54
【问题描述】:

我正在疯狂地试图让一个 docker 可以通过互联网访问。我在 Ubuntu 14.04 服务器上创建了一个地理服务器容器:

sudo docker run -d -p 80:8080 -t eliotjordan/docker-geoserver

但是当我尝试通过网络浏览器连接到服务器时,连接超时。我知道服务器可以通过它的域名访问,因为我在上面运行一个网站,使用 nginx 作为我停下来尝试这个的网络服务器。

docker ps 确认它正在运行:

$ sudo docker ps
CONTAINER ID        IMAGE                                 COMMAND                CREATED             STATUS              PORTS                  NAMES
0e339661c232        eliotjordan/docker-geoserver:latest   "/bin/sh -c /opt/tom   4 seconds ago       Up 4 seconds        0.0.0.0:80->8080/tcp   sad_morse

netstat表明端口是开放的:

$ sudo netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      31023/postgres  
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1047/master     
tcp        0      0 0.0.0.0:2882            0.0.0.0:*               LISTEN      1339/sshd       
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1067/redis-server 1
tcp6       0      0 ::1:5432                :::*                    LISTEN      31023/postgres  
tcp6       0      0 :::25                   :::*                    LISTEN      1047/master     
tcp6       0      0 :::2882                 :::*                    LISTEN      1339/sshd       
tcp6       0      0 :::80                   :::*                    LISTEN      16267/docker-proxy
udp        0      0 0.0.0.0:60521           0.0.0.0:*                           1271/dhclient   
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1271/dhclient   
udp        0      0 0.0.0.0:161             0.0.0.0:*                           1091/snmpd      
udp6       0      0 :::35967                :::*                                1271/dhclient 

我注意到它只在 ipv6 上显示为打开,所以这可能是问题吗? ufw 已禁用,我想不出还有什么要检查的。

我也尝试通过 nginx 代理它,但结果相同。这里是我使用的配置供参考:

upstream geoserver_server {
    server 127.0.0.1:80;  # I also tried 0.0.0.0:80
}

server {
    listen 80;
    server_name mydomain.com;

    client_max_body_size 4G;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Host $http_host;
        proxy_pass http://geoserver_server;
    }
}

更新

这是我的 iptables 配置:

$ sudo iptables -t nat -nxvL
Chain PREROUTING (policy ACCEPT 127 packets, 9452 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
   84453  4816562 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 127 packets, 9452 bytes)
    pkts      bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 99 packets, 7078 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
       0        0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 99 packets, 7078 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
       0        0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           

Chain DOCKER (2 references)
    pkts      bytes target     prot opt in     out     source               destination         
       0        0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.32:8080

Telnet 在本地连接,但不是从外部连接。同上curl

【问题讨论】:

  • 你试过通过IP访问容器吗?尝试“docker inspect | grep IP”,然后尝试通过 IP 地址访问您的服务器。
  • @dcerecedo 我可以在本地访问容器,例如links http://localhost 给我一个 Tomcat 欢迎屏幕。我只是无法从外部访问它。因此,使用内部 IP 地址将无济于事。使用公网 IP 与使用它所映射的域名相同 - 连接超时。
  • nginx 日志说什么?您的主机上有任何 iptables 规则吗?当你在你的机器上telnet host 80 时会发生什么?
  • @ChrisMcKinnel:我没有手动创建 iptables,而且 docker 规则似乎还可以。我已经向他们更新了我的问题。 Telnet 和 curl 在主机上按预期工作,但从外部 PC 连接超时。
  • nginx 日志有没有给你任何东西?

标签: nginx ip port docker


【解决方案1】:

正如您的 netstat 命令所示,您的 docker 仅在 ipv6 地址的 80 端口上侦听。

一种快速的解决方法是启动容器,明确指定要侦听 IPv4 地址:

sudo docker run -d -p 0.0.0.0:80:8080 -t eliotjordan/docker-geoserver

【讨论】:

  • 它也在侦听 IPv4 地址的 80 端口,尽管您没有看到 IPv4 的特定条目。
  • 你如何解释 OP 在问题中报告的 netstat 命令的结果?为什么对于其他端口,ipv4 和 ipv6 地址都显示为正在侦听?这种行为也被描述为docker bug
  • 我运行的一个 docker 的输出相同,它也在侦听 IPv4。我不知道为什么这是输出;但是当我看到你说的时候,我想到了你说的,直到我发现它是错误的。在这里,您可以看到关于同一主题的示例和另一个答案,并带有通用解释:askubuntu.com/questions/488299/…
  • 我刚刚在 Ubuntu 14.04 上试了一下,你是对的,我重现了相同的 netstat 结果,并且仍然可以通过 IPv4 地址访问端口 80 上的 docker 容器。你认为我应该如何处理我的回答?删除或保留它,因为它可以帮助其他人不要像我一样被愚弄?
  • 也许最好的办法是编辑它,以便您清楚地解释哪个是我们/您的错误,因此其他人不会对此感到困惑。
【解决方案2】:

您只看到 ipv6 应该不是问题,您的服务器也在侦听 ipv4 请求。你能在你的容器中运行 netstat 和 ifconfig 并发布结果吗?

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 2019-08-01
    • 2016-02-20
    • 2019-08-23
    • 2020-10-18
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多