Я пытаюсь настроить poc для докера с помощью одного простого проекта. Он включает в себя angular, express, nodejs и атлас mongodb.
angular работает на 4200 и nodejs 3000
https://github.com/changan1111/UserManagement
он отлично работает в локальной той же настройке ..
Когда я иду на докер?
Я вижу, что узел js запущен и работает.
Когда я вижу список файлов, я вижу все хорошо.
Когда я перехожу к http://localhsot/user, он возвращает значения
Но когда я читаю значение из браузера, оно показывает
я пробовал несколько решений, которые даны, но все возвращают тот же ответ, который не удался. что с этим не так .. может ли кто-нибудь взглянуть на это и сообщить мне, в чем проблема с настройкой.
app.use(cors());
/*
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "req.headers.origin"); // update to match the domain you will make the request from
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods", "DELETE,PUT,GET,POST");
next();
});*/
/*
app.use(cors({
"origin": ['http://localhost:3000'],
"methods": "GET,PUT,POST",
"preflightContinue": false,
"credentials": true
}));*/
пробовал с IP-адресом http://192.168.0.103/, но без изменений Докерфайл:
это ошибка копирования и вставки при выполнении .. EXPOSE был указан до CMD
Пожалуйста, замените изображения кода реальным кодом.
В вашем браузере вы звоните localhost:3000/user, а не localhost/user. И ваша проблема в том, что ваше приложение каким-то образом доступно на 80 вместо 3000?
Соответствует ли ваш отображаемый порт (тот, который вы можете попытаться подключить извне) открытому порту? Обычно вы хотите указать порт при запуске контейнера с некоторыми портами, открытыми в нем.
P.S. Ваш Angular не должен работать ни на одном порту. Он должен быть построен и обслуживаться на статическом сервере, таком как nginx.





В вашем вопросе неясно, но, судя по предоставленным вами изображениям, кажется, что ваше приложение Angular не может получить доступ к серверной части Express в 127.0.0.1.
Вы настроили http://localhost:3000 в качестве конечной точки API, но имейте в виду, что с точки зрения Docker localhost относится к самому контейнеру и может не совпадать с вашим фактическим хостом.
Чтобы решить проблему, вы можете указать Express, что он должен прослушивать в каждом сетевом интерфейсе, используя 0.0.0.0:
app.listen(3000, '0.0.0.0', () => {
console.info("listening on PORT verify: 3000");
});
Решение также проиллюстрировано в документации руководства по nodejs.
Кроме того, попробуйте настроить переменную Url в ваших environment файлах на адрес http://localhost, не указывая порт, т.е. используя порт 80: судя по коду, который вы загрузили в свой репозиторий на Github, ваше приложение, похоже, слушает порт 3000, но на ваших скриншотах вы точно используете порт 80. Причина этого заключается в том, что если express обслуживает как ваш Angular SPA, так и ваш API, и вы можете связаться с обеими вещами с вашего хоста, используя http://localhost/read и http://localhost/user соответственно, то, вероятно, настраивая вашу переменную Url на http://localhost, как рекомендуется, может сделать обманывать.
Я изменил app.listen(3000, '0.0.0.0', () => { console.info("прослушивание PORT: 3000"); }); Но все же я не увидел никакой разницы в поведении
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES 731365201d70 106d "node server" 8 минут назад Up 8 минут 0.0.0.0:80->3000/tcp cranky_pasteur Я попробовал localhost и использовал ip с хостов в браузере (# Добавлено Docker Desktop 192.168 .0.106 host.docker.internal 192.168.0.106 gateway.docker.internal)
Можете ли вы, пожалуйста, дайте мне знать какие-либо другие необходимые детали?
Привет @ChanGan. Мне жаль слышать, что это не сработало должным образом. Вы все еще сталкиваетесь с той же проблемой? Точно такая же проблема? Поскольку вы используете Express как для выходных данных Angular, так и для API, вы можете попробовать использовать относительные маршруты в своем apiservice.service. Я имею в виду, что переменная env Url может быть определена как пустая строка в вашей среде. Возможно, этот альтернативный подход мог бы помочь. В идеале ваш SPA должен обслуживаться каким-либо веб-сервером, например nginx. Этот сервер, вероятно, будет проксировать запросы, отправленные против вашего API. Я не уверен в использовании Express для этой цели
изначально я пробовал url: "/", чтобы взять его базовый URL-адрес из источника.. но он пуст в запросе.. http:///user.. источник не добавляется в запрос. но он должен идти как http://{requestedip}/user.. так как это пусто, идет 3 косые черты
@ChanGan Я обновил ответ дополнительными идеями. Я надеюсь, что они помогут.
Сделал то же самое изменение и работает нормально.. принимая этот ответ
Это здорово @ChanGan. Я рад слышать, что предложенное решение работает правильно, и вы смогли решить проблему.
Вы пытались открыть свои порты таким образом при запуске контейнера?
docker run -p 4000:4000 container_name (при условии, что хост Linux здесь)
или просто
docker run --network = "host" container_name возможно?
Затем получите доступ через localhost:4000 из любого сервиса внутри или вне Docker.
Таким образом, внутренний localhost контейнера будет совпадать с localhost вашего фактического хост-компьютера.
В этом есть некоторые недостатки, но я предполагаю, что вы не используете это в производственных условиях, поэтому это не должно иметь большого значения.
Неясно, пытаетесь ли вы получить доступ к своему Dockerized-приложению из-за пределов Docker. И ваш бэкенд, и внешний интерфейс используют один и тот же контейнер? Они оба контейнерные?
EXPOSE позволяет только внутренним приложениям Docker находить этот порт IIRC.
Вам нужно указать порты для доступа к вашему хосту.
Он открыл порты через docker-compose.
@akop Мой плохой. Должно быть, пропустил это, еще не особо копался в репо. В предыдущем ответе упоминалось, что путаница между портами хоста и контейнера locahost является потенциальной проблемой, поэтому я решил, что их точное сопоставление может снизить вероятность путаницы (если ОП еще не сделал этого).
Во-первых, вы должны поставить EXPOSE перед CMD в вашем Dockerfile.