首页 > 解决方案 > 正确的 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文件添加一个新条目,所以这不是解决方案。

标签: dockerapachedocker-composedocker-networking

解决方案


显然,在较新版本的 Docker Desktop for Windows 中,您无法通过 IP 访问(ping)您的 linux 容器

现在有一些非常肮脏的解决方法,涉及更改.ps1Docker 安装文件以恢复DockerNATWindows 上的界面。之后,您需要在 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/8IP 范围内设置一个免费的环回 IP :portsdocker-compose.yml

ports:
    - "127.55.0.1:80:80"

之后,您将以下内容添加到您的hosts文件中:

127.55.0.1 test.local

您可以在以下位置打开您的应用程序http://test.local

要为其他 dockerized 应用程序执行此操作,只需选择另一个免费的环回地址。


推荐阅读