我疯狂地试图通过互联网访问码头。我使用以下方法在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
。
答案 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