无法从我的本地主机访问 docker 上的 Apache

can't access apache on docker from my localhost

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

有什么想法吗?

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

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

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

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

我在寻找一种方法将我的本地 HTTP 端口 (80) 绑定到我的容器的 HTTP 端口时偶然发现了这个问题,一个 Apache 容器 运行ning 在 Docker 桌面上对于 Windows - 通过 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 运行 它,或者 copy/paste 每个命令行到 Windows 终端/Powershell 运行 管理员权限。

这是做什么的:

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

更多解释:

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

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