【问题标题】:Can't connect to static website in Docker container from host无法从主机连接到 Docker 容器中的静态网站
【发布时间】:2021-12-31 17:22:32
【问题描述】:

我已经查看了有关此主题的几篇帖子,但尚未找到适合我的解决方案
https://forums.docker.com/t/how-can-i-navigate-to-container-website-from-host-browser/25035
How to access Docker container's web server from host

无法从主机连接到 Docker 容器中的静态网站。
我已按照本教程进行操作
https://tecadmin.net/tutorial/docker-run-static-website
来自该工作的 docker 容器运行,当我执行到它时,我可以成功地卷曲网站 从主机我无法连接到 docker 容器中的网站

我还不能发布屏幕截图,所以...
------------------------------------------
我的主机是 Windows 10
我正在使用 Oracle VirtualBox
docker 版本返回

 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.7
 Git commit:        74b1e89e8a
 Built:             Wed Jul 31 15:18:18 2019
 OS/Arch:           windows/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:49:35 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683  

----------------------------------------
Dockerfile
------------------------------------------

COPY . /usr/share/nginx/html
EXPOSE 127.0.0.1:8080

------------------------------------------
使用的 Docker 构建命令
------------------------------------------
docker build -t img-static-site-example .
------------------------------------------
使用的 Docker 运行命令
------------------------------------------
docker run -it -d -p 127.0.0.1:8080:80 img-static-site-example
------------------------------------------
卷曲检查
------------------------------------------
以下内容均不适用于主机

curl http://172.17.0.3
curl http://172.17.0.3:8080
curl http://localhost:8080

curl http://192.168.99.102
curl http://192.168.99.102:80
curl http://192.168.99.102:8080
curl http://192.168.99.102:2376

----------------------------------------
docker-machine ip 返回 192.168.99.102
------------------------------------------

        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "43d2a1e8e8429e48b5dde91385d5933e2fa095d868b67f1d6ed59a1aca1e1665",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": [
                    {
                        "HostIp": "127.0.0.1",
                        "HostPort": "8080"
                    }
                ],
                "8080/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/43d2a1e8e842",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "530b098a8d01838fa4e408033a905a3f9f8b8c538a8cefa13a937b24ff325136",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "2436a76997d6a454900798af80bf6c35482397acd66a44a07e411d6617e56339",
                    "EndpointID": "530b098a8d01838fa4e408033a905a3f9f8b8c538a8cefa13a937b24ff325136",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }

【问题讨论】:

  • 如果您使用的是 Docker Toolbox 或 Docker Machine,我怀疑 docker run -p 127.0.0.1:... 会使容器无法访问。尝试删除该选项的那个片段(docker run -p 8080:80);那么您应该能够连接到docker-machine ip 地址(http://192.168.99.102:8080)。 docker inspect IP 地址无法访问,没有理由查找它。
  • 成功了!谢谢
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: windows docker networking connection port


【解决方案1】:

您似乎正在使用基于 Docker Toolbox 或 Docker Machine 的设置。它们运行专用的 Linux VM 来运行 Linux 容器(您在问题中提到了 VirtualBox)。在此设置中,一些 Docker 网络选项无法像您在本机 Linux 系统上所期望的那样工作。例如,您可以使用 --network host 启动容器,但它将使用 VM 的主机网络,而不是包含系统。

特别是在这种环境中,docker run -p 127.0.0.1:... 选项会启动一个容器,该容器会发布一个绑定到 VM 的 localhost 接口的端口。这与包含主机的 localhost 接口和任何单个容器的 localhost 概念是分开的。这也意味着发布的端口只能从 Docker VM 本身访问,而不能从其他任何地方访问;包含主机无法访问它。

在此设置中,您需要:

  1. 从docker run -p 选项中删除127.0.0.1; docker run -p 8080:80 ...。
  2. 连接docker-machine ip地址和第一个docker run -p端口号; http://192.168.99.102:8080。

这些约束特定于 Docker Machine/Docker Toolbox。在本机 Linux 主机上或使用 Docker 桌面应用程序时,您可以按照您的描述使用 localhost。

docker inspect IP 地址在几乎所有这些设置中都无法访问(它仅适用于本机 Linux 上的同一主机),您几乎不需要查找它。

【讨论】:

  • 这适用于我以192.168.99.102:8080 身份访问静态站点的情况,谢谢但是,在这个特定的应用程序中,我需要能够通过域别名引用该站点,例如@987654322 @ 当我将静态站点直接托管在我的 Windows 主机上时,我将 /etc/hosts 文件设置为映射域。我在尝试完整地通过 docker 工具箱时迷路了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多