【发布时间】: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 日志有没有给你任何东西?