可以使用curl访问docker服务,但无法通过postman/chrome访问。

7
我正在进行 Docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-compose.yml:
version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - webnet
networks:
  webnet:

我通过运行命令docker stack deploy -c docker-compose.yml getstartedlab部署了我的应用程序。然后用curl访问我的服务,正常工作:curl -4 http://localhost
<h3>Hello World!</h3><b>Hostname:</b> 1532cae6e06f<br/>....

但是我无法通过在Chrome或Postman中访问http://localhost:80来访问它(它一直在加载)。为什么?我该如何解决?

更新19/10/17:

我可以从浏览器中访问我的服务:http://192.168.1.68:80。 这是领导节点的地址(也是我的真实机器的IP地址..)。

但为什么我也不能从本地访问呢?


你是在同一台机器上运行Postman和Curl吗? - frennky
是的。 - Stav Alfi
2个回答

15

看到 curl -4 ... 我怀疑这是一个IPv6的问题。如果你的本地机器没有配置IPv6,而localhost在hosts文件中引用了IPv6地址,那么对localhost的调用将会挂起。

解决方法相当简单,在您的url中使用 127.0.0.1 代替 localhost


非常感谢,这确实起了魔法的作用,但是为什么docker不尊重localhost,我应该改变什么,使得localhost也能工作? - Xinus
@xinus 参考 ipv6 可能在主机和容器的 /etc/host 文件中。根据请求来自何处,您可能需要调整多个位置。 - BMitch
当我在本地主机上不使用Docker运行服务时,本地主机可以正常工作,但是当我从Docker中运行它时,它就无法工作了。我必须输入127.0.0.1才能访问在Docker中运行的服务。 - Xinus

1
尝试使用 bridge network。桥接网络将与主机共享资源网络。例如,如果您在 Web 容器中设置端口 80:80,则可以使用 localhost:80 访问。因此,请在您的 docker-compose 文件中添加 driver: bridge,就像这样。
version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - webnet
networks:
  webnet:
   driver: bridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接