node.js - 如何只允许从 docker 容器发出请求到特定的 url?
问题描述
我们有什么
- images:nginx - 使用 nginx 实现的代理 docker 容器:
FROM nginx:1.21-alpine
用
docker build -f ./docker/dev/nginx/Dockerfile -t "dev/images:nginx" .
它的nginx配置是:
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name editor.localhost;
location / {
proxy_pass http://nodejs:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
}
}
}
- images:nodejs - 主服务器在 node.js 上的 docker 容器:
FROM node:16.10-alpine
WORKDIR /usr/src/app
CMD npm run dev
用
docker build -f ./docker/dev/nodejs/Dockerfile -t "dev/images:nodejs" .
最后,我运行它
docker-compose -f "dev.yml" --compatibility --project-name "dev_project_name" up -d --remove-orphans
内容dev.yml
如下:
version: "2.1"
services:
nginx:
image: dev/images:nginx
volumes:
- ./docker/dev/nginx/nginx.conf:/etc/nginx/nginx.conf
ports:
- 80:80
- 443:443
depends_on:
- nodejs
networks:
internal:
external:
nodejs:
image: dev/images:nodejs
restart: "no"
environment:
JWT_SECRET: ${JWT_SECRET}
NEXTAUTH_URL: ${BASE_URL}
volumes:
- type: bind
source: "${PATH_TO_NEXTJS_APP}"
target: /usr/src/app
read_only: false
networks:
internal:
networks:
external:
driver: bridge
internal: false
internal:
driver: bridge
internal: true
现在的情况
一切正常,但是......我们需要我们的 nodejs 服务器向 docker 主机(我们所有的容器都在其中运行)之外的某个特定远程主机(通过 url)发出请求。根据上面的配置,nodejs 服务器根本没有直接访问 docker 主机之外的权限,因为它没有连接到外部网络,但是 nginx 可以。
我们需要的
a)那么,有没有办法允许来自nodejs服务器的外部请求通过nginx代理而不包括nodejs服务器的容器到外部网络?
或者
b) 如果没有这种方式,那么如果我们将nodejs容器包含到外部网络,那么如何将nodejs服务器的容器的交互限制为仅对特定远程URL的传出请求?
解决方案
推荐阅读
- python - 通过示例了解 LSTM
- php - 让孙子们用 Laravel eloquent 建模
- reactjs - 如何在 React Native + TypeScript 中从孙子更改祖父组件的状态?
- python - 如何让不和谐的机器人获取昵称而不是用户名?
- julia - 为什么加号运算符在 Julia 中被矢量化,而不是除法运算符?
- git-merge - 从两个存储库之间的合并创建一个 Yocto 层
- java - Java:如何从保存在路径中的多个文件夹中提取最大名称到文件夹名称都是数字的变量中?
- matlab - 如何改进这两个功能以减少给出结果的时间?
- javascript - 移动:在父 div 内水平滚动并在一侧或两侧(左、右)添加外侧渐变
- java - 如何在对话框顶部显示展示视图?