Docker контейнер 'Connect ECONNREFUSED localhost' - PullRequest
1 голос
/ 19 марта 2020

Я запускаю простое Nodejs приложение с 2 контейнерами. Контейнер сервера и клиент. У меня есть настройки, так что когда клиент отправляет запрос на сервер, он передает некоторые данные обратно клиенту, однако, когда я пытаюсь сделать этот запрос от клиента, я получаю следующую ошибку

connect ECONNREFUSED 127.0.0.1:8080

Это также тот случай, когда я использую IP-адрес контейнера. Оба контейнера находятся в одной сети. Я подтвердил это с проверкой сети docker. Когда я делаю тот же запрос через Почтальон, он работает нормально.

Вот мои настройки

Настройка сервера

Dockerfile сервера

FROM node:12
EXPOSE 8080
WORKDIR /home/node/server
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]

Функция http сервера

http.createServer(function(request, response){
    filePath = path.join("./serverdata", 'filename.txt');
    var stat = fs.statSync(filePath);

    response.writeHead(200, {
        'Content-Type': 'text/plain',
        'Content-Length': stat.size
    });

    var readStream = fs.createReadStream(filePath);
    readStream.pipe(response);
})
.listen(port);

Настройка клиента

Клиентский Dockerfile

FROM node:12
WORKDIR /home/node/client
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "capp.js"]

Функция получения клиента NB использование IP-адреса контейнера сервера дало такие же результаты

http.get('http://localhost:8080', (resp)=>{
    let data = '';

    resp.on('data', (chunk)=>{
        data += chunk;
    });

    resp.end('end', ()=>{
        console.log(data);
    });
}).on("error", (err)=>{
    console.log(err.message);
});

Docker Compose

version: "3.2"

services:
  server-app:
    build: ./serverClient
    ports: 
      - 8080:8080
    volumes:
      - servervol:/serverdata

  client-app:
    build: ./clientClient
    ports:
      - 8081:8081
    volumes:
      - clientvol:/clientdata
    depends_on:
      - "server-app"

volumes:
  servervol:
    driver: local
  clientvol:
    driver: local

Я прочитал несколько сообщений, в которых утверждается, что проблема заключается в использовании localhost вместо IP-адреса контейнера , но я пробовал оба безуспешно. Как уже упоминалось, когда сделано в Почтальоне, он работает нормально; это заставляет меня думать, что проблема в клиентской части. Любое руководство очень ценится.

Спасибо

1 Ответ

2 голосов
/ 19 марта 2020

Поскольку вы используете Docker Compose, по умолчанию (потому что вы не указали сеть) ваши сервисы совместно используют такую ​​же (по умолчанию) сеть , и поэтому вы можете использовать вместо нее название сервиса его IP-адреса для связи с ним, потому что Docker может определить IP-адрес на основе имени службы из-за разрешения имени службы.

И из-за всего этого Docker magi c, единственное вам нужно изменить способ подключения к серверу:

http.get('server-app:8080', (resp) => { ... })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...