docker - 将多个容器副本连接到单个容器而不会发生端口冲突

标签 docker docker-compose port

我目前有两种类型的 Docker 容器:一个 redis 服务器和一个 Node.js 应用程序。只需其中一个,我就可以让他们很好地互动。 Redis 服务器监听默认端口 6379 上的连接。Node.js 应用程序使用以下方式进行连接

const redis_client = redis.createClient({
  socket: {
    host: 'redis-server', # name of the redis container in my docker-compose.yml
    port: 6379,
  }
});

并且在其 docker-compose.yml 定义中有

node-app:
  # ...other configs...
  ports:
    - "6379:6379"

这有效,一切都很好。

我现在正在尝试扩展此功能,以允许多个 Node.js 应用容器实例与一个 Redis 容器实例进行交互。我最初尝试添加

deploy:
  replicas: 2

到我的节点应用程序定义,但是在$ docker compose up -d上,这会抛出来自守护程序的错误响应:端口不可用:暴露端口 TCP 0.0.0.0:6379 -> 0.0.0.0:0: 监听 tcp 0.0.0.0:6379: 绑定(bind):每个套接字地址(协议(protocol)/网络地址/端口)通常只允许使用一次。

如何以一种可扩展的方式将多个容器附加到一个容器(即不仅仅是硬编码两个节点应用程序实例)?

最佳答案

为了创建在不同端口上运行但公开相同端口的同一服务的多个副本,请指定一系列端口号,如以下 docker-compose.yml 示例所示:

services:
  node-app:
...
    ports:
      - 6379-6381:5432
    deploy:
      replicas: 3
...

关于docker - 将多个容器副本连接到单个容器而不会发生端口冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74396097/

相关文章:

docker - CentOS7 : How to start the slapd service in a docker container?

docker - Apache Nutch 不公开其 API

docker - 服务发现如何与现代docker/docker-compose一起使用?

linux - CPU IO端口如何真正工作?

tomcat - Azure 端点不工作

docker 卷容器策略

docker - Docker在CI/CD中的作用?

docker - mongodb 连接被拒绝 docker-compose

Golang 与 docker 的连续工作流程

port - 在 Windows 上查找使用端口的进程的 PID