首页 > 解决方案 > 如何设置暴露的 docker 前端和非暴露的后端?

问题描述

我有一个简单的 docker 网络,里面有两个容器。前端的端口映射为 80:80,因此我可以通过浏览器中的 localhost 访问它。我的后端没有映射其端口(3000)。我希望我的前端可以在我的网络上访问,但不希望我的后端可以访问。

我遇到的问题是我无法从浏览器向我的前端发出请求。两个容器都在正确的网络上,并且可以在内部进行通信。

例如:在前端容器内使用 curl 提供来自后端的预期输出:

curl 10.5.0.4:3000/test

但是从网页调用 axios.get(10.5.0.4:3000/test)会导致404错误。

问题是 axios 请求来自浏览器,因此无法连接到 docker 网络吗?如果是这样,是否有不涉及使后端可在 docker 网络之外访问的解决方案?

为了清楚起见,这是我的 docker-compose 文件

services:
  backend:
    build: ./testbe
    image: testbe:dev
    networks:
      test_net:
        ipv4_address: 10.5.0.4

  frontend:
    build: ./testfe
    image: testfe:dev
    networks:
      test_net:
        ipv4_address: 10.5.0.5
    ports:
      - "80:80"


networks:
  test_net:
    driver: bridge
    driver_opts:
      com.docker.network.endable_ipv6: "false"
    ipam:
      driver: default
      config:
        - subnet: 10.5.0.0/5
          gateway: 10.5.0.1

标签: dockernetworkingdocker-compose

解决方案


您不应该使用容器的私有 IP 来调用它,而是调用它在网络上的名称。


推荐阅读