无法通过互联网访问docker

时间:2014-09-22 08:26:24

标签: 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        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在本地连接,但不在外部连接。同上curl

2 个答案:

答案 0 :(得分:0)

只有ipv6才会出现问题,您的服务器也在监听ipv4请求。你能在容器中运行netstat和ifconfig并发布结果吗?

答案 1 :(得分:-2)

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

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

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