ERR_NAME_NOT_RESOLVED с использованием сети Docker для связи между внутренним контейнером и контейнером React - PullRequest
0 голосов
/ 06 января 2020

У меня есть резервная копия (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 сеть, поэтому это не должно быть проблемой кода.

1 Ответ

0 голосов
/ 06 января 2020

Ваш браузер должен знать, как разрешить адрес сервера SocketIO. Вы можете выставить порт 2345 из serverapp и привязать порт 2345 вашего хоста к порту 2345 из serverapp

docker run -it --network=test1 -p 2345:2345 --name serverapp server-app

Таким образом, вы можете использовать localhost в коде своего клиента

const socket = io.connect('http://localhost:2345');

Также избавьтесь от 2345 с вашего клиента Dockerfile

...