【问题标题】:How to access "http://localhost" from a Docker container in Windows?如何从 Windows 中的 Docker 容器访问“http://localhost”?
【发布时间】:2017-04-30 12:04:17
【问题描述】:

我有一组使用 Docker 在 Windows 10 中运行的容器,这是docker-compose ps 的输出:

> docker-compose ps
     Name                    Command               State                          Ports
--------------------------------------------------------------------------------------------------------------
db_mysql          docker-entrypoint.sh mysqld      Up      3306/tcp
elk               /usr/bin/supervisord -n -c ...   Up      0.0.0.0:81->80/tcp
php71-fpm-nginx   /config/bootstrap.sh             Up      443/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:9001->9001/tcp

这是docker inspect的输出:

> docker inspect php71-fpm-nginx
[
    {
        ...
            "NetworkMode": "anotherlampdocker_default",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "80"
                    }
                ],
                "9001/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "9001"
                    }
                ]
            },
        ...
        "Mounts": [
            {
                "Source": "/d/Development/www",
                "Destination": "/data/www",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            ...
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "b96cf4c0f2c17d65659c31982b9200a79cca6f1c214770d31938204c493a6720",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "443/tcp": null,
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    }
                ],
                "9001/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "9001"
                    }
                ]
            },
            ...
            "Networks": {
                "anotherlampdocker_default": {
                    "IPAMConfig": null,
                    "Links": [
                        "db_mysql:db",
                        "db_mysql:db_mysql"
                    ],
                    "Aliases": [
                        "php-fpm",
                        "248e8c254eee"
                    ],
                    "NetworkID": "de1e10b63e6e5050809af59ac4d26b7cb691afd5805d1cf7f0492c702814f34d",
                    "EndpointID": "ccec71967c6100c5a9f3ad82d82bbb2a371f77e12c493bf05bfd15f2d188ce00",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:03"
                }
            }
        }
    }
]

我正在尝试访问http://localhost,但我不能。我也尝试过使用容器 IP,意思是 http://172.18.0.3,但也不起作用。

当我说我不能时,它意味着以下信息:

无法访问此网站 172.18.0.3 响应时间过长。

相同的容器在 Linux 中完美运行。

这是c:\Windows\System32\drivers\etc\hosts文件的内容:

# localhost name resolution is handled within DNS itself.
    127.0.0.1       localhost

容器中的端口映射到docker-compose.yml文件中的主机:

services:
  php-fpm:
    container_name: "php71-fpm-nginx"
    build: php-fpm
    ports:
        - 80:80
        - 9001:9001
    environment:
        PHP_ERROR_REPORTING: 'E_ALL & ~E_DEPRECATED & ~E_NOTICE'
        STATUS_PAGE_ALLOWED_IP: '127.0.0.1'
    volumes:
        - D:\Development\www\:/data/www

我在这里缺少什么?

【问题讨论】:

  • 您是否将本地端口映射到 docker 容器端口?
  • @Rao 是的,看看 OP 上的编辑
  • 如果你从 php/nginx 容器中 curl localhost 会发生什么?您可以使用 docker exec -it php71-fpm-nginx bash 在容器中获取 shell
  • 由于 Windows 10 NAT 堆栈中的错误,目前无法使用 localhost 连接到容器。
  • @jmiraglia 是的,我可以将 shell 放入容器中,这是 CURL 命令的结果:[root@248e8c254eee /]# curl localhost curl: (7) Failed connect to localhost:80; Connection refused

标签: docker docker-compose docker-networking docker-container


【解决方案1】:

您可以获取docker机器IP并访问应用程序:
1. 使用命令docker-machine : docker-machine ip
2.或者通过登录到启动docker时创建的docker镜像并获取eth1 ip

然后尝试:[docker-machine ip]:[port]

【讨论】:

    【解决方案2】:

    尝试登录php的容器并检查httpd进程是否正在运行。

    使用不带 -d 的 docker-compose up 应该可以帮助您从容器中查看日志或在 docker-compose up -d 之后使用 docker-compose logs -f -t

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 2020-09-16
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 2017-02-25
      相关资源
      最近更新 更多