【问题标题】:can't access apache on docker from my localhost无法从我的本地主机访问 docker 上的 apache
【发布时间】:2016-07-31 13:33:43
【问题描述】:

我一直在关注this tutorial for beginners about docker,它基本上指示您创建一个 apache 容器并将 localhost 端口映射到容器上的端口。 当我尝试 localhost:80 时,它没有连接,尽管容器已启动并正在运行。 我什至在防火墙中做了一个规则,允许连接到端口 80,但无法连接到 localhost。

有什么想法吗?

【问题讨论】:

  • 命令docker logs CONTAINER_ID显示什么?
  • @mainframer 之前不知道这个,它显示“AH00558: apache2: 无法可靠地确定服务器的完全限定域名,使用 172.17.0.3。全局设置 'ServerName' 指令以抑制此消息”
  • 先尝试修复这个 apache 问题。显然 apache 希望你设置一个 ServerName。使用命令docker exec -it CONTAINER_ID /bin/bash 进入您的容器,然后按照本文修复该问题:thomas.vanhoutte.be/miniblog/fix-apache-error-ah00558
  • 您使用的是 Windows 还是 Mac OS X?如果是这样,您需要的地址是 192.168.99.100:80,而不是 localhost。
  • 在 Windows/OS X 上,Docker 在默认 IP 地址为 192.168.99.100 的 Linux 虚拟机(Docker Toolbox)中运行。 172.17.0.3 地址是该虚拟机 inside 的 docker 容器的地址。端口绑定会将端口绑定到虚拟机,而不是 Windows。

标签: apache docker localhost


【解决方案1】:

我偶然发现了这个问题,因为我正在寻找一种方法将我的本地 HTTP 端口 (80) 绑定到我的容器的 HTTP 端口,这是一个在 Docker Desktop for Windows 上运行的 Apache 容器 - 通过 WSL2(这很重要)

我找不到快速简便的方法来做到这一点,所以我自己想出来了。

您必须做的是将本地端口(在 Windows 上)绑定到 WSL 上的端口。

我是这样做的:

$wsl_ip = (wsl -d "docker-desktop" -- "ifconfig" "eth0" "|" "grep" "inet addr:").trim("").split(":").split()[2]
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=$wsl_ip
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=$wsl_ip

您可以创建一个 Powershell 脚本 (.ps1) 并使用 Powershell 运行它,或者将每个命令行复制/粘贴到以管理员权限运行的 Windows 终端/Powershell。

这是做什么的:

  1. 附加到在 WSL2 2 中运行的“docker-desktop”发行版
  2. 运行“ifconfig eth0 | grep inet addr:”获取本地IP地址 “虚拟机”
  3. 解析结果,使用Netsh 在 Windows 机器的 80 端口和端口之间创建一个 portproxy 80 台你的 Linux 机器。端口 443 也是如此。您可以轻松地 如果您了解该命令的作用,请映射其他端口。

更多解释:

由于 Docker for Windows 10/11 使用 WSL2,当您公开端口(通过 docker-compose 或在 Dockerfile 中使用 EXPOSE 命令)时,它会暴露给名为“docker-desktop”的 Linux 发行版,该发行版使用WSL2。由于某种原因,从容器公开的端口 80 和 443 不会转发到主机。 官方文档acknoledges some issues,但他们的解决方案只是使用另一个端口(例如,8080映射到80)。

这种方法的问题: 每次重新启动系统(或 WSL2)时,Linux 机器都会被分配一个新的 IP,而您必须再次执行此操作。您可以做的是设置一个命令以在您的容器启动时运行,该命令通过 ssh 连接到主机并运行脚本,但我懒得自己做。

【讨论】:

    【解决方案2】:

    在重新启动 apache 之前向 DockerFile 添加一行。

    RUN echo 'ServerName localhost' >> /etc/apache2/apache2.conf
    

    【讨论】:

      【解决方案3】:

      在 Windows/OS X 上,Docker 在默认 IP 地址为 192.168.99.100 的 Linux 虚拟机(Docker Toolbox)中运行。因此,当你使用docker run -p 80:80将容器端口绑定到主机端口时,它实际上绑定到了虚拟机的80端口。因此你需要的地址是http://192.168.99.100

      172.17.0.3 地址是该虚拟机内部的 docker 容器的地址,不能直接从 Windows/OS X 访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-29
        • 2022-01-07
        • 2021-05-14
        • 1970-01-01
        • 2022-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多