首页 > 解决方案 > 使用 docker-compose 的内部和外部网络?

问题描述

假设我有 2 个 docker 容器:(A)shinyapptest是一个前端,需要与 (B) 通信testapi并且可以被外界访问。

为此,我backend通过运行以下命令创建了一个网络:

docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 backend

然后shinyapptest对其 API 调用"http://192.168.0.1:3098.

为了让一切正常运行,我写了以下内容docker-compose

version: '3.7'
services:
    shinyapptest:
      container_name: testshiny
      image: testshiny
      restart: unless-stopped
      networks:
            - frontend
            - backend
      ports:
          - 80:3838
    testapi:
      container_name: testapi
      image: testapi
      restart: unless-stopped
      networks:
            - backend
      ports:
          - 3098:3098
networks:
  backend:
    external:
      name: backend
  frontend:
    external:
      name: frontend

这是正确的吗?基本上,我希望(A)可以访问(B)并且外部世界可以访问(A)而不是(B)。如果这是正确的,我应该如何创建frontend网络?现在,如果我尝试运行,docker-compose up我会收到此错误,因为网络不存在:

$ docker-compose up
ERROR: Network frontend declared as external, but could not be found. Please create the network manually using `docker network create frontend` and try again.

标签: dockerdocker-compose

解决方案


其实你甚至不需要frontend网络。如果您将backend网络连接到两个容器,它们应该能够相互通信。就像同一网络上的两台计算机一样。

如果您不希望从外部访问容器,只需不要将相应的端口映射回您的主机系统。这将使他们保持孤立。

目前您的 api 已3098暴露端口。如果您删除它,但将网络连接到两个容器,您将能够3098从容器内部调用端口frontend,但不能从外部调用。

您甚至可以使用分配的容器名称进行内部通信,如下所示:

http://testapi:3098/...

我希望这会有所帮助。


推荐阅读