docker - 正确的 IP 地址以访问 apache docker 容器中的 Web 应用程序
问题描述
我在 a 中定义了一个简单的 apache docker 设置docker-compose.yml
:
services:
apache:
image: php:7.4-apache
command: /bin/bash -c "/var/www/html/startup.sh && exec 'apache2-foreground'"
volumes:
- ./:/var/www/html
- /c/Windows/System32/drivers/etc/hosts:/tmp/hostsfile
ports:
- "80:80"
从startup.sh
脚本中,我想hosts
通过卷从主机操作系统修改文件。在这里,我想动态添加一个条目以将主机名解析test.local
为 docker web 应用程序的 ip 地址,如下所示:
<ip-address> test.local
这样我应该能够http://test.local
在本地浏览器中打开具有指定主机名的应用程序。
在编写startup.sh
脚本之前,我想尝试http://172.19.0.2
通过我从中获得的容器 IP 地址手动打开应用程序
docker inspect apache_test
但是页面打不开:ERR_CONNECTION_TIMED_OUT
我不应该能够从该 IP 访问应用程序吗?我错过了什么?我使用了错误的 IP 地址吗?
顺便说一句:我正在使用带有 Hyper-V 后端的 Docker Desktop for Windows
编辑:我可以通过访问应用程序,http://localhost
但是因为我想向hosts
文件添加一个新条目,所以这不是解决方案。
解决方案
显然,在较新版本的 Docker Desktop for Windows 中,您无法通过 IP 访问(ping)您的 linux 容器。
现在有一些非常肮脏的解决方法,涉及更改.ps1
Docker 安装文件以恢复DockerNAT
Windows 上的界面。之后,您需要在 Windows 路由表中添加一条新路由,如下所述:
route /P add <container-ip> MASK 255.255.0.0 <ip-found-in-docker-desktop-settings>
然后,您也许可以从 Windows 主机 ping 您的 docker 容器。虽然我没有测试...
我在阅读上面链接的其中一个线程时找到了原始问题的解决方案(test.local
通过文件解析容器 IP )hosts
这涉及在以下部分的127.0.0.0/8
IP 范围内设置一个免费的环回 IP :ports
docker-compose.yml
ports:
- "127.55.0.1:80:80"
之后,您将以下内容添加到您的hosts
文件中:
127.55.0.1 test.local
您可以在以下位置打开您的应用程序http://test.local
要为其他 dockerized 应用程序执行此操作,只需选择另一个免费的环回地址。
推荐阅读
- c++ - 使用 If 语句时字符串之间有空格
- c# - moq 存储库如何测试 Iqueryable 依赖项
- php - 标题 X-Frame-Options SAMEORIGIN 不起作用
- javascript - 检查对象中的每个条目是否不为空或未定义的智能方法
- vba - 如何使用宏在 Word 中自动查找特定文本并将其格式化为小型大写字母?
- laravel - GROUP BY laravel 中的关系数据
- asp.net-core - 如何在 .net 核心中使用 DelegatingHandler 从 asp.net 核心中的响应中删除属性?
- javascript - 未捕获的类型错误:无法访问属性“追加”,cartItems 未定义
- flutter - 在颤动中从另一个文件导入字符串列表
- python - 如果满足条件,您可以使两列相等吗