Nginx Can';t通过internet访问docker

Nginx Can';t通过internet访问docker,nginx,ip,port,docker,Nginx,Ip,Port,Docker,我要疯了,想让码头工人通过互联网访问。我在Ubuntu 14.04服务器上创建了一个geoserver容器,使用: sudo docker run -d -p 80:8080 -t eliotjordan/docker-geoserver 但当我试图通过web浏览器连接到服务器时,连接超时。我知道该服务器可以通过其域名访问,因为我正在其上运行一个网站,使用nginx作为web服务器,我停止了尝试 docker ps确认它正在运行: $ sudo docker ps CONTAINER ID

我要疯了,想让码头工人通过互联网访问。我在Ubuntu 14.04服务器上创建了一个geoserver容器,使用:

sudo docker run -d -p 80:8080 -t eliotjordan/docker-geoserver
但当我试图通过web浏览器连接到服务器时,连接超时。我知道该服务器可以通过其域名访问,因为我正在其上运行一个网站,使用nginx作为web服务器,我停止了尝试

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上显示为open,所以这可能是问题所在吗
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
在本地连接,但不从外部连接。同上,正如netstat命令所示,docker只监听ipv6地址上的端口80

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

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

正如netstat命令所示,docker只监听ipv6地址上的端口80

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

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


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

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

是否尝试通过IP访问容器?请尝试“docker inspect | grep IP”,然后尝试通过IP地址访问服务器。@dcerecedo我可以在本地访问容器,例如
链接http://localhost
给我一个Tomcat欢迎屏幕。我就是不能从外面接近它。因此,使用内部IP地址没有帮助。使用公共IP与使用它映射到的域名相同-连接超时。nginx日志怎么说?您的主机上有任何iptables规则吗?当你从你的机器上
telnet主机80
时会发生什么?@ChrisMcKinnel:我没有手动创建的iptables,docker规则似乎还可以。我已经用他们更新了我的问题。Telnet和curl在主机上正常工作,但在外部PC上连接超时。nginx日志是否提供了任何信息?您是否尝试过通过IP访问容器?请尝试“docker inspect | grep IP”,然后尝试通过IP地址访问服务器。@dcerecedo我可以在本地访问容器,例如
链接http://localhost
给我一个Tomcat欢迎屏幕。我就是不能从外面接近它。因此,使用内部IP地址没有帮助。使用公共IP与使用它映射到的域名相同-连接超时。nginx日志怎么说?您的主机上有任何iptables规则吗?当你从你的机器上
telnet主机80
时会发生什么?@ChrisMcKinnel:我没有手动创建的iptables,docker规则似乎还可以。我已经用他们更新了我的问题。Telnet和curl在主机上正常工作,但在外部PC上连接超时。nginx日志是否提供了任何信息?它也在侦听IPv4地址的端口80,尽管您没有看到IPv4的特定条目。然后如何解释问题中OP报告的
netstat
命令的结果?为什么对于其他端口,ipv4和ipv6地址都显示为侦听?此外,这种行为被描述为:我运行的一个docker具有相同的输出,并且它也在IPv4上侦听。我不知道为什么这是输出;但当我看到你说的话时,我一直在想,直到我发现那是错的。在这里,您可以看到关于同一主题的一个示例和另一个答案,并给出了一般性解释:。我刚刚在Ubuntu 14.04上进行了一次尝试,您是对的,我复制了相同的
netstat
结果,仍然可以通过IPv4地址访问端口80上的docker容器。你认为我的答案该怎么办?删除或保留它,因为它可以帮助其他人避免像我一样被愚弄?也许最好的办法是编辑它,以便您清楚地解释哪一个是我们/您的错误,这样其他人就不会对此感到困惑。它也在侦听IPv4地址的端口80,虽然您没有看到IPv4的特定条目,但如何解释问题中OP报告的
netstat
命令的结果?为什么对于其他端口,ipv4和ipv6地址都显示为侦听?此外,这种行为被描述为:我运行的一个docker具有相同的输出,并且它也在IPv4上侦听。我不知道为什么这是输出;但当我看到你说的话时,我一直在想,直到我发现那是错的。在这里,您可以看到关于同一主题的一个示例和另一个答案,并给出了一般性解释:。我刚刚在Ubuntu 14.04上进行了一次尝试,您是对的,我复制了相同的
netstat
结果,仍然可以通过IPv4地址访问端口80上的docker容器。你认为我的答案该怎么办?删除它或保留它,因为它可以帮助其他人不要像我一样被愚弄?也许最好的办法是编辑它,以便你清楚地解释哪一个是我们/你的错误,这样其他人就不会对此感到困惑。