![](/img/trans.png)
[英]How could I create connection between two services in docker-compose so that they can ping each other?
[英]How to make docker-compose services accesible with each other?
我正在尝试使前端应用程序可以访问外部。 它依赖于其他几个模块,用作服务/后端。 其他服务也依赖于 Kafka 和 OpenLink Virtuoso(数据库)之类的东西。
我怎样才能让所有这些都可以相互访问,我应该如何将我的前端暴露给外部互联网? 我是否还应该删除代码中的任何“localhost/port”,并将其替换为服务名称? 我是否还应该将代码中的每个端口都替换为 docker 的等效端口?
这是我的 docker-compose.yml 文件的摘录。
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
frontend:
build:
context: ./Frontend
dockerfile: ./Dockerfile
image: "jcpbr/node-frontend-app"
ports:
- "3000:3000"
# Should I use links to connect to every module the frontend access and for the other modules as well?
links:
- "auth:auth"
auth:
build:
context: ./Auth
dockerfile: ./Dockerfile
image: "jcpbr/node-auth-app"
ports:
- "3003:3003"
(...)
我怎样才能使所有 [我的服务] 都可以相互访问?
绝对什么都不做。 删除过时的links:
阻止你。 Compose 会自动创建一个名为default
的网络,您可以使用该网络在容器之间进行通信,并且它们可以使用其他 Compose 服务名称作为主机名; 例如,您的auth
容器可以连接到kafka:9092
。 另请参阅 Docker 文档中的 Compose 网络。
(其他一些设置将提倡手动创建 Compose networks:
并覆盖container_name:
,但这不是必需的。为了简单起见,我会删除这些行。)
我应该如何将我的前端暴露给外部互联网?
这就是ports: ['3000:3000']
行所做的。 任何可以通过端口 3000(第一个端口号)访问您的主机系统的人都可以访问frontend
容器。 就外部调用者而言,他们不知道事情是否在 Docker 中运行,只是您的主机在端口 3000 上运行 HTTP 服务器。
设置反向代理,可能基于 Nginx,稍微复杂一些,但解决了从浏览器应用程序到后端容器通信的一些问题。
我还应该删除代码中的任何“localhost/port”吗?
是的,一点没错。
...并将其替换为服务名称? 每个端口?
不,因为这些设置在您的非容器开发环境中将不正确,并且如果您将生产部署到云环境,则可能再次不正确。
这里最简单的正确答案是使用环境变量。 在 Node 代码中,您可以尝试
const kafkaHost = process.env.KAFKA_HOST || 'localhost';
const kafkaPort = process.env.KAFKA_PORT || '9092';
如果您在没有设置这些环境变量的情况下在本地运行它,您将获得通常正确的开发人员默认设置。 但是在基于 Docker 的设置中,您可以设置这些环境变量
services:
kafka:
image: confluentinc/cp-kafka:latest
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 # must match the Docker service name
app:
build: .
environment:
KAFKA_HOST: kafka
# default KAFKA_PORT is still correct
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.