如何在阻止端口时仅允许通过特定URL访问MERN项目中的Docker容器?

如何在阻止端口时仅允许通过特定URL访问MERN项目中的Docker容器?,docker,docker-compose,Docker,Docker Compose,我和Docker有一个MERN项目。发展环境良好;这是我遇到麻烦的生产 这是我想要的行为: 发展中: 这是容器的状态: Nodemon在node express映像(来自节点:alpine)容器中运行,端口9000对主机开放。(这是后端/api) MongoDB根据官方图像在自己的容器中运行,27017端口对主机开放。(这是数据库) React在其映像(来自节点:alpine)容器中运行,并向主机打开端口3000。(这是前端) 生产中: 这是容器的状态: 节点在Node expre

我和Docker有一个MERN项目。发展环境良好;这是我遇到麻烦的生产

这是我想要的行为:

  • 发展中:
    • 这是容器的状态:
      • Nodemon在node express映像(来自节点:alpine)容器中运行,端口9000对主机开放。(这是后端/api)
      • MongoDB根据官方图像在自己的容器中运行,27017端口对主机开放。(这是数据库)
      • React在其映像(来自节点:alpine)容器中运行,并向主机打开端口3000。(这是前端)
  • 生产中:
    • 这是容器的状态:
      • 节点在Node express映像(来自节点:alpine)容器中运行,没有向主机打开的端口
      • MongoDB运行在基于官方映像的自己的容器中,没有向主机开放的端口
      • React在其映像(来自nginx:alpine)容器中运行,端口80对主机开放
后端/api引用使用容器名称的数据库,前端/react容器引用使用容器名称的后端

我将
proxy:localhost:9000
放在reactpackage.json文件中。在生产中,我将以下内容放入nginx.conf文件中

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri /index.html;
}
location /api {
    proxy_pass http://localhost:9000;
}
在生产docker-compose.yml文件中,我删除了docker-compose.yml文件中存在的
expose:“9000”
端口:“9000:9000”
。我运行
docker-compose-f docker-compose.yml-f docker-compose.production.yml up


我的问题是,出于某种原因,端口“localhost:9000”和“localhost:27017”仍然在生产中公开。我希望所有的路由,除了“example.com/api”,都通过React。只有“example.com/api”必须直接进入后端

另外,我不确定这是否相关,但是否有一种方法可以确保“example.com/api”进入后端而不必执行
require(“express”)()。get('/api'…
?就像在中一样,只执行
require(“express”)()。get('/'…
默认情况下会调用“example.com/api”

注意:为了将容器连接在一起,我使用了网络,而不是链接。后端连接到React和MongoDB,而React和MongoDB互不连接


这是我的docker-compose.yml:

version: "3.7"
services:
##############################
# Back-End Container
##############################
  backend:
    container_name: backend
    build:
      context: ./backend/
      target: development
    restart: always
    expose:
      - "9000"
    environment:
      - MONGO_URI=mongodb://db:27017/db
      - PORT=9000
      - NODE_ENV=development
      - DEBUG=app
      - JWT_SECRET=secretsecret
      - JWT_EXPIRY=30d
    ports:
      - "9000:9000"
      - "9229:9229"
    volumes:
      - "./backend/:/home/node/app/"
      - /home/node/app/node_modules/
    depends_on:
      - db
    networks:
      - client
      - server
##############################
# Front-End Container
##############################
  frontend:
    container_name: frontend
    build:
      context: ./frontend/
      target: development
    restart: always
    expose:
      - "3000"
      - "35729"
    environment: 
      - NODE_ENV=development
      - REACT_APP_PORT=3000
      - CHOKIDAR_USEPOLLING=true
    ports:
      - "3000:3000"
      - "35729:35729"
    volumes:
      - "./frontend/:/home/node/app/"
      - /home/node/app/node_modules/
    networks:
      - client
##############################
# MongoDB Container
##############################
  db:
    container_name: db
    image: mongo
    restart: always
    volumes:
      - dbdata:/data/db/
    ports:
      - "27017:27017"
    networks:
      - server
networks:
  client:
  server:
volumes:
  dbdata:
这是我的.env文件

MONGO_URI=db:27017/somedb?authSource=admin
PORT=9000
MONGO_PORT=27017
MONGO_INITDB_ROOT_USERNAME=mongoadmin
MONGO_INITDB_ROOT_PASSWORD=secret
MONGO_INITDB_DATABASE=somedb
NODE_ENV=production
这是我的docker.compose.production.yml:

version: "3.7"
services:
##############################
# Back-End Container
##############################
  backend:
    container_name: backend
    init: true
    environment:
      - MONGO_URI=mongodb://${MONGO_INITDB_ROOT_USERNAME}:${MONGO_INITDB_ROOT_PASSWORD}@${MONGO_URI}
      - PORT=${PORT}
      - NODE_ENV=${NODE_ENV}
    build:
      context: ./backend/
      target: production
    restart: always
    depends_on:
      - db
    networks:
      - client
      - server
##############################
# Front-End Container
##############################
  frontend:
    container_name: frontend
    build:
      context: ./frontend/
      target: production
    restart: always
    environment:
      - NODE_ENV=${NODE_ENV}
    expose:
      - "80"
    ports:
      - "80:80"
    networks:
      - client
##############################
# MongoDB Container
##############################
  db:
    container_name: db
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
    volumes:
      - dbdata:/data/db/
    ports:
      - "27017:27017"
    networks: 
      - server
networks:
  client:
  server:
volumes:
  dbdata:
DockerFile只有FROM、WORKDIR、RUN、COPY和CMD

我运行docker-compose-f docker-compose.yml-f docker-compose.production.yml up

为什么我要包括开发docker-compose.yml?我所要做的就是删除该部分并直接运行docker-compose.production.yml。不需要进行任何重写

解决方案是运行:

docker-compose-f docker-compose.production.yml up

对于那个些寻找代理为什么并没有导致后端根的人来说,这是因为

我运行docker-compose-f docker-compose.yml-f docker-compose.production.yml up

为什么我要包括开发docker-compose.yml?我所要做的就是删除该部分并直接运行docker-compose.production.yml。不需要进行任何重写

解决方案是运行:

docker-compose-f docker-compose.production.yml up


对于那些寻找为什么代理没有导致后端根目录的人来说,原因是。

您是否尝试交换两个位置块的位置。您是否可以包含
docker compose.yml
文件(任一版本)在这个问题上?我有点怀疑
localhost:9000
地址是否有效。添加了docker-compose.yml、.env和docker-compose.production.yml文件@DavidMaze。您是否尝试交换两个位置块的位置。是否可以包含
docker-compose.yml
文件(任一版本)在这个问题上?我有点怀疑
localhost:9000
地址是否有效。添加了docker-compose.yml、.env和docker-compose.production.yml文件@DavidMaze。