我目前有两种类型的 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-compose.yml
示例所示:
services:
node-app:
...
ports:
- 6379-6381:5432
deploy:
replicas: 3
...
我想你可能正在寻找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]
参数。