У меня есть резервная копия (NodeJS), которая прослушивает какой-то порт (2345 в этом примере). Клиентское приложение является приложением React. Оба используют socket.io
, чтобы общаться между собой. Оба контейнера. Затем я запускаю их обоих в одной сети, используя флаг «network»:
docker run -it --network=test1 --name serverapp server-app
docker run -it --network=test1 client-app
В клиенте у меня есть этот код (на сервере код довольно стандартный, почти копирование-вставка со страницы socket.io):
const socket = io.connect('http://serverapp:2345');
socket.emit('getData');
socket.on('data', function(data) {
console.log('got data: ${data}');
})
Я подозреваю, что проблема заключается в том, что клиентское приложение (React) обслуживается пакетом http-server
, а затем в в контексте браузера имя хоста не понято и поэтому не может быть разрешено. Когда я go в консоли браузера, я вижу следующую ошибку: GET http://tbserver: 2345 / socket.io /? EIO = 3 & transport = polling & t = MzyGQLT net :: ERR_NAME_NOT_RESOLVED
Теперь, если я переключу (в клиентском приложении) имя хоста serverapp
на localhost (который браузер понимает, но не рекомендуется использовать в docker, поскольку он интерпретируется по-разному), при попытке подключиться к сокету сервера я получаю сообщение об ошибке: GET http://localhost: 2345 / socket.io /? EIO = 3 & transport = polling & t = MzyFyAe net :: ERR_CONNECTION_REFUSED .
Другая информация состоит в том, что в настоящее время мы создаем приложение React (используя npm run build
), , а затем мы создаем и запускаем контейнер Docker используя следующий Dockerfile:
FROM mhart/alpine-node
RUN npm install -g http-server
WORKDIR /app
COPY /app/build/. /app/.
EXPOSE 2974 2326 1337 2324 7000 8769 8000 2345
CMD ["http-server", "-p", "8000"]`
(Таким образом, сборка приложения React при сборке контейнера не происходит; мы скорее полагаемся на предварительно скомпилированный файл)
Не уверен, что мне не хватает здесь и если это связано с http-server
или нет, но до этого мне удалось получите полностью работающее socket.io
соединение между 2 NodeJS приложениями, использующими одну и ту же Docker сеть, поэтому это не должно быть проблемой кода.