【问题标题】:Docker can't connect to Container exposed portDocker 无法连接到容器暴露端口
【发布时间】:2019-03-01 08:51:13
【问题描述】:

场景:

嘿,我正在运行一个带有容器的 docker compose。 这个 compose 文件在 Windows 10 上的本地 docker 桌面上的工作方式就像魅力一样。 我用网络driver bridge. 配置了我自己的网络 现在我想在带有 ubuntu vm 的外部服务器上运行 docker compose。 我与服务器有远程腻子连接。当我运行docker-compose up 时,我的所有服务都成功启动。我还运行了搬运工来对其进行 gui 控制。

问题: Lika 我说,我所有的服务都在运行。与本地设置的唯一区别是我将搬运工作为单个容器启动。我无法使用浏览器连接到搬运工并检查整个设置。但是当我想调用我的暴露容器时,我无法获得连接并获得连接失败错误。 当我查看容器规范中 portainer 中的 IP 地址列时,我发现 portainer 的 ip 与我的 docker compose 容器不同。所以 portainer 有 172.17.xxx 并且所有其他容器都以 172.20.xxx 开头显然我在我的私有网络中暴露的端口没有暴露给主机桥接网络。

我的期望 我希望通过我的虚拟机的 ip 可以使用我的公开端口,例如我的 portainer 实例。

想法 我对 docker 很陌生,所以我检查了docs,我认为是因为描述:

在用户定义的桥接网络中,不支持链接。你 可以在此网络中的容器上公开和发布容器端口。 如果您想制作桥接网络的一部分,这很有用 可用于外部网络。

..作为网络驱动程序的桥将我的网络连接到本地主机互联网连接。

问题: 当我将 portainer 与我的 compose 分开运行时有什么问题吗? 当我在外部服务器上而不是在我的本地主机上运行我的 compose 时,还有什么需要记住的吗?

组合网络配置文件:

networks:
  my_net:
    driver: bridge

而我的 compose 版本是 2.1

更新: Docker ps 表示一切正常运行 docker inpsect 在我想通过 Internet 访问的容器上:

"NetworkSettings": {
            "Bridge": "",
            "SandboxID": "9e1e335ab30f1f4d3f690e8902e06523fa095e7d8bshddkdksis7d66s7sjdjd",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "7778/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "7778"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/9e1e386ttf56",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "my_net": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "3cb72e02c43b",
                        "usermanagement-service"
                    ],

                    "Gateway": "172.20.xx.x",
                    "IPAddress": "172.20.xx.xx",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DriverOpts": null
                }
            }
        }
    }

【问题讨论】:

  • 您要公开的容器的docker psdocker inspect 结果是什么?
  • 更新了我的答案
  • 你已经暴露了这个端口7778,任何人都可以访问。当您尝试使用公共 ip 和端口连接到它时会发生什么?
  • 是的,我希望我可以连接到。但是我得到了描述的错误,即这个 ip 和端口没有答案。
  • 我已经添加了带有解释的答案,以便以后可能对其他人有所帮助:D

标签: docker networking docker-compose containers


【解决方案1】:

所以问题可以分解为以下几个步骤:

  1. 检查docker inspectdocker ps 结果以确保您的端口正确暴露
  2. 尝试使用公共 IP 连接到它。例如,如果您收到错误消息

    • 连接被拒绝:原因可能是容器内的应用程序未按预期运行。例如,您需要确保应用程序绑定到 0.0.0.0 而不是 127.0.0.1

    • 连接超时:原因可能是服务器外部的防火墙,例如 AWS 中的 SecurityGroups 或类似的,或者 docker 没有管理服务器防火墙(这不是默认设置)

【讨论】:

  • 对于未来的读者,就我而言,openvpn 的进程导致我超时。
  • 不知何故这让我无法理解:you need to ensure that the application bind to 0.0.0.0 and not 127.0.0.1。那是我的问题。应用程序(Apache Tika 服务器)的默认端口是 localhost,所以我不得不使用--host=0.0.0.0 在 docker 中修复它。 thhhhanks!
  • @fbicknel 在我的情况下,我试图将应用程序绑定到与服务同名的主机(这是 Docker 文档中描述的),实际上它只在我将其绑定到0.0.0.0。我的问题是:如果文档本身告诉我们使用服务名称作为主机,为什么它不起作用?可能有任何错误配置?
  • @RodrigoChaves,你能解释一下 openvpn 问题吗?你是如何解决这个问题的?
  • 谢谢你们,--host=0.0.0.0 也是我的问题!
【解决方案2】:

在我的情况下,传递的参数顺序无效:

docker run myrazorapp -p 8080:80

什么时候应该:

docker run -p 8080:80 myrazorapp 

端口参数被简单地忽略了。

【讨论】:

    【解决方案3】:

    我遇到了我指定的问题 运行 npm 开始 代替 CMD npm 启动

    您的容器将启动,但永远不会暴露。这是为我做的

    【讨论】:

    • 它对你有什么帮助?
    • 我认为piecepaper意味着他将他的Dockerfile更改为使用CMD而不是RUN来执行应用程序,这为他解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2021-09-07
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多