无法从我的本地主机访问 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的主要内容,如果未能解决你的问题,请参考以下文章
无法从同一主机上的Web应用程序泊坞窗访问docker托管的SQL Server
使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint