ERR_CONNECTION_REFUSED при попытке подключения к серверу NodeJS, работающему в Docker-контейнере в Windows 10 - PullRequest
0 голосов
/ 27 июня 2019

У меня есть приложение, которое содержит сервер NodeJS и клиент ReactJS.Структура проекта выглядит следующим образом:

client
  Dockerfile
  package.json
  .
  .
  .
server
  Dockerfile
  package.json
  .
  .
  .
docker-compose.yml
.gitignore

Для запуска обоих из них, я использую docker-compose.yml:

version: "3"
services:
  server:
    build: ./server
    expose:
      - 8000
    environment:
      API_HOST: "http://localhost:3000/"
      APP_SERVER_PORT: 8000
      MYSQL_HOST_IP: mysql
    ports:
      - 8000:8000
    volumes:
      - ./server:/app
    command: yarn start
  client:
    build: ./client
    environment:
      REACT_APP_PORT: 3000
      NODE_PATH: src
    expose:
      - 3000
    ports:
      - 3000:3000
    volumes:
      - ./client/src:/app/src
      - ./client/public:/app/public
    links:
      - server
    command: yarn start

И внутри каждого из client иserver папок У меня есть Dockerfile (одинаковые для каждой):

FROM node:10-alpine

RUN mkdir -p /app
WORKDIR /app

COPY package.json /app
COPY yarn.lock /app
COPY . /app

RUN yarn install

CMD ["yarn", "start"]

EXPOSE 80

Где start сценарий клиента просто react-scripts start, а сервер nodemon index.js.Клиентский package.json имеет прокси-сервер, который должен обеспечивать связь с сервером:

"proxy": "http://server:8000",

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

import React from 'react';
import axios from 'axios';

function callServer() {
  axios.get('http://localhost:8000/test', {
    params: {
      table: 'sample',
    },
  }).then((response) => {
    console.log(response.data);
  });
}

export function SampleComponent() {
  return (
    <div>
      This is a sample component
      {callServer()}
    </div>
  );
}

Какойвызовет путь /test на сервере узлов, как определено в файле index.js:

const cors = require('cors');
const express = require('express');

const app = express();

app.use(cors());

app.listen(process.env.APP_SERVER_PORT, () => {
  console.log(`App server now listening on port ${process.env.APP_SERVER_PORT}`);
});

app.get('/test', (req, res) => {
  res.send('hi');
});

Теперь этот код работает как чудо, когда я запускаю его на своем компьютере с Linux Mint, но когдаЯ запускаю его на Windows 10 Я получаю следующую ошибку (я запускаю оба на Chrome):

GET http://localhost:8000/test?table=sample net::ERR_CONNECTION_REFUSED

Нужно ли мне запускать их на другом порту или IP-адресе?Я где-то читал, что соединения могут использовать сеть Windows вместо сети, созданной docker-compose, но я даже не уверен, как начать диагностировать это.Пожалуйста, дайте мне знать, если у вас есть идеи, которые могли бы помочь.

РЕДАКТИРОВАТЬ: Вот результаты docker ps:

CONTAINER ID        IMAGE                                        COMMAND                  CREATED             STATUS              PORTS                            NAMES
1824c61bbe99        react-node-mysql-docker-boilerplate_client   "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        80/tcp, 0.0.0.0:3000->3000/tcp   react-node-mysql-docker-boilerplate_client_1

и вот docker ps -a.По какой-то причине образ сервера останавливается сам по себе, как только он запускается

CONTAINER ID        IMAGE                                        COMMAND                  CREATED             STATUS                       PORTS                            NAMES
1824c61bbe99        react-node-mysql-docker-boilerplate_client   "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes                 80/tcp, 0.0.0.0:3000->3000/tcp   react-node-mysql-docker-boilerplate_client_1
5c26276e37d1        react-node-mysql-docker-boilerplate_server   "docker-entrypoint.s…"   3 minutes ago       Exited (127) 3 minutes ago                                    react-node-mysql-docker-boilerplate_server_1
...