首页 > 解决方案 > 如何只允许从 docker 容器发出请求到特定的 url?

问题描述

我们有什么


  1. 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;
        }
    }

}

  1. 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的传出请求?

标签: node.jsdockernginxdocker-compose

解决方案


推荐阅读