docker - 使用 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.
解决方案
其实你甚至不需要frontend
网络。如果您将backend
网络连接到两个容器,它们应该能够相互通信。就像同一网络上的两台计算机一样。
如果您不希望从外部访问容器,只需不要将相应的端口映射回您的主机系统。这将使他们保持孤立。
目前您的 api 已3098
暴露端口。如果您删除它,但将网络连接到两个容器,您将能够3098
从容器内部调用端口frontend
,但不能从外部调用。
您甚至可以使用分配的容器名称进行内部通信,如下所示:
http://testapi:3098/...
我希望这会有所帮助。
推荐阅读
- c++ - 如何在不使用 to_string 或逐个提取位的情况下提取大于 unsigned long long 的位集子集?
- python - 使用 Python 字典编写 Ansible 剧本
- c++ - 根据继承更改对象类型
- javascript - “无法设置未定义的属性‘颜色’”
- php - LARAVEL:重新排队工作是个坏主意吗?
- email - 转发电子邮件保留收件人(INDY 和 Delphi)
- reactjs - 更新自身内部可观察到的 mobx 存储会导致“无法读取
未定义的' - reactjs - 反应:尝试从 MovieDB API 获取资源时出现 NetworkError
- microsoft-graph-api - 检索计划中的任务的权限
- reactjs - 为什么渲染延迟