【问题标题】:How to access guest IP in docker如何在docker中访问访客IP
【发布时间】:2017-11-05 04:19:31
【问题描述】:

我正在使用 docker-compose 迈出第一步。我用这个内容创建了一个非常基本的 docker-compose.yml 文件:

version: '2'
  services:
    webserver:
      build: ./docker/webserver
      image: runwaytest_web
      ports:
        - "80:80"
        - "443:443"
      volumes:
        - /myhome/Docker/simple-docker/www:/var/www/html
        - /myhome/Docker/simple-docker/symfony3:/var/www/symfony3
      links:
        - mysql

     mysql:
       # mysql stuff

我在./docker/webserver 中也有一个非常基本的 Dockerfile。服务器已正确创建。如果我 ssh 到容器,apache 正在运行并且配置文件是正确的。

当我从主机检查我的容器时,IP 是 172.18.0.3,但我无法 ping 它,并且 symfony3 的虚拟主机不起作用(实际上我也无法访问基本 http-document 文件夹/var/www)。

我正在使用 Docker for Mac。

我做错了什么?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    请参阅 https://*.com/a/24149795/99189 了解您无法 ping 容器的原因。一般来说,不要指望能够做到这一点。您对容器的唯一网络访问是通过您公开的端口,在本例中为 80 和 443。

    从在 docker 容器中运行它并使用虚拟主机的角度来看,您需要 http 客户端在向 localhost:80/localhost:443 发出请求时发送 Host: 标头。

    假设您正在使用浏览器进行测试,并且您的虚拟主机是 user3174311.com,请尝试以下操作:

    • 127.0.0.1 user3174311.com 添加到您的/etc/hosts
    • 在浏览器中访问user3174311.com

    这是应该发生的事情:

    • 浏览器在/etc/hosts 中查找user3174311.com 并将其解析为127.0.0.1
    • 浏览器发送带有Host: user3174311.com 标头的http 请求到127.0.0.1:80
    • docker 正在侦听此地址并将连接转发到容器中的端口 80
    • apache 看到请求,查看Host: 标头并确定要使用的正确虚拟主机

    之后,这取决于您的 apache/symphony3 配置。如果它不起作用,您将不得不发布更多详细信息。

    【讨论】:

    • 感谢您的回答,当然我在我的/etc/hosts 文件中添加了ip,并且我还在guest 虚拟机上创建了一个虚拟主机。我不是网络专家,但如果我希望主机上的浏览器访问来宾上的虚拟主机,我希望能够 ping 通 IP?这是我在与 vagrant 一起工作时通常会做的事情,但现在似乎每个人都在转向 docker...
    • 你添加了哪个ip?它不应该是 docker 容器,因为您无法路由到它。应该是localhost。 Docker 正在监听 localhost:80localhost:443 并将流量转发到容器。
    • 好的,我知道了,谢谢。那么如何将浏览器指向我在容器内定义的虚拟主机?
    • /etc/hosts 添加:127.0.0.1 thevhost。在浏览器中,访问http://thevhost。浏览器(在读取主机文件后)将启动到127.0.0.1:80 的连接,并发送一个带有标题Host: thevhost 的http 请求。 Docker 会接受这个连接并将其转发到容器的 80 端口,Apache 会在该端口接收请求,并解释 Host 标头以识别 vhost。
    最近更新 更多