Как подключить socket.io внутри docker-compose между контейнерами - PullRequest
0 голосов
/ 19 октября 2018

У меня есть один контейнер, который обслуживает http на порту 4000. к нему подключен сервер сокетов

docker-compose:

  dashboard-server:
    image: enginetonic:compose1.2
    container_name: dashboard-server
    command: node src/service/endpoint/dashboard/dashboard-server/dashboard-server.js
    restart: on-failure
    ports:
      - 4000:4000

  integration-test:
    image: enginetonic:compose1.2
    container_name: integration-test
testRegex "(/integration/.*|(\\.|/)(integration))\\.jsx?$$"
    tty: true

сервер:

const http = require('http').createServer(handler)
const io = Io(http)
io.on('connection', socket => {
  logger.debug('socket connected')
})

io.use((socket, next) => {
  logger.debug('socket connection established.')
})

http.listen(4000, '127.0.0.1', () => {
    console.log(
      `Server running at http://127.0.0.1:4000/`
    )

вывод в Docker:

Server running at http://127.0.0.1:4000/

https is listening: true

Теперь я пытаюсь подключиться к этому серверу из другого контейнера, например:

файл:

  const url = `ws://dashboard-server:4000`

      const ioc = IoC.connect(url)

      ioc.on('error', error => {
        console.log(error.message)
      })
      ioc.on('connect', res => {
        console.log('connect')
      })
      ioc.on('connect_error', (error) => {
        console.log(error.message)
      })

вывод:

xhr poll error

Когда я запускаю оба локально в терминале, я получаю правильный ответ

{"message":"socket connection established","level":"debug"}

Почему сокет не устанавливает соединение внутри контейнера, а локально это так?Что я делаю не так?

edit: для удобства чтения отображается только часть файлов.сокет нормально соединяется на локальной машине с порождением обоих файлов в отдельных терминалах

1 Ответ

0 голосов
/ 19 октября 2018

Вам необходимо связать док-контейнеры и ссылаться на них по имени, а не 127.0.0.1.https://docs.docker.com/compose/networking предоставляет больше документов.Вам также нужно будет прослушать «0.0.0.0», чтобы принимать подключения через сеть докеров.

Я вижу только один контейнер в вашем файле compose.Если вы пытаетесь подключиться к Docker-контейнерам из за пределами Docker, вам придется выставить порт.Эта же ссылка показывает вам, как.

http.listen(4000, '127.0.0.1', () => {

должно стать

http.listen(4000, '0.0.0.0', () => {

, чтобы сервер прослушивал все адреса, включая адрес, который Docker автоматически выделяет в сети Docker.

Тогдаклиент должен ссылаться на сервер по имени, указанному в docker compose, поэтому

const url = `ws://127.0.0.1:4000`

становится

const url = `ws://dashboard-server:4000`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...