无法访问nginx docker映像

无法访问nginx docker映像,nginx,docker,Nginx,Docker,我是docker的新手,在运行nginx时遇到了一些问题。 这一切似乎都是正确的。可以使用“curl”从主机访问nginx。 iptables为docker虚拟接口设置了新规则 但从互联网上无法访问nginx 我正在使用debian(杰西) docker是一个新版本 Docker version 17.03.1-ce, build c6d412e netstat正在提供 Proto Recv-Q Send-Q Local Address Foreign Address

我是docker的新手,在运行nginx时遇到了一些问题。 这一切似乎都是正确的。可以使用“curl”从主机访问nginx。 iptables为docker虚拟接口设置了新规则

但从互联网上无法访问nginx

我正在使用debian(杰西)

docker是一个新版本

Docker version 17.03.1-ce, build c6d412e
netstat正在提供

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN     
tcp        0    216 X.X.X.X:22              X.X.X.X:64103      VERBUNDEN  
tcp6       0      0 :::443                  :::*                    LISTEN     
tcp6       0      0 :::514                  :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
iptables规则如下

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION
-N fail2ban-pam-generic
-N fail2ban-ssh
-N fail2ban-ssh-ddos
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 25 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 465 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 587 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 110 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 995 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 143 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 993 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 443 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
正如您所看到的,在另一个子网上已经有了规则。这是我使用普通LXC的旧虚拟基础架构

这会让我遇到麻烦吗

谢谢大家的帮助
大卫

好的,让我们得出第一个结论:

在LXC容器中运行Web服务器并使用iptables进行端口转发没有问题。一切正常。干得好

如果我尝试对docker进行同样的操作,则无法从外部访问Web服务器,即使iptables设置正确并且docker正在公开端口。不行

停止所有容器(LXC和docker)并运行裸机Web服务器需要在iptables中指定指向外部IP地址的规则。而不是从互联网上获取

那么,除了docker nginx图像之外,为什么所有东西都能正常工作呢

非常奇怪:-(

编辑: 好的,我有了!!在杀死所有LXC和docker容器、刷新iptables并停止fail2ban之后!!一切都正常工作。即使最终启动fail2ban


这对我来说意味着:让docker为您管理所有iptables规则。我对iptables的了解不够深入,但如果您的docker链“之前”有一个转发链,则会产生问题。

但如果您的应用程序在主机上的特定端口上可见,则您只需打开此端口(在主机上)在我看来,docker本身没什么可做的了。下面是我如何向机器公开端口的
docker run-d-p 80:80-p 443:443 nginx
,所以现在看来你有了某种路由器/防火墙/任何阻止从internet到主机的传入端口80/443流量的东西。您需要搜索如何在操作系统/路由器上打开端口的指南。如果在主机上,您通过转到localhost:80看到nginx服务页面,则在打开端口后,可以从您的externalip:80(或somedomain.tld,如果您将其添加到etc/主机,如127.0.0.1 somedomain.tld)访问它这正是让我感到困惑的地方:我可以轻松地用Web服务器运行一个旧的lxc容器,并且可以毫无问题地访问它……您可以停止容器(lxc,docker),在本地安装例如apache(只需查看:80上的欢迎页面)并查看您是否可以从外部访问它吗?如果不能,那么有一些防火墙规则可以很好地与lxc配合使用(出于某种原因)但与其他服务无关。。。
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION
-N fail2ban-pam-generic
-N fail2ban-ssh
-N fail2ban-ssh-ddos
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 25 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 465 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 587 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 110 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 995 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 143 -j ACCEPT
-A FORWARD -d 172.24.18.12/32 -p tcp -m tcp --dport 993 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 443 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT