Docker 无法连接到容器暴露端口

标签 docker networking docker-compose containers

场景:

嘿,我正在运行一个带有容器的 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 开头显然我在我的私有(private)网络中暴露的端口没有暴露给主机桥网络。

我的期望
我想让我的暴露端口可以通过我的虚拟机的 ip 使用,比如我的 portainer 实例。

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

Within a user-defined bridge network, linking is not supported. You can expose and publish container ports on containers in this network. This is useful if you want to make a portion of the bridge network available to an outside network.



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

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

撰写网络配置文件:
networks:
  my_net:
    driver: bridge

我的撰写版本是 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 inspectdocker ps结果以确保您的端口正确暴露
  • 尝试使用公共(public) IP 连接到它。例如,如果您收到错误消息
  • 连接被拒绝 : 原因可能是容器内的应用程序没有按预期运行。例如,您需要确保应用程序绑定(bind)到 0.0.0.0而不是 127.0.0.1
  • 连接超时 :原因可能是服务器外部的防火墙,例如 AWS 中的 SecurityGroups 或类似的,或者 docker 没有管理服务器防火墙(这不是默认设置)
  • 关于Docker 无法连接到容器暴露端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54940990/

    相关文章:

    ruby-on-rails - 在Docker上 pry 无法正常工作

    Java 多播套接字在 Windows 上不起作用(SocketPermission 异常)

    emacs - 从 Emacs 在 Docker 容器上运行命令

    docker - 使用ENV设置缩放Docker容器

    docker - 连接到 docker 容器内的 localhost 端口被拒绝

    python - 在没有特权模式的Docker环境中操纵Docker中容器之间的网络流量?

    docker - 安装卷时如何排除某些路径?

    mysql - 如何将我的 docker Django 实例连接到我的 docker mysql 实例?

    jenkins - 无法以非 root 用户身份运行 docker?

    java - NetworkOnMainThreadException- 尝试创建一个新线程和 ASynchTask