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

Posted

技术标签:

【中文标题】无法从我的本地主机访问 docker 上的 apache【英文标题】:can't access apache on docker from my localhost 【发布时间】: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。 【参考方案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。

这是做什么的:

    附加到在 WSL2 2 中运行的“docker-desktop”发行版 运行“ifconfig eth0 | grep inet addr:”获取本地IP地址 “虚拟机” 解析结果,使用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 访问。

【讨论】:

以上是关于无法从我的本地主机访问 docker 上的 apache的主要内容,如果未能解决你的问题,请参考以下文章

docker phpmyadmin 无法访问本地主机

无法从同一主机上的Web应用程序泊坞窗访问docker托管的SQL Server

使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint

无法从我的 Docker 容器内部连接到主机的 localhost

如何从我的 Android 设备访问我的本地主机

如何让 dockerize 闪亮的应用程序从本地驱动器加载数据(在主机上)