You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker中配置后端仅允许前端访问,禁止外部调用

配置方案:让后端仅对前端容器开放

一、先修正Docker Compose配置(核心)

你当前的docker-compose.yml里有格式错误,而且错误配置会导致后端端口暴露到主机,按下面修改:

services:
  server:
    container_name: server
    image: server
    build:
      context: ./server
      dockerfile: Dockerfile
    volumes: 
      - ./server:/server  # 和后端Dockerfile的WORKDIR /server对应,之前的/app路径不匹配
    # 删除原错误的expose配置,也不要加ports字段
    # 这样后端3000端口仅在Docker内部网络开放,外部完全无法直接访问

  client:
    container_name: commerce
    image: commerce
    build: 
      context: ./
      dockerfile: Dockerfile
    volumes: 
      - ./commerce:/app  # 和前端Dockerfile的WORKDIR /app对应
    ports:
      - 8080:80
    depends_on:
      - server

关键说明:

  • Docker Compose会自动给所有服务创建专属内部网络,同网络内的容器可以通过服务名(比如server)互相访问。
  • 不给server配置ports,后端的3000端口就不会映射到你的主机,Postman、浏览器直接访问localhost:3000会失败,只有前端容器能通过server:3000访问后端。

二、配置Nginx反向代理(解决跨域+隐藏后端地址)

前端代码直接写http://server:3000会触发跨域报错(浏览器会把server当成主机域名解析),需要让Nginx帮前端转发请求:

  1. 在前端项目根目录新建nginx.conf文件:
server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.html;

    # 处理Angular单页应用的路由跳转
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 所有/api开头的请求自动转发到后端
    location /api {
        proxy_pass http://server:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
  1. 修改前端Dockerfile,替换默认Nginx配置:
FROM node:lts-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
# 新增这行,复制自定义配置覆盖默认配置
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  1. 修改前端代码中的API请求地址:
    把原来的http://server:3000改成相对路径/api,示例:
// 原写法
this.http.get('http://server:3000/users').subscribe(...);
// 修改后
this.http.get('/api/users').subscribe(...);

三、验证配置是否生效

  1. 启动容器:在项目根目录执行docker-compose up --build
  2. 测试外部访问后端:用Postman或浏览器访问localhost:3000,应显示无法连接
  3. 测试前端访问后端:打开localhost:8080,操作前端触发API请求,能正常获取数据即为配置成功

额外提醒

  • Docker内部网络本身是隔离的,只要后端不配置ports映射到主机,外部就无法直接访问
  • Nginx反向代理不仅解决了跨域问题,还隐藏了后端真实地址,进一步提升安全性
  • depends_on仅保证前端容器在后端之后启动,若后端启动较慢,可自行添加等待脚本,简单场景下可暂时忽略

内容的提问来源于stack exchange,提问作者Nii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:01:01