Сеть — Docker: Основы
Любое сетевое приложение стартует на каком-то интерфейсе с указанием порта. Часто, по умолчанию, это 127.0.0.1:3000.
# Fastify по умолчанию стартует на 127.0.0.1 npx fastify start server/plugin.js -l info -P [17:54:05.528] INFO (12575): Server listening at http://127.0.0.1:3000
По идее этого достаточно для разработки и такой адрес можно открыть в браузере, но с Docker этот фокус не пройдет. Сеть внутри контейнера полностью своя и localhost внутри контейнера, это не тоже самое что и localhost вне его. Поэтому сервер запущенный на localhost внутри контейнера, не будет доступен снаружи
(7) Failed to connect to localhost port 3000 after 5 ms: Couldn't connect to server
Эта ошибка одна из самых частых у людей, которые только начинают работать с Docker. Они стартуют приложение внутри контейнера и долго не могут понять, почему оно не доступно снаружи.
Для взаимодействия с внешним миром, запуск любых серверов внутри контейнера должен выполняться на адресе 0.0.0.0. Это специальная маска, которая указывает операционной системе подключиться к каждому доступному интерфейсу в системе. А работает это потому, что Docker создает специальный интерфейс со своим ip-адресом внутри каждого контейнера, именно через него реализуется выход наружу.
# -a 0.0.0.0 меняет адрес npx fastify start server/plugin.js -l info -P -a 0.0.0.0 [17:57:08.680] INFO (16523): Server listening at http://0.0.0.0:3000
Но это только первая часть задачи, есть и вторая. Даже когда сервер слушает правильный интерфейс, Docker не дает к нему обратиться просто так. Он требует явного указания порта, который нужно открыть наружу. Это сделано не случайно, так как внутри контейнера может запускаться много всего, но это не значит, что мы хотим дать внешний доступ ко всем запущенным сервисам. Самый распространенный способ указывать порты выглядит так:
-p 8080:3000 hexletcomponents/devops-example-app # -p :
Здесь мы говорим Docker, что внешний порт 8080, нужно связать с портом 3000 внутри контейнера. К каким ip-адресам привязаны эти порты? Внутренний это тот, который мы указали веб-серверу, когда запустили его на 0.0.0.0, для нашего приложения это 0.0.0.0:3000. Внешний автоматически подставляет 0.0.0.0, поэтому любой сервис запущенный в контейнере таким образом, будет автоматически доступен снаружи, если хотя бы один из интерфейсов машины доступен извне. Поэтому возможен запуск с явным указанием адреса:
-p 127.0.0.1:8080:3000 hexletcomponents/devops-example-app
При таком запуске, веб-сервер станет доступным на хост-машине только для 127.0.0.1. Такое бывает нужно, если у хост-машины есть ip-адрес, который доступен снаружи, и мы не хотим случайно дать доступ до контейнера внешним клиентам.
В примере выше мы указали разные номера для внешнего и внутреннего портов для наглядности, но на практике порты могут быть одинаковыми и так делают часто:
-p 3000:3000 hexletcomponents/devops-example-app
Docker позволяет пробрасывать столько портов, сколько нужно. Например, в случае nginx часто требуется использовать и 80 порт, и 443 для HTTPS. Сделать это можно так:
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Что это за сервер localhost:3000?

Практически во всех мануалах вижу, что проекты запускают на каком то веб-сервере ( localhost:3000 ), гуглил, большинство запросов говорит что это сервер для Rails, но так ничего и не понял, при чем тут тогда jQuery. Может кто нибудь узнает по логотипу?
Отслеживать
user177221
задан 30 июл 2016 в 14:06
45 1 1 золотой знак 1 1 серебряный знак 7 7 бронзовых знаков
jQuery тут абсолютно не при чем
30 июл 2016 в 14:31
это понятно, что это за сервер то?
30 июл 2016 в 14:36
expressjs.com/ru/starter/hello-world.html — вот это попробуйте, и вы убедитесь насколько все просто
30 июл 2016 в 15:44
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Это просто запуск локального сервера на 3000 порту. Дело в том, что UNIX-подобные операционные системы не позволяют занимать обычным пользователям порты до 1024, поэтому чтобы не переключаться в режим суперпользователя или прибегать к sudo выбираются порты после 1024. Вы можете увидеть 3000, 4000, 8000, 8080 порты. Они легко запоминаются и легко набираются. В качестве сервера может выступать что угодно, например
PHP (build-in сервер)
php -S localhost:3000
Rails (сервер thin)
thin start -p 3000
а чаще, в случае Rails, просто
rails s
Это далеко не исчерпывающий список, таких серверов в настоящий момент буквально десятки. Да, почти во всех мануалах, если речь идет об Rails используется 3000 порт, так как он назначен в качестве порта по умолчанию, т.е. если ничего специально не указывать в серверах, используемых для Rails-разработки (thin, webriсk), будет использоваться 3000-ный порт. Однако, 3000-й порт может использоваться любым другим сервером и технологией, какого-то стандарта или жесткого правила нет.
Как узнать, кто занимает localhost:3000?
Запускал недавно сборку проекта через Grunt, проект скачал с гитхаба, сборщик работал с browserSync, теперь после остановки вотчера у меня тот проект висит сам по себе на localhost:3000, сам проект я удалил, грант удалил, ноут перезагружал, и после перезагрузки на локалхост:3000 снова висит тот проект, что я скачивал с гитхаба.
Чистил вхост в папке с виндой, все равно.
Что делать? Как узнать, какой процесс запускает этот сервер и как его закрыть?
- Вопрос задан более трёх лет назад
- 3502 просмотра
Комментировать
Решения вопроса 3

Кирилл Несмеянов @SerafimArts
Senior Notepad Reader
netstat -ano — там будет PID процесса.
Затем открыть диспечер (Ctrl+Shift+Esc) и посмотреть PID процесса кто именно.
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Stalker_RED @Stalker_RED
Жмешь win+R, запускаешь cmd, пишешь там netstat -ano — получаешь список процессов, которые работают с сетью и PID в последнем столбце. Можно сразу netstat -ano | find «3000» , чтобы проще было искать.
Дальше открываешь диспетчер задач, или пишешь в консоли «tasklist»
Снова же, можно tasklist | find «XXX» где вместо XXX вписать PID, полученный на предыдущем шаге.
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать

Dima Polos @dimovich85 Автор вопроса
https://u-academy.net/
Всем спасибо, за подсказки! Нет ни одного процесса связанного с локалхост:3000. НО! Я разобрался, тут все запутаннее оказалось. Расскажу, может кому поможет.
Проблема оказалась в браузере. Помогла полная очистка куков, истории и данных от приложений.
Я скачал с гитхаба исходники PWA — progressive web app, скачал, чтобы изучить эту технологию. PWA основывается на объекте web worker (js), который как бы «живет» в браузере, как отдельный процесс и позволяет веб приложению работать на базе веб технологий, но при этом выглядеть как нативное. Так как это было приложение-пример, то разработчики сделали web worker, который перехватывает запросы на локалхост:3000 и обрабатывает его сам. Если бы это было реальное приложение, оно бы перехватывало запросы на адреса своих серверов, а другие адреса не трогало, а тут приложение было настроенно на локалхост. Так как это приложение я установил с помощью хрома, который по умолчанию, то проблема была только в хроме, я попробовал перед очисткой истории зайти через ИЕ на локалхост и не получил ответа, тогда как хром по прежнему показывал мне то самое приложение. Очистив куки, кеш и данные приложений все вернулось на места.
localhost
Если вы хотите перейти на http://localhost, то воспользуйтесь быстрыми ссылками для входа:
- http://localhost
- http://localhost:8080
- http://localhost:8081
- http://localhost/phpmyadmin
- http://localhost/WordPress
- http://localhost:3000
- http://localhost/php
- http://localhost/index
- http://localhost/index.php
- http://localhost/server
- http://localhost/bonfire
Что такое localhost
localhost — это универсальное имя хоста, которое всегда указывает на этот же самый компьютер. Точнее говоря, это имя указывает на IP адрес 127.0.0.1, а данный IP уже является специальным адресом, всегда принадлежащий локальному компьютеру.
Если открыть адрес http://localhost в веб-браузере, то будет выполнено подключение к локальному веб-серверу. По этой причине localhost обычно ассоциируется с веб-сервером, но на самом деле localhost можно использоваться самыми разными сетевыми службами: программами для обмены данными между собой, MySQL, SSH, FTP и пр.
Вы можете даже пинговать localhost:
ping localhost
Пинги будут самыми лучшими из всех, какие вы когда-либо видели, поскольку проверяется соединение до этого же самого компьютера, на котором выполняется пинг.
Про loopback будет чуть ниже — на случай, если вам интересна теория, а сейчас рассмотрим, почему не работает localhost.
Как включить localhost
Возможно вы и так знали, что localhost это локальный веб-сервер, но при попытке открыть
http://localhost у вас возникает ошибка, например такая:
Не удается получить доступ к сайту
Сайт localhost не позволяет установить соединение.
Попробуйте сделать следующее:
Проверьте подключение к Интернету.
Проверьте настройки прокси-сервера и брандмауэра.
ERR_CONNECTION_REFUSED
Причин может быть несколько, самая популярная — вы просто не установили веб-сервер. Если это действительно так, то переходите к инструкции «Как установить веб-сервер Apache c PHP, MySQL и phpMyAdmin на Windows».
После завершения указанной инструкции localhost заработает!
Веб-сервер установлен, но localhost не открывается
В этом случае причины могут быть следующие:
- веб-сервер установлен, но его служба не запущена (особенно если раньше работало, а после перезагрузки перестало работать) — вернитесь к инструкции по установке, запустите службу веб-сервера и добавьте её в автозагрузку;
- неправильно настроены права доступа в веб-сервере, либо ошибка в конфигурации — вернитесь к настройке веб-сервера или переустановите его.
127.0.0.1
127.0.0.1 — это специальный IP адрес, который имеет loopback интерфейс. В любой операционной системе имеется поддержка 127.0.0.1, поскольку этот специальный IP описан в протоколе.
Суть работы 127.0.0.1 (а следовательно и localhost, который является именем для указания на этот IP) состоит в том, что пакет, отправленный на адрес 127.0.0.1 на самом деле никуда не отправляется, но при этом система начинает считать, что этот пакет пришёл из сети. То есть образно можно представить так: пакет отправляется на сетевую карту компьютера, там разворачивается и возвращается с сетевой карты обратно в компьютер.
Несмотря на кажущуюся бесполезность, такой подход очень популярен и используется для взаимодействия с самыми разными программами.
http://localhost:8080
Чтобы подключиться к localhost на 8080 порту перейдите по ссылке http://localhost:8080
localhost php
Чтобы использовать PHP на своём компьютере нужно установить веб-сервер. Пошаговую инструкцию смотрите в статье «Как установить веб-сервер Apache c PHP, MySQL и phpMyAdmin на Windows».
localhost phpmyadmin
Аналогично, для получения phpMyAdmin установите веб-сервер.
localhost error
Ошибки могут возникнуть в случае неправильной установки веб-сервера или приложений. Смотрите «Ошибки при настройке и установке Apache, PHP, MySQL/MariaDB, phpMyAdmin».
Связанные статьи:
- Apache для Windows (100%)
- Как запустить Apache на Windows (100%)
- Документация по Apache на русском языке (100%)
- Как подключить PHP к Apache на Windows (100%)
- Как подключить MySQL к Apache на Windows (100%)
- Решение проблемы «AH00369: Failed to open the Windows service manager, perhaps you forgot to log in as Adminstrator?» (RANDOM — 100%)