Соединить два докер-контейнера с сокетом io

В настоящее время я работаю над докеризацией протестированного приложения socket.io для простого приложения чата, используя socket.io и mocha для тестирования. сервер открывает сокет для прослушивания порта 3000, а тестовый клиент использует сокет для отправки сообщений или получения выбросов.

Я использую версию 3 для создания файлов docker.

файл докеров nodeserver:

FROM node:10

WORKDIR /usr/src/appserver

COPY package*.json ./
COPY public public
COPY main.js main.js

RUN npm install
RUN npm install express
RUN npm install socket.io

CMD ["npm", "start"]

тестовый файл докеров:

FROM nodeserver

COPY test test

RUN npm update && \
    npm install -g mocha && \
    npm install -g socket.io-client

CMD ["npm", "test"]

docker-compose:

version: "3"

services:
 nodeserver:
   build: .
   expose:
      - "3000"
   image: ws

 test:
   depends_on:
      - nodeserver
   links:
     - nodeserver
   build: ./test
   image: test_image

мой сервер узла прослушивает порт 3000 и при подключении отправляет всем приветственное сообщение.

let express = require('express');
let app = express();
let http = require('http').createServer(app);
let io = require('socket.io')(http);
http.listen(3000, function ()
{
    console.info('listening on *:3000');
});

io.on('connection', function(socket)
{
    console.info('a user connected');

    io.emit('hi', 'hi');
});

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

const url = 'ws://nodeserver:3000';


describe("Chat Server", function()
{
    it("Should broadcast hi!", function(done)
    {
        let client1 = io.connect(url, options);

        client1.on('connect', function()
        {
            client1.on('hi', function(msg)
            {
                msg.should.equal("hi");
                client1.disconnect();
                done();
            });
        });
    });
}

запуск docker-compose, запускает nodeserver, а тестовый клиент терпит неудачу из-за тайм-аута, что говорит мне, что клиент не может видеть сеть роя.

теперь докеры запускаются отдельно, что открывает серверы узлов для хоста и пытается подключиться к моему локальному хосту, а вместо этого работает отлично, и тест проходит. Это говорит мне, что мой сокет и то, как я общаюсь с nodeserver, должны быть правильными, что в основном означает, что у меня должна быть проблема с настройкой сети моего роя. Может кто-нибудь сказать мне, что я здесь делаю не так?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 939
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, ваша конфигурация выглядит неплохо, это вопрос готовности вашего nodeserver. Даже с depends_on нет гарантии, что nodeserver готов, когда контрольная работа запускается. (также ссылки бесполезен и устарел).

Чтобы проверить мою гипотезу, попробуйте следующую последовательность:

docker-compose up -d nodeserver

подожди несколько секунд

docker-compose up -d test

эй @Siyu, у меня все еще та же проблема, даже если я подожду пару минут

Armin 18.11.2018 16:16

@Armin как вы запускали отдельно?

Siyu 18.11.2018 16:19

Я выставил сервер с -p 3000: 3000 на моем хосте и запустил его непосредственно в контейнере, а затем запустил тесты без контейнера напрямую с mocha в localhost: 3000

Armin 18.11.2018 16:22

кстати, запуск двух контейнеров без компоновки и привязки портов к localhost не будет работать, потому что второй контейнер жалуется, что порт уже выделен

Armin 18.11.2018 18:23

Другие вопросы по теме