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