无法通过端口映射从外部主机访问 docker 容器

时间:2021-04-01 21:00:24

标签: docker networking

我在这里使用了一个非常简单的 docker-compose 文件:

https://github.com/brandonserna/flask-docker-compose

这是 docker compose 文件:

version: '3.5'

services:
  flask-app-service:
    build: ./app
    volumes:
      - ./app:/usr/src/app
      - .:/user/src
    ports:
      - 5555:9999

但是,当我使用端口 80 时,我只能从外部网络访问该应用程序。

    ports:
      - 80:9999

当我使用例如端口 8000 时。我无法从外部网络访问容器。 从本地机器我可以访问该应用程序。 (使用 wget localhost:8000 测试)

    ports:
      - 8000:9999

iptables -L 给了我这个:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (2 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:9999
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere  

1 个答案:

答案 0 :(得分:1)

评论不够所以这就是原因: 从看起来它可能是运行容器的主机中的防火墙规则,也可能是主机到您家之间的防火墙规则。 为了测试两者之间的哪个,我会尝试使用带有 --reason 和 --tracerout 选项的 nmap,因为我们在另一个端口有连接,所以你的家和容器之间不太可能有一个完整的块,所以 traceroute 不会“不提供太多信息,但以防万一。 此外,如果您对主机或 iptables 服务具有 root 访问权限,请尝试停止它以检查这是否是阻止的根本原因。

还要检查 docker ps 端口是否绑定到机器上的端口,应该如下所示:

0.0.0.0:端口 --> tcp\端口

你有端口号而不是端口

如果不是,则可能是由于 docker-compose up 命令存在问题,因此请尝试使用简单的 docker run 命令运行该服务