Как получить доступ к http: // localhost из контейнера Docker в Windows?

У меня есть набор контейнеров, работающих в Windows 10 с Docker, это результат 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

Что мне здесь не хватает?


person ReynierPM    schedule 15.12.2016    source источник
comment
Вы сопоставили локальный порт с портом контейнера докеров?   -  person Rao    schedule 15.12.2016
comment
@Rao да, посмотрите правку на OP   -  person ReynierPM    schedule 15.12.2016
comment
Что произойдет, если вы скрутите localhost из контейнера php / nginx? Вы можете получить оболочку в контейнере, используя docker exec -it php71-fpm-nginx bash   -  person jmiraglia    schedule 15.12.2016
comment
подключение к контейнеру с помощью localhost в настоящее время невозможно из-за ошибки в стеке NAT Windows 10.   -  person Falco Alexander    schedule 15.12.2016
comment
@jmiraglia да, я могу поместить оболочку в контейнер, и это результат команды CURL: [root@248e8c254eee /]# curl localhost curl: (7) Failed connect to localhost:80; Connection refused   -  person ReynierPM    schedule 15.12.2016
comment
@FalcoAlexander, тогда, если localhost не может быть использован, каков правильный путь?   -  person ReynierPM    schedule 15.12.2016
comment
Если вы можете использовать оболочку в контейнере, можете ли вы увидеть, работает ли nginx? Вы можете попробовать разделить php и nginx на отдельные контейнеры. Если хотите, можете проверить мое репо: github.com/onlinespaces/docker-project- база. Я не эксперт, но у меня это работает.   -  person ScottCollier    schedule 15.12.2016
comment
@ScottCollier о, это хорошо, действительно здорово, я попробую, вы уже пробовали в Windows?   -  person ReynierPM    schedule 15.12.2016
comment
Да, я использую его на работе на Mac и дома на Windows. Единственная проблема, с которой я столкнулся в Windows, - это то, что интерактивные контейнеры не поддерживаются. Итак, вы можете либо сделать docker exec -it php-fpm bash, как указано выше в @jmiraglia, либо подключиться через SSH и получить полную оболочку. Я предпочитаю использовать его по SSH, потому что мне нравится делать все внутри контейнера, чтобы мой компьютер с Windows был как можно более чистым. Мне также нравится красивая информация о git в подсказке, которая не работает, когда я использовал docker exec.   -  person ScottCollier    schedule 15.12.2016
comment
@ScottCollier после клонирования репозитория переименуйте файл .env и попробуйте команду docker-compose build, она заканчивается следующей ошибкой ERROR: Service 'db' failed to build: One or more build-args [DEFAULT_CHAR_SET COLLATION_SERVER CHAR_SET_SERVER] were not consumed, failing build., что я здесь пропустил?   -  person ReynierPM    schedule 16.12.2016
comment
@ReynierPM вы можете подключиться к контейнеру либо по его IP-адресу NAT (обычно 172 * диапазон), либо извне с другого компьютера с вашим обычным IP-адресом.   -  person Falco Alexander    schedule 16.12.2016
comment
Извините, я тогда работал над репо и случайно удалил несколько строк. Вы можете скачать новый mysql / Dockerfile здесь: github. com / onlinespaces / docker-project-base / blob / master / docker /.   -  person ScottCollier    schedule 19.12.2016
comment
Отвечает ли это на ваш вопрос? Не открывать веб-страницу на порту 8080, когда запустить Tomcat внутри Docker   -  person ErikMD    schedule 06.06.2020


Ответы (2)


Вы можете получить IP-адрес докера и получить доступ к приложению:
1. Используя команду docker-machine: docker-machine ip
2. или войдя в образ докера, который создается при запуске докера и получении IP-адреса eth1.

Затем попробуйте: [ip-адрес докер-машины]: [порт]

person Savio Mathew    schedule 24.07.2018

Попробуйте войти в контейнер php и проверьте, запущен ли процесс httpd.

Использование docker-compose up без -d должно помочь вам увидеть журнал из контейнера или использовать docker-compose logs -f -t после docker-compose up -d

person Namchoke Kaewkhat    schedule 09.06.2019