假设我有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
对其"http://192.168.0.1:3098
进行API调用。
为使一切正常运行,我编写了以下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.
答案 0 :(得分:1)
实际上,您甚至不需要frontend
网络。如果将backend
网络连接到两个容器,则它们应该能够相互通信。就像同一网络上的两台计算机一样。
如果您不想从外部访问容器,只需不要将相应端口映射回您的主机系统即可。这样可以使他们隔离。
当前,您的api公开了端口3098
。如果您将其删除,但同时将网络连接到两个容器,则可以从3098
容器内部调用端口frontend
,而不能从外部调用端口。{p>
您甚至可以使用分配的容器名称进行内部通信,如下所示:
http://testapi:3098/...
我希望有帮助。