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

无法通过Traefik Docker连接第二个MongoDB容器求助

问题分析与解决方案

核心问题

你的mongo2容器无法连接,根源是Traefik路由配置错误:

  • mongo2的路由标签里,traefik.tcp.routers.mongo2.service=mongo 错误指向了第一个mongo容器的服务,导致所有到domain2.com的请求都被转发到mongoDB容器,而非mongoDB2。
  • 新增mongo2入口点启动失败是因为Traefik不允许同一端口被多个entrypoint绑定,这完全没必要,复用已有的mongo入口点即可实现同一端口多域名转发。

修正后的完整配置

version: "3.3"

services:

  traefik:
    image: "traefik:v2.10"
    container_name: "traefik"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.mongo.address=:27017"
      - "--certificatesresolvers.le.acme.tlschallenge=true"
      - "--certificatesresolvers.le.acme.email=myemail@email.com"
      - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
    ports:
      - "443:443"
      - "8080:8080"
      - "27017:27017"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - "traefik"

  mongo:
    image: "mongo:4.4-bionic"
    restart: "always"
    container_name: "mongoDB"
    environment:
      - "MONGO_INITDB_ROOT_USERNAME=admin"
      - "MONGO_INITDB_ROOT_PASSWORD=secret"
    volumes:
      - "volDBts:/data/db"
    labels:
      - "traefik.enable=true"
      - "traefik.tcp.routers.mongo.rule=HostSNI(`domain1.com`)"
      - "traefik.tcp.routers.mongo.entrypoints=mongo"
      - "traefik.tcp.routers.mongo.service=mongo"
      - "traefik.tcp.services.mongo.loadbalancer.server.port=27017"
      - "traefik.tcp.routers.mongo.tls.domains[0].main=domain1.com"
    networks:
      - "traefik"

  mongo2:
    image: "mongo:4.4-bionic"
    restart: "always"
    container_name: "mongoDB2"
    environment:
      - "MONGO_INITDB_ROOT_USERNAME=admin"
      - "MONGO_INITDB_ROOT_PASSWORD=secret"
    volumes:
      - "volDBts2:/data/db"
    labels:
      - "traefik.enable=true"
      - "traefik.tcp.routers.mongo2.rule=HostSNI(`domain2.com`)"
      - "traefik.tcp.routers.mongo2.entrypoints=mongo"  # 复用同一个入口点
      - "traefik.tcp.routers.mongo2.service=mongo2"     # 修正为指向自身服务
      - "traefik.tcp.services.mongo2.loadbalancer.server.port=27017"
      - "traefik.tcp.routers.mongo2.tls.domains[0].main=domain2.com"
    networks:
      - "traefik"
    

volumes:
  volDBts:
  volDBts2:

networks:
  traefik:
    external: true

关键修改点

对mongo2容器的Traefik标签做了两处修正:

  1. 将traefik.tcp.routers.mongo2.service=mongo 改为 traefik.tcp.routers.mongo2.service=mongo2,确保路由指向正确的服务
  2. 保留traefik.tcp.routers.mongo2.entrypoints=mongo,复用27017端口的入口点

验证步骤

  1. 停止并移除现有容器:docker-compose down
  2. 启动新配置:docker-compose up -d
  3. 查看Traefik dashboard(http://服务器IP:8080),确认两个TCP路由mongo和mongo2均已正常加载
  4. 使用Mongo Compass重新测试两个连接字符串,此时domain2.com应该能正常连接到mongoDB2容器

内容的提问来源于stack exchange,提问作者Florentino Daniel Acosta Nava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:33:26