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

问题描述 投票:0回答:2

我目前有两种类型的 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
上,这会抛出
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:6379 -> 0.0.0.0:0: listen tcp 0.0.0.0:6379: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

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

docker docker-compose port
2个回答
5
投票

为了创建在不同端口上运行但公开相同端口的同一服务的多个副本,请指定一系列端口号,如以下

docker-compose.yml
示例所示:

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

0
投票

我想你可能正在寻找https://docs.docker.com/compose/compose-file/deploy/#endpoint_mode

services:
  frontend:
    image: example/webapp
    ports:
      - "8080:80"
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip

Endpoint有两种模式,也可以选择

dnsrr
(DNS Round-Robin),让容器有独立的IP,
vip
让客户端提交到同一个IP,容器共享一个虚拟专用网络

无论哪种方式,这都是避免

Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:6379 -> 0.0.0.0:0: listen tcp 0.0.0.0:6379: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
的方法。

请注意,您需要使用

docker swarm
来处理它,尝试

docker swarm init
docker stack deploy --compose-file docker-compose.yml [stack_name]

这将允许运行多个副本并且不会与端口冲突,对于运行多个不侦听端口的 docker compose 副本,您可以在 compose 定义中使用

scale: [n]
参数。

© www.soinside.com 2019 - 2024. All rights reserved.