У меня есть приложение, которое содержит сервер 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