Javascript Docker不接受代理api服务器

Javascript Docker不接受代理api服务器,javascript,reactjs,docker,express,Javascript,Reactjs,Docker,Express,在进行docker合成时,我遇到以下错误。应用程序正在运行,但无法发出任何api post/get请求。express服务器正在使用端口5000 ]尝试代理请求/api/users/user时发生[HPM]错误 从本地主机:3000到(ECONREFUSE) () 尽管设置了react代理,但错误仍然存在 setupProxy.js const proxy = require('http-proxy-middleware'); module.exports = function(app) {

在进行docker合成时,我遇到以下错误。应用程序正在运行,但无法发出任何api post/get请求。express服务器正在使用端口5000

]尝试代理请求/api/users/user时发生[HPM]错误 从本地主机:3000到(ECONREFUSE) ()

尽管设置了react代理,但错误仍然存在

setupProxy.js

const proxy = require('http-proxy-middleware');

module.exports = function(app) {
//   app.use(proxy('/auth/github', { target: 'http://localhost:3000/' }))
  app.use(proxy('/api/users/auth/github', { target: 'http://localhost:5000/' }))
  app.use(proxy('/api/users/', { target: 'http://localhost:5000/' }))
  app.use(proxy('/api/posts/', { target: 'http://localhost:5000/' }))
}
const proxy = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(proxy('/auth/github', { target: 'http://127.0.0.1:8080/' }))
  app.use(proxy('/api/users/auth/github', { target: 'http://127.0.0.1:8080/' }))
  app.use(proxy('/api/users/', { target: 'http://127.0.0.1:8080/', "secure": false }))
  app.use(proxy('/api/posts/', { target: 'http://127.0.0.1:8080/' }))
}
Dockerfile

FROM node:8.10.0-alpine
EXPOSE 3000
COPY . /home/app
WORKDIR /home/app
RUN npm install
CMD ["npm", "start"]
docker compose.yml

# docker-compose.yml
version: "3"
services:
  app:
    build: .
    depends_on:
      - postgres
    ports:
      - "3000:3000"
      - "9229:9229"
  postgres:
    image: postgres:9.6.8-alpine
    expose:
      - 5432
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: user
      POSTGRES_DB: db

package.json

{
  "name": "sequelize-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "client": "cd ./client && npm start",
    "server": "nodemon app.js  --ignore client",
    "build": "echo 'hello build'",
    "start": "concurrently --kill-others   \"npm run server\" \"npm run client\""
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "async": "^2.6.1",
    "bcrypt": "^3.0.3",
    "body-parser": "^1.18.3",
    "concurrently": "^4.1.0",
    "cookie-parser": "^1.4.3",
    "cookie-session": "^2.0.0-beta.3",
    "cors": "^2.8.5",
    "crypto": "^1.0.1",
    "dotenv": "^6.2.0",
    "express": "^4.16.4",
    "express-flash": "0.0.2",
    "express-session": "^1.15.6",
    "jsonwebtoken": "^8.4.0",
    "morgan": "^1.9.1",
    "nodemailer": "^5.1.1",
    "nodemon": "^1.18.9",
    "passport": "^0.4.0",
    "passport-github": "^1.1.0",
    "passport-github2": "^0.1.11",
    "passport-jwt": "^4.0.0",
    "passport-local": "^1.0.0",
    "pg": "^7.8.0",
    "pg-hstore": "^2.3.2",
    "sequelize": "^4.42.0"
  }
}

我认为您需要将localhost:5000更改为docker compose.yml中的服务名称。在这种情况下,您需要在compose文件中设置在localhost:5000上运行的任何服务器。请记住,您的容器在Docker网络中运行,因此,它们无法在主机上访问您的localhost

在本例中,您可以看到我需要将PMA_HOST环境变量设置为db服务,而不是“普通主机”。在数据库配置中,在我的源代码中,我还将主机设置为相同的db服务,一切都很正常

版本:“3”

services:
  app:
    build: .
    ports:
      - 80:80
    depends_on:
      - db
  db:
    image: mariadb:10.0
    volumes:
      - db:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: 123
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - 8080:80
    environment:
      PMA_HOST: db
    depends_on:
      - db
volumes:
  db:
这是必要的,因为每次运行新容器时,它都会将不同的IP接入新的Docker网络。在这种情况下,我们总是需要检查这个新IP,并在代码中设置它。Docker通过让我们将新主机附加到一个简单且不可变的名称来解决这个问题,该名称在compose中是服务的名称

更新:网络模式方法 如果您已经在本地主机上运行了一个服务(例如:一个API服务器),并且您正在使用docker来创建一个新的服务,该服务将与该API(例如:一个web客户端UI)交互,但是由于某些原因,您不能或不想在docker compose.yml文件上设置API,您可以更改
网络模式
环境主机

在这种方法中,您必须将容器上的端口映射到主机上未使用的端口

因此,假设您在
localhost:80上运行一个API,并且在端口3000上的docker上运行一个节点服务器。如果在
localhost:3000
上没有运行任何程序,可以执行以下操作:

spa:
   user: ${COMPOSE_UID}:${COMPOSE_GID}
   image: node:10-slim
   working_dir: /home/node/app
   environment:
      - HOST=0.0.0.0
   ports:
      - 3000:3000
   volumes:
      - ./:/home/node/app
   command: bash -c 'yarn install && yarn run dev'
   network_mode: "host"

我改变了一些事情

Dockerfile

FROM node:8.10.0-alpine
EXPOSE 80:8080
COPY . /home/app
WORKDIR /home/app
RUN npm install
CMD ["npm", "start"]
docker-compose.yml setupProxy.js

const proxy = require('http-proxy-middleware');

module.exports = function(app) {
//   app.use(proxy('/auth/github', { target: 'http://localhost:3000/' }))
  app.use(proxy('/api/users/auth/github', { target: 'http://localhost:5000/' }))
  app.use(proxy('/api/users/', { target: 'http://localhost:5000/' }))
  app.use(proxy('/api/posts/', { target: 'http://localhost:5000/' }))
}
const proxy = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(proxy('/auth/github', { target: 'http://127.0.0.1:8080/' }))
  app.use(proxy('/api/users/auth/github', { target: 'http://127.0.0.1:8080/' }))
  app.use(proxy('/api/users/', { target: 'http://127.0.0.1:8080/', "secure": false }))
  app.use(proxy('/api/posts/', { target: 'http://127.0.0.1:8080/' }))
}

抱歉耽搁了,让我试试你的建议。我试着做了
端口:-“5000:5000”
它运行应用程序,但在localhost:5000上没有响应。无法访问该站点。当您执行“5000:5000”时,您正在将容器的5000映射到本地主机5000。您的代码在Docker网络中运行,因此它需要与容器IP(服务名称)通信,而不是与127.0.0.1(localhost)通信。映射端口只允许您通过主机访问容器,而不允许容器在Docker网络之外相互通信。当您的代码在容器中找到“localhost”时,它会将其转换为容器的127.0.0.1,而不是主机的127.0.0.1。因此,可能(我不确定),如果API位于公开端口3000的同一“app”服务中,并且您更改为,它将引用容器的localhost和公开的端口。尝试使用“docker组装--组装“强制重建映像。另外,如果你的Express应用程序是React up的一部分,为什么你不为Express应用程序单独提供一项服务,然后像我对phpMyAdmin和MariaDB所做的那样?在我看来,这是最好的方法,将每个东西都保存在各自的容器上。从容器到
http://localhost:5000/
go?是否应该在同一容器中运行第二个进程?它只处理来自express的api post请求。该应用程序在localhost:3000上运行,然后使用端口5000处理来自express的post和get请求。执行npm启动时,客户端和express都会启动。我将显示package.json