You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置deploy.replicas>1时Docker Compose报端口已分配错误求助

问题解决:WSL中Docker Compose多副本端口冲突与内置负载均衡实现

问题原因

你当前用docker compose up运行的是单机Compose模式,该模式不支持deploy配置里的endpoint_mode: vip和Swarm集群级别的负载均衡能力。官网示例的配置是针对Docker Swarm集群模式的,单机模式下会忽略VIP相关逻辑,直接尝试给每个副本容器绑定宿主机的8080端口,导致端口占用冲突。

解决方案:使用Docker Swarm模式实现内置VIP负载均衡

这是Docker官方推荐的实现内置负载均衡的方式,单节点也可以运行Swarm:

  1. 初始化Swarm集群(单节点即可):
docker swarm init

如果提示需要指定广告地址,可添加--advertise-addr参数,替换为你的WSL虚拟机IP:

docker swarm init --advertise-addr 192.168.1.100
  1. 用Swarm栈部署你的服务:
docker stack deploy -c docker-compose.yml my-frontend-stack
  1. 验证服务状态:
docker stack services my-frontend-stack

此时访问http://localhost:8080,Docker Swarm会自动通过VIP将请求负载均衡到两个容器。

  1. 停止服务(可选):
docker stack rm my-frontend-stack

单机Compose模式的替代方案(无Swarm)

如果不想启用Swarm,可放弃直接绑定宿主机端口,改用Compose内部网络+Docker生态的反向代理实现负载均衡:

修改docker-compose.yml如下:

version: '3.8'

services:
  frontend:
    image: yeasy/simple-web:latest
    deploy:
      mode: replicated
      replicas: 2
    networks:
      - web-net

  traefik:
    image: traefik:v2.10
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:8080"
    ports:
      - "8080:8080"
      - "8081:8080"  # Traefik管理界面端口
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - web-net

networks:
  web-net:
    driver: bridge

运行docker compose up后,访问http://localhost:8080,Traefik会自动负载均衡到两个前端容器。

内容的提问来源于stack exchange,提问作者user22348401

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:30:14